Anfänger braucht Hilfe bei seinem Programm
-
Hi @
Haben in der Uni mit C angefangen, habe die ersten Aufgaben gut hin bekommen. In der folgenden Aufgabe geht es darum Dezimalzahlen in Binärzahlen umzuwandeln.
Mein bisheriges Programm:
#include <stdio.h>
#include <string.h>
#include <math.h>void main (void)
{
char binzahl[132];
int intzahl;
void int2bin(char *binzahl, int intzahlx);printf("Zahl eingeben :");
scanf("%d", &intzahl);printf("\n\n");
int2bin(binzahl, intzahl);printf("\n\n");
printf("Dezimal: %d, Binaer: %s\n", intzahl, binzahl);
printf("\n\n");
}void int2bin(char *binzahl, int intzahlx)
{
int rest, divisor, i;
divisor = 2;
i = 0;while(intzahlx > 0)
{
rest = intzahlx % divisor;
printf("%d \t : %d = %d \t Rest : %d", intzahlx, divisor, intzahlx / divisor, rest);intzahlx = intzahlx / divisor;
printf("\n");if(rest = 0)
{
binzahl = '0';
}else
{
binzahl = '1';
}i++;
binzahl = '\0';
}
}An einem kleinen Bsp möchte zeigen wie mein Ausgabefenster aussieht. Nehmen wir als Beispiel die Zahl "14".
Bsp.: 14 : 2 = 7 Rest = 0
7 : 2 = 3 Rest = 1
3 : 2 = 1 Rest = 1
1 : 2 = 0 Rest = 1Dezimal: 14, Binaer: 0111
Die Dezimal Zahl von 14 ist im Binär Code aber "1110". Das heißt ich muss meine Binär Ausgabe in genau anderer Reihenfolge ausgeben.
Wie kann ich das anstellen
-
hier mein vorschlag (ich hab hier den ganzen code. für ausgabe s.u.
ka, ob die funktionsköpfe richtig sind ^^ aber das programm ist 100% richtig/* Eingabe einer Zahl zwischen 1 und 99 und Umrechnung in seinen Dualwert
und Ausgabe in Form einer Zeichenkette */#include <stdio.h>
#include <string.h>char *deziDual (int); //Deklaration der Funktionen
void rev_str(char *);
int main () {
int fehler, iZahl;
char *c;printf ("Bitte geben Sie ein Zahl zwischen 1 und 99 ein: ");
do {
scanf ("%d", &iZahl);
if (iZahl >= 1 && iZahl <= 99){ //Bedingung...kann man löschen
fehler=1;
}
else{
printf ("Zahl liegt nicht zwischen 1 und 99!\n");
}
} while(fehler!=1);c = deziDual(iZahl);
rev_str(c); //String umgedreht
printf("Ausgabe: %s", c);return 0;
}/* Umrechnung in den Dualwert
Aufruf: deziDual (int Zahl)
Parameter: int iZ: Zahl
Rückgabetyp:
int Zahl*/
char * deziDual (int zahl){
int i = 0;
static char cArray[8];while(zahl)
{
printf("%u : 2 = %u Rest %u\n", zahl, zahl/2, zahl%2);
cArray[i] = '0' + zahl%2;
cArray[++i] = '\0';
zahl /=2;
}
return cArray;
}/* Ausgabe des umgedrehten Strings
Aufruf: void rev_str (char*)
Parameter: char c: Kette
Rückgabetyp:
char Kette*/
void rev_str(char *str){
char temp;
char *end = str + strlen(str) -1;
while(str < end){
temp = *end;
*end = *str;
*str = temp;
str++;
end--;
}
}
-
@ matic: Keine Crossposts bitte
@ all: In Zukunft bitte die [cpp]-Tags verwenden, dann ist der Code auch lesbar
-
In etwa so:
char * invert_char(char * bla) { int i,j; char *array; for(i = 0; bla[i] !='\0';i++); array = malloc(sizeof(char) *i+1); for (j = i ; j >=0; j--) { array[i-j] = bla[j]; } array[i+1] = '\0'; return array; }
somit kannst du die Reihenfolge deines Arrays ändern!!!!!!
-
dat komplette program muss man umkremplen:
1. warum übergibtst du der funktion bin2int die zahl in binär und in int-form? wenn die beiden nun nicht dieselbe zahl sind??
2. die funktion muss vorher deklariert werden.
3. der modulooperator gibt dir direkt den rest an also lass die schleife wech denn
4. das mit der binärdarstellung macht man anders:#include <stdio.h> #include <stdlib.h> #include <string.h> char* int2bin(int ivar) { char* bin=0; bool write=false; bin=(char*)malloc(sizeof(char)*33); bin[0]=0;//damit man nachher alles per strncat anhängen kann. for(int i=(sizeof(int)*8)-1;i>=0;i--) { if (ivar&1<<i) {write=true;strncat(bin,"1",1);} else if (true==write) strncat(bin,"0",1); }; if (0==ivar) strncat(bin,"0",1); return bin; }; int main() { char* bin=0; int ivar=0;//kannst natürlich auch einlesen for (int i=0;i<3;i++) { ivar+=33*(i+1); bin=int2bin(ivar); printf("Binaerwert: %s\n",bin); printf("Dezimalwert: %d\n\n",ivar); free(bin); }; system("pause"); };
muss noch schnell wech aber ich werds dir nachher n bisschen ausführen
-
tja, ich habs so gemacht und es funktioniert, ihr besserwisser
-
bill bones schrieb:
#include <stdio.h> #include <stdlib.h> #include <string.h> // #include <stdbool.h> vergessen char* int2bin(int ivar) { char* bin=0; // NULL bool write=false; bin=(char*)malloc(sizeof(char)*33); /* - malloc wird nicht gecastet - sizeof(char) ist immer 1 - Besser als 33 ist sizeof(int)*CHAR_BIT+1 (#include <limits.h>) */ bin[0]=0;//damit man nachher alles per strncat anhängen kann. // strncat() ist hier mehr als nur übertrieben for(int i=(sizeof(int)*8)-1;i>=0;i--) // siehe oben, CHAR_BIT { // unnötig umständlich geschrieben, total inkonsistente Einrückung // unnötige boolsche Variable if (ivar&1<<i) {write=true;strncat(bin,"1",1);} else if (true==write) strncat(bin,"0",1); }; if (0==ivar) strncat(bin,"0",1); return bin; };
-
manmal hat man ja 'itoa'
oder das: http://www.jbox.dk/sanos/source/lib/xtoa.c.html
-
@ tactX: ich verwende die Dev C/C++ IDE deshalb (wobei ich nichtmal weiss mit ob der code mit nem C oder C++ compiler compiliert wird, aber der cast z.b. ist dort notwendig) deshalb kein stdbool.h und "0" statt "NULL". "sizeof(char)" war übrigens nur zur besseren verständlichkeit. hab nich mit soviel krititk grechnet ;), einzig beim letzten kommentar muss ich dir zustimmen: hab den code z.t. aus nem C++ code und hab ihn auf die schnelle noch etwas umgeschrieben/teile kopiert usw. naja gut strncat ist hier möglicherweise etwas zu viel des guten
wollts ihm halt verständlich machen.
@ matic: ich weiss jetzt nich ob dir dinge wie malloc(), zeiger oder bitoperationen bekannt sind. wenn du damit jetzt nix anfangen kannst, kannst du dich ja nochmal melden.
-
bill bones schrieb:
hab nich mit soviel krititk grechnet
War nicht böse gemeint. Aber wenn du mit so ultimativen Sätzen wie
das mit der binärdarstellung macht man anders
kommst, erwarte ich zumindest kein strncat
PS: Und hör auf C mit C++ zu compilieren. C Code -> C Compiler.
-
Sorry hab ich vergessen zu erwähnen.
Die "strlen", "strcpy" Funktionen dürfen nicht verwendet werden.
-
Diese Funktionen kannst du dir auch selber schreiben, wenn du die vorgefertigten Funktionen nicht verwenden darfst. (die C-Stringverarbeitung basiert darauf, daß ein "String" von der Endemarke '\0' abgeschlossen wird)
int my_strlen(char* str) { int len=0; while(str[len]!='\0') ++len; return len; } void my_strcpy(char* tgt,const char* src) { while(*src!='\0') { *tgt=*src; ++tgt;++src; } }
-
int my_strlen(char *s) { char *p = s; while (*p) p++; return p-s; } void my_strcpy(char *to, const char *from) { while (*to++ = *from++); }