Dual Dezimal Umwandlung C-Programm
-
von dual auf dezimal zu rechnen macht überhaupt keinen sinn weil wenn du die zahl zusammenaddierst kommt sowieso wieder das gleiche raus... er speichert es ja eh binär... was für ein blödsinn da was zu rechnen wo es gar nix zu rechen gibt...
-
tja, ich glaub es geht bei dem programm auch net um sinn oder unsinn, sondern das ist die aufgabe
ich find das auch irgendwie idiotisch aber die aufgabenstellung lautet so
-
also bei der umwandlung von dual nach dezimal macht man das genauso wie du vorher beschrieben hast man nimmt immer dsa jeweilige byte und multipliziert es mit 2 hoch der jeweiligen wertigkeit...
das kannst du wenn du es mit deiner teilerei machen willst dadurch erreichen das du immer %2 rechnest oder &1 und herauszubekommen ob das jeweilge bit gerade 0 oder 1 ist... und das ganze multiplizierst du dann mit der entsprechend wertigkeit.... danach immer durch 2 teilen um das nächste byte zu bekommen (das teilen ist eigentlich nicht nötig aber wenn du es unbedingt so machen willst)der schwachsin bei der aufgabe liegt darin das du das ergebnis ja in irgend einer variablen speichern musst und und dieser variable wird das ja wieder binär gespeichert. du bist also nach der rechnung genauso schlau wie vorher. es gibt da also nix umzuwandeln...
-
Windalf schrieb:
der schwachsin bei der aufgabe liegt darin das du das ergebnis ja in irgend einer variablen speichern musst und und dieser variable wird das ja wieder binär gespeichert. du bist also nach der rechnung genauso schlau wie vorher. es gibt da also nix umzuwandeln...
Das kommt natürlich auf das Eingabeformat an. Wo stand denn, daß das ein Integer, und nicht etwa ein String der Form "100101110", sein muss?
-
@Daniel E.
ups stimmt in dem fall würde es sogar sinn machen...
-
na ja ich hätte einige möglichkeiten wie ich das von dual auf dez machen kann, nur leider ist das net das verlangte, das ist das prob der hat explizit vorgeben wie das ausschauen soll
nochmal das beispiel:
z.b. die dualzahl 1111 basis von dez system ist 10 also 1010
jetzt soll am bildschirm nachdem du 1111 eingeben hast das ausgegeben werden:
1111 : 1010 = 1 Rest 5
1 : 1010 = 0 Rest 1Dualzahl 1111 ist die Dezimalzahl 15
Genau so soll das ausschauen
Also das Problem: wie bekomm ich raus, wieviel mal die 1010 in der dualzahl 1111 oder einer anderen 8 bitigen dualzahl steckt und dann noch den rest denn ich dann wieder teilen muss
-
meine möglichkeit wäre mit dem 2 er komplement also mit 0111 zu addieren
also
1111
+0111wenn dort ein übertrag rauskommt kommt ne 1
wenn eine 0 rauskommt muss ich alles zurücknehmen und dann ein bit dazu und wieder 0111 dazu
am ende wird dann ein rest bleiben und als ergebniss ne dualzahl stehendas ist glaube der normale weg wie man eine division im dualen durchführt, das 2 er komplement von divisor addieren und dann das mit dem übertrag
aber selbst das mit dem addieren geht ja net weil der dann wieder 1+1= 2 draus macht und mit & gehts auch net, weil der bei 1 & 1 ja 1 ausgibt aber da msus ja 0 stehen + übertrag welcher zum nächsthöheren bit dazugezählt wird,
also müßtest du jedes bit irgendwie verlgeichen ob da was > 1 rauskommt und wenn ja dann ne variable setzen die dann bei der nächsten x & y dazugerechnet wirdam ende wird das enorm kompliziert und kein mensch kennt sich mehr aus
morgen geh ich nochmal zu dem prof und frag ob der das so kompliziert verwirklicht haben will, weil ich sehe ehrlich gesagt auch keinen sinn das ganze auf so einem weg zu machen, wenn das viel viel einfacher ginge
ps: falls sich hier einer genervt fühlen sollte, weil ich soviele anfragen stell und net locker lass, denkt dran, ich fühl mich bestimmt noch viel mehr genervt, so eine scheiss aufgabe zu bekommen
-
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