[HILFE] Dezimal in Dual Converter funktioniert nicht wie er soll :x
-
Hallo,
und zwar hab ich ein kleines Problem mit meinem Programm,
ich soll ein Konsolenprogramm schreiben welches die als Parameter übergebene Zahl in eine Dual Zahl umwandelt (auch in Hex wo ich übrigens das selbe Problem habe da gleicher Lösungsweg)
Er soll nur Positive Zahlen bis zur Zahl 4 294 967 295 umwandeln. Im Binär Fall darf er auch nur max 32 Zeichen ausgeben :3 Ich darf leider keine Variablen benutzen die es direkt konvertieren sonder muss es durch den herkömmlichen Weg machen dh kein _itoa o.ä.
(Visual Studio 2008)Mein Programm rechnet es zwar richtig bis jetzt aus nur lässt der immer eine Eins aus also statt 32 Einsen werden es einfach 31 ( Im moment übergibt der Parameter die Zahl 4 294 967 295)
Wenn ich den Array vergrößer wird durch meine For-Schleife einfach eine Null eingefügtbool IntToBin(int zahl,TCHAR* BinString,int BinStringLen); int _tmain(int argc, _TCHAR* argv[]) { int zzahl = _tstoi(argv[1]); TCHAR len[12]; int lenh = sizeof(*len); IntToBin(zzahl,len,lenh); return 0; } bool IntToBin(int zahl,TCHAR* BinString,int BinStringLen) { int length=sizeof(BinString); TCHAR zzahl[33]; int i = 0; if (zahl>0) { for (i = 0;zahl != 0;i++) { zzahl[i] = 48+zahl%2; zahl/=2; } for (int z = i; z<33;z++) zzahl[z]='0'; zzahl[32]=0; _tcsrev(zzahl); printf("%s",zzahl); return true; } else { return false; } }
Ich glaube ja der Fehler liegt irgendwo am Modulo
also so wie der Code jetzt ist gibt er0111 1111 1111 1111 1111 1111 1111 1111
das aus :x
Könntet ihr mir erklären wieso?
wäre super nett von euch :3
-
Wenn Du immer 32 Bit ausgeben willst, dann mach doch die Rechenschleife so:
[quote="Lexchen"]
if (zahl>0)
{
for (i = 0;i<32;i++)
{
zzahl[i] = 48+zahl%2;
zahl/=2;
}
zzahl[32]=0;
_tcsrev(zzahl);
[/code]
Keine Ahnung, ob das hilft, aber das Aneinanderstückeln der beiden Schleifen hat mit angst gemacht.
-
Also an sich verkürzt es nur meinen Code erheblich
Bei der Zahl müsste eigtl die ausgabe aus
32 1ern bestehen rauskommen tun aber nur 31
-
Lexchen schrieb:
Also an sich verkürzt es nur meinen Code erheblich
Ja, und es klärt den Blick, weil der Fehler sich jetzt in den verbleibenden Zeilen verstecken muß.
Einen hab ich: die zahl darf kein int sein, sondern muß unsigned int sein.
-
Yo also hab das nun bissl geändert ich hoffe ich hab das richtige zu unsigned gemacht weil meine programmier fähigkeiten halten sich noch in extremen grenzen!
bool IntToBin(unsigned int zahl,TCHAR* BinString,int BinStringLen) { int length=sizeof(BinString); TCHAR zzahl[33]; int i = 0; if (zahl>0) { for (i = 0;i<32;i++) { zzahl[i] = 48+zahl%2; zahl/=2; } zzahl[32]='\0'; _tcsrev(zzahl); printf("%s",zzahl); return true; } else { return false; } }
Dann hab ich noch bisschen gegooglet und nen anderen code gefunden
void dez_bin(long int z) { char str[33]; str[32] = '\0'; for( int i=31; i>=0; i--, z>>=1) str[i] = (z&1)+ '0'; printf( str, 0); }
Jedoch verstehe ich die Zeile
str[i] = (z&1)+ '0';
nicht ganz!
und vllt hilft mir der Shift Operator in diesem Fall auch?
Jedoch habe ich diese noch nie angewendet nur eben kurz nen Tut/Info Thread darüber gelesen damit cih weiß was der direkt tut!Danke nochmal für deine Hilfe :3
-
Lexchen schrieb:
und vllt hilft mir der Shift Operator in diesem Fall auch?
Jedoch habe ich diese noch nie angewendet nur eben kurz nen Tut/Info Thread darüber gelesen damit cih weiß was der direkt tut!Nö, das ist Unfug. %2 und &1 bzw /2 und >>1 werden vom compiler gleich behandelt.
Sein Trick ist nur, daß er gleich schon andersrum ins Array reinschreibt.
-
Das hatte ich anfangs genauso jedoch hat mein Ausbilder mich gefragt wieso ich die Schleife rückwärts laufen lasse und sie nicht erst vorwärts laufen lasse und dann umdrehe. Dann hab ich es halt so gemacht wie er es wollte xd
-
Lexchen schrieb:
Das hatte ich anfangs genauso jedoch hat mein Ausbilder mich gefragt wieso ich die Schleife rückwärts laufen lasse und sie nicht erst vorwärts laufen lasse und dann umdrehe. Dann hab ich es halt so gemacht wie er es wollte xd
Das hat den selben Grund, wie warum ich die Sachen gleich richtig in den Kühlschrank einräume, und nicht erst alles verkehrt herum und dann den ganzen Kühlschrank auf den Kopf stelle. Aber ich bin nur Laie und der Ausbilder hat recht. Aber Deine Funktion mit dem umdrehen klappt doch auch schon, oder?
Das "if (zahl>0)" kann weg.
-
Ja das klappt
ne if(zahl>0) muss leider drinnen bleiben weil die Funktion als antwort entweder true oder false antworten soll alsoIch tipp mal die genaue Aufgabenstellung ab :x
(Hex lass ich mal aus aber steht da im gleichen wortlaut da nur statt bin steht da halt hex xd)
Schreibe ein Konsolenprogramm, das die als Parameter übergebene Zahl formatiert in hexadezimaler und binärer Schreibweise ausgibt.
Wertebereich max. FF FF FF FF h bzw 4 294 967 295 (nur positive Zahlen).Hinweis:
Schreibe hierzu folgende Funktion:bool IntToBin (int zahl, TCHAR* BinString, int BinStringLen);
int zahl: die Zahl, welche konvertiert werden soll.
TCHAR* BinString: der String, der die konvertierte Zahl in ASCII aufnehmen soll.
int BinStringLen: die Größe von BinString in bytes.Beide Funktionen liefern im Fehlerfall "false" zurück, ansonsten "true".
Der Aufruf:
Programmname 255 //keine Ahnung was er damit meinte ich habs einfach mal ausgelassen und er hat dazu auch nix weiter gesagtDie Ausgabe:
00-00-00-FF :: 00000000-00000000-00000000-11111111 // ihm ist es nicht so wichtig das es genauso ausschaut er will einfach nur das ich das soweit hinbekommeIch hab mal den Code den ich vorher gepostet hatte in meine Funktion eingebaut und meinen ursprünglichen Code kommentiert
als ergebnis kam genau das gleiche raus also das ganz vorne an erster Stelle eine 0 ist und von 31 Einsen gefolgt wird
-
Hallo,
klappt's jetzt? Welchen Code verwendest du jetzt?
MfG,
Probe-Nutzer
-
Also das Problem war
das
int zzahl = _tstoi(argv[1]);
in dieser Zeile das _tstoi ein signed int ist und da ich laut den vorgaben
eine Zahlengröße von eigtl unsigned int machen müsste hats nicht funktioniert
wenn man also bis 32 Stellen gehen will/muss muss man die Stelle ändern gesagt getan xd
So sieht mein Code nun aus:#include "stdafx.h" #include <stdlib.h> #include <string.h> #include "math.h" bool IntToBin(unsigned int zahl,TCHAR* BinString,int BinStringLen); int _tmain(int argc, _TCHAR* argv[]) { unsigned int zzahl = 0; sscanf(argv[1], _T("%u"), &zzahl); TCHAR len[12]; int lenh = sizeof(*len); IntToBin(zzahl,len,lenh); return 0; } bool IntToBin(unsigned int zahl,TCHAR* BinString,int BinStringLen) { int length=sizeof(BinString); TCHAR zzahl[33]; int i = 0; if (zahl>0) { memset(zzahl,'\0',sizeof (zzahl)); for (i = 0;i<32;i++) { zzahl[i] = 48+zahl%2; zahl/=2; } _tcsrev(zzahl); printf("%s",zzahl); return true; } else { return false; } }
Funktioniert nur bei Positiven Zahlen
neue Aufgabe das nun bei negativen zu machen xd!
-
Lexchen schrieb:
Funktioniert nur bei Positiven Zahlen
neue Aufgabe das nun bei negativen zu machen xd!Nein. Erstmal den AUsbilder beglücken.
Du sollst keine führenden Nullen ausgeben. Das führt dazu, daß Du mindestens eine und höchstens 32 Ziffern ausgibst. Das führt dazu, daß Du false returnrn mußt, wenn die Zahl nicht in den gegebenen Speicherplatz paßt, was Du aber erst während des Berechnens feststellen kannst. Das führt dazu, daß der Ausbilder wollte, daß Du erst schreibst und nachher erst umdrehst.
-
Naja ich darf führende Nullen anzeigen lassen (Siehe Seite 1 ganz unten irgendwo) naja hab nun einfach ins if das geschrieben
if (zahl>0 && zahl<4294967296)
wie gesagt mein Ausbilder meinte ich solls nun mit Negativen zahlen machen nur hab ich zwar schonmal mit negativen Dualzahlen gearbeitet aber daran erinner ich mich nicht mehr also muss ich mcih das nochmal durchkauen :3
-
Lexchen schrieb:
nur hab ich zwar schonmal mit negativen Dualzahlen gearbeitet aber daran erinner ich mich nicht mehr also muss ich mcih das nochmal durchkauen :3
Jup, auf jeden Fall.
Lexchen schrieb:
wie gesagt mein Ausbilder meinte ich solls nun mit Negativen zahlen machen
Wenn Du die negativen binärzahlen wieder kennst, deck das auf:
//qh oenhpufg qvr artngviqnefgryyhat üoreenfpuraqrejrvfr tne avpug. //vz cevamvc trugf fb: ibvq VagGbOvaZvgIbemrvpura(vag k) { vs(k<0) cevags("-");VagGbOva(-k); ryfr VagGbOva(k);
-
Kp was der Buchstaben Salat heißen soll aber!
ich hab das nun mit dem 2er Komplement durchgelesen unso :3
nun häng ich nämlcih auch direkt
ich will
das der Compiler das Vorzeichen ignoriert und dass dann erstmal in Dualzahlen umwandelt
so nun mein Problem das funktioniert normal mit der funktion abs();
aber die kann sowas nur mit signed int machen jedoch sind meine integer unsigned gibt es irgendwie ne andere möglichkeit? oder so das es funktioniert?
VS08 gibt immer nur aus das es ein long double float oder int sein mussalles jeweils signed
oder kann ich nen unsigned int in einen long umwandeln?
-
rot13