Dual Dezimal Umwandlung C-Programm
-
als erster müssten wir mal wissen in welcher form deine dualzahl vorliegt...
ist das ein char-array oder irgenwas anderes?
-
Wandiii schrieb:
aber selbst das mit dem addieren geht ja net weil der dann wieder 1+1= 2 draus macht
Doch, es geht. Wenn Du für jede Stelle so addierst:
erg[i] = (a[i] + b[i] + uebertrag) % 2; uebertrag = (a[i] + b[i]) / 2;
Das ganze in einer Schleife vom niedrigstwertigen zum höchstwertigen - fertig.
-
deadlef ich glaube das wars, werds dann gleich mal in mein progi einbauen, aber denke genau so funzt das
-
hab scho wieder ein neues problem
und zwar:
ich würde gern eine dualzahl einlesen (oder auch normal zahl is egal)
das ganze soll in ein array gehen und zwar dass das bit 1 der dualzahl ( oder halt die erste ziffer) auf index 0 des arrays kommt das zweite bit auf index 1....leider geht das mit scanf irgendwie net, gibts da irgend einen befehl wie ich c sagen kann, les bit 1 ein und speicher auf index 0.
das ganze soll aber jetzt net so sein, dass der unser erst bit 1 eingeben muss dann enter drücken, dann bit 2... sondern der gibt normal seine dualzahl ein und nach enter wird pro index ein bit gespeichert.
ich weiss, dass ganze kann man auch durch zahlenschieberrei lösen, aber ich will nur wissen obs da gleich nen befehl dafür gibt.
-
Hallo Wandiii,
hast du das programm schon zum funktionieren gebracht?
Könntest du bitte den gesamten quellcode posten?
Oder schicken : fokkus@gmx.de
Wäre nett von dir, denn ich bräuchte das programm auch.
Gruß Fokkus
-
noch net so ganz, hab mir erst mal einen tag auszeit genommen, da ich das ganze irgendwie von der falschen seite angegangen bin
-
Wandiii schrieb:
1111 : 1010 = 1 Rest 5
1 : 1010 = 0 Rest 1Bist du sicher, dass die Ausgabe ganz genau so aussehen soll?
Stand das so in der Aufgabenstellung?mein prob ist nun, dass es in c keinen binären variablentypen gibt
Falsch. Es gibt z.B. int, long, short, char. Sind alles 100 prozentig binäre Datentypen. Es gibt allerdings keine dezimalen Datentypen in C.
Da hast du irgendwas falsch verstanden.meine möglichkeit wäre mit dem 2 er komplement also mit 0111 zu addieren
also
1111
+0111Wenn du eine Zahl mit ihrem 2er Komplement addierst, kommt immer 0 raus.
Das 2er Komplement von 0111 ist 1001.ich soll ein programm schreiben, welches dual in dezimal und dezimal in dual wandeln kann.
Die beste Lösung dafür wäre den String, der eingegeben wurde, zuerst in ein int umzuwandeln und dieses int dann wieder in einen String umzurechenen, der eine Dual- bzw. Dezimalzahl enthält.
Für das Umwandeln einer dezimalen Zahl in ein int, gibt es eine Funktion in C.
scanf("%d",&x) bzw. sscanf(string, "%d", %x) oder auch x=strtol(string, 0, 10)wobei string ein char array ist, das die dezimale Zahl enthält.
Für eine binäre Zahl geht das genau so mit x=strtol(string, 0, 2).Musst du die Umwandlung in ein int auch manuell machen oder nur die anschliessende Umrechnung in eine Dual bzw Dezimalzahl?
Wenn du beides manuell umrechnen musst ist das auch kein Problem.
Hier mal ein Beispiel. Fehlerprüfung und Ausgabe des Rechneweges fehlen aber noch.#include <stdio.h> int str2int(char str[], int basis) { int x=0; int i=0; while(str[i]!=0) { x*=basis; x+=str[i]-'0'; i++; } return x; } int int2str(char str[], int zahl, int basis) { int i=0; int j; do { str[i]=zahl%basis+'0'; zahl/=basis; i++; } while(zahl>0); str[i]='\0'; for(j=0, i--; i>j; i--, j++) { char temp=str[i]; str[i]=str[j]; str[j]=temp; } } int main() { char str[100]; char str2[100]; int wahl,zahl; printf("Umrechen von: \n"); printf("1. Dezimal -> Dual \n"); printf("2. Dual -> Dezimal \n"); scanf("%d", &wahl); printf("Zahl eingeben: "); fflush(stdin); gets(str); if(wahl==1) { zahl=str2int(str, 10); int2str(str2, zahl, 2); } else { zahl=str2int(str, 2); int2str(str2, zahl, 10); } puts(str2); }
-
Erstmal danke Zoid, werde das ganze dann gleich mal testen:
Die Ausgabe soll genau so ausschauen (also das ist der Bildschirm):
1111 : 1010 = 1 Rest 5
1 : 1010 = 0 Rest 1Dual 1111 entspricht Dezimal 15.
Von Dez auf Dual schaut bei mir die Ausgabe so aus:
150 : 2 = 75 Rest 0
75 : 2 = 37 Rest 1
37 : 2 = ........Dezimal 150 entspricht Dual .....01
Der Rechenweg soll auf deutsch ersichtlich sein, dass ist ja auch das, wieso ich das net auf die einfache Art hinbekomm, weil das halt alles auf den Bildschirm kommt.
Das mit dem 2er-Komplement war so gemeint: hab ich die zahl 1111 und teil die durch 1010 muss ich von 1010 das 2er-Komplement bilden und das zu 1111 addieren, gibt das nen übertrag kommt als ergebnis ne 1 ansonsten alles zurück, nehm das nächste reche bit mit dazu... falls die das ergebnis ganzzahlig ist bleibt ganz am ende 0000 über und als ergebnis ne dualzahl, also das was bei 1111:1010 rauskommt. so steht das jedenfalls ist meinem buch :D. blos sowas in c zu realisieren überschreitet glaube meinen horizont, mit den ganzen übertragen und bits runterholen falls kein übertrag und so, das ist mir zu hoch. muss noch dazusagen hab vor 3 monaten mit c angefangen, besser gesagt sollte, richtig beschäftigt hab ich mich damit erst seit 14 tagen :). deshalb kenn ich mich mit der ganzen stringverarbeitung eigentlich noch gar net aus.
glaub aber werd jetzt mehr mit c machen, da es mir eigentlich schon spass macht, wenn man das mal verstanden hat.
-
Wieso rechnest du das überhaupt so kompliziert und addierst jedes Bit einzeln und berechnest jeweils den Übertrag? Das hast du bei der Umwandlung von Dez nach Dual doch auch nicht gemacht. Da hast du auch int benutzt zum rechnen.
Ich hab mein Programm erweitert. Prüfung auf fehlerhafte Eingaben macht es aber immer noch nicht.
#include <stdio.h> int str2int(char str[], int basis) { int x=0; int i=0; while(str[i]!=0) { x*=basis; x+=str[i]-'0'; i++; } return x; } int int2str(char str[], int zahl, int basis) { int i=0; int j; do { str[i]=zahl%basis+'0'; zahl/=basis; i++; } while(zahl>0); str[i]='\0'; for(j=0, i--; i>j; i--, j++) { char temp=str[i]; str[i]=str[j]; str[j]=temp; } } int basisUmrechnen(char str[], int basisIn, int basisOut) { int div, rest, zahl, zahl2; char temp[100]; char basis[10]; int2str(basis, basisOut, basisIn); zahl=str2int(str, basisIn); zahl2=zahl; do { int2str(temp, zahl, basisIn); rest=zahl%basisOut; zahl/=basisOut; printf("%s : %s = %d Rest %d\n", temp, basis, zahl, rest); } while(zahl>0); printf("\n"); int2str(temp, zahl2, basisOut); if(basisIn==2) printf("Dual "); else if(basisIn==10) printf("Dezimal "); printf("%s entspricht ", str); if(basisOut==2) printf("Dual "); else if(basisOut==10) printf("Dezimal "); printf("%s.", temp); } int main() { char str[100]; char str2[100]; int wahl,zahl; printf("Umrechen von: \n"); printf("1. Dezimal -> Dual \n"); printf("2. Dual -> Dezimal \n"); scanf("%d", &wahl); printf("Zahl eingeben: "); fflush(stdin); gets(str); if(wahl==1) { basisUmrechnen(str, 10, 2); } else { basisUmrechnen(str, 2, 10); } }
-
ahh das funzt wunderbar, auswahlmenue und fehlerabfangen bekomm ich auch noch allein hin.
könntest du mir aber bitte auch bissi erklären was das progi jetzt eigentlich macht?
int2str und str2int sind das funkionen die einen integer in einen string umwandeln und umgekehrt? das einzigste was ich 100 % versteh ist das in der main funktionund die ausgabe ist mir auch klar.
mir bringts nämlich nix, wenn ich das progi jetzt so hab, aber selbst net so ganz durchblick, was das eigentlich macht. wenn ich das verstnaden hab bekomm ich das beim nächsten mal bestimmt selbst hin.
-
Wandiii schrieb:
int2str und str2int sind das Funkionen die einen integer in einen string umwandeln und umgekehrt?
Genau.
Beispiel:
char str[100]; //Platz für den String reservieren int2str(str, 42, 2); // Die Zahl 42 in Form einer Dualzahl in den String schreiben printf(str); // String ausgeben
Zahlen im Quellcode werden vom Compiler in eine Binäre Form umgewandelt. Also die 2 und die 42 werden in dem Fall in einen integer umgewandelt und in die .exe gechrieben. Diese Integers werden der Funktion int2str übergeben. Es ist also nicht richtig bei Integers von dezimalen Zahlen zu reden. Dezimal sind sie nur im Quellcode, das ist aber irrelevant. Man könnte genausogut schreiben
int2str(str, 0x2A, 0x2)
Die erzeugte .exe wäre absolut identisch. 0x2A ist eine Hexadezimalzahl (Basis 16) = 42 Dezimal.int2str benutzt genau die Methode, die dein Lehrer verlangt hat.
Das +'0' wandelt das Ergebnis in eine char um.
Also 0 + '0' = '0'
1 + '0' = '1' usw.str[i]='\0' ist da um das Ende des String zu markieren. In C befindet sich immer ein '\0' am Ende eines Strings. Das nennt sich Null-terminierter String.
Hinterher wird der entstandene String noch umgedreht, da bei dem Verfahren ja die Ziffern in umgekehrter Reihenfolge rauskommen.str2int macht genau das umgekehrte. Mit der der Basis multiplizieren und Ziffer addieren. Das ist die exakte Umkehrung des Verfahrens, das von int2str benutzt wird.
z.B.
1230 + 1 = 1
1 * 10 = 10
10 + 2 = 12
12 * 10 = 120
120 + 3 = 123Das geht natürlich auch mit Dualzahlen
101010
0 + 1 = 1
1 * 2 = 2
2 + 0 = 2
2 * 2 = 4
4 + 1 = 5
5 * 2 = 10
10 + 0 = 10
10 * 2 = 20
20 + 1 = 21
21 * 2 = 42
42 + 0 = 42