C++ - Probleme mit Dezimal to Binaer Programm
-
Hallo allerseits,
ich habe ein Programm geschrieben welches eine Dezimal Zahl einliest und dann in HEX-, Oktal- und Binaerzahlen ausgiebt. Hier der Code:
#include <iostream> using namespace std; void ausgabe(int zahl); int ausgabeBin(int i); int main(){ int zahl = 100; ausgabe(zahl); return(0); } void ausgabe(int zahl){ while (zahl != 0){ cout << "Geben Sie eine Zahl ein die in HEX und Oktal-Zahl ausgegeben wird" << endl; cout << "Dezimal Zahl: "; cin >> zahl; cout << "HEX: " << hex << zahl << endl; // HEX Konvertierung cout << "Oktal: " << oct << zahl << endl; // Oktal Konvertierung cout << "Binaer: "; cout << ausgabeBin(zahl) << endl; } } // Binaere Konvertierung int ausgabeBin(int i) { if (i!=0) { ausgabeBin(i/2); if ((i % 2) == 0) { cout << "0"; } else { cout << "1"; } } return(0); }Das Problem ist das es immer eine Null drangehaengt wird, wegen dem return. Ich habe versucht aus der ausgabeBin-Funktion, eine Funktion mit Datentyp void zu machen. Aber da bekomme ich eine Fehlermeldung, das dies nicht moeglich ist.
Und noch etwas ist mir aufgefallen:
cout << "Binaer: " << ausgabeBin(zahl) << endl;und
cout << "Binaer: "; cout << ausgabeBin(zahl) << endl;ist anscheinend nicht das gleiche da die Binaerzahlen der Funktion als erstes ausgegeben wird. Und erst spaeter "Binaer: " mit dem Rueckgabewert "0". Kann mir jemand erklaeren wieso ? Binaer steht ja(von links gesehen) vor der Funktion
ausgabe.Gruss
THE-E
-
Du hast das ja auch reichlich komisch gemacht. Warum gibst du die 0 zurück? die hat doch gar keine Bedeutung. Und wieso gibst du sie danach auch noch aus? Es reicht doch, folgendes zu machen:
cout << "Binaer: "; ausgabeBin(zahl); cout << endl;Und ausgabeBin gibst du den Typ void.
Deine andere Frage: Tja, so ist das halt mit den Nebeneffekten. da ist die reihenfolge nicht definiert, denn << ist kein Sequenzpunkt. Die Reihenfolge ist undefiniert, die meisten Compiler machen daraus aber Code von rechts nach links. Wenn du das nicht willst, dann schreib Funktionen ohne Nebeneffekte (
Das ist auch allgemein eine sehr gute Idee, nicht nur hier!). ausgabeBin könnte beispielsweise einen String mit der richtigen Ausgabe zurückgeben und selber nichts ausgeben. Dann kannst du auch cout << "Binaer: " << ausgabeBin(zahl) << endl;schreiben.
-
Mach aus "cout << ausgabeBin(zahl) << endl; " einfach "ausgabeBin(zahl);" Zum Rest sage ich mal nichts, hab jetzt Feierabend.
-
Es gibt übrigens auch eine Möglichkeit der Standardbibliothek, Zahlen binär auszugeben, mittels bitset:
http://www.cplusplus.com/reference/stl/bitset/operators/
-
Ihr habt mir sehr geholfen, das sind meistens kleine Fehler die einen manchmal zum verzweifeln bringen.
Danke schoen
Ihr seid echt gut !SeppJ schrieb:
Es reicht doch, folgendes zu machen:
cout << "Binaer: "; ausgabeBin(zahl); cout << endl;Ist es moeglich dies in einer Zeile zu schreiben ?
cout << "Binaer: "; ausgabeBin(zahl); cout << endl;...geht ja nicht
EDIT:
Sorry das obengeschriebene geht doch. Ich hatte nur vergessen die Konsole zu schliessen dadurch war ein erneutes debuggen nicht moeglich.
-
und die boost libraries haben auch ein dynamisches bitset
-
Heißer Tipp: Schreib nicht alles in eine Zeile. Zeilenumbrüche sind dein Freund. Das macht Debuggen um so vieles einfacher. Man erfährt nämlich meistens nur die Zeile in der ein Fehler auftritt. Und wenn du mehrere Befehle in einer Zeile hast (du kannst auch das gesamte Programm in einer Zeile schreiben), dann nützt dies nicht viel.
-
muli schrieb:
und die boost libraries haben auch ein dynamisches bitset
Es gibt auch noch
std::vector<bool>, falls einem nach Wohltätigkeit ist. :p
-
SeppJ schrieb:
Heißer Tipp: Schreib nicht alles in eine Zeile. Zeilenumbrüche sind dein Freund. Das macht Debuggen um so vieles einfacher. Man erfährt nämlich meistens nur die Zeile in der ein Fehler auftritt. Und wenn du mehrere Befehle in einer Zeile hast (du kannst auch das gesamte Programm in einer Zeile schreiben), dann nützt dies nicht viel.
So ein heisser Tipp, ich glaub ich verbrenne :). Nein, mal ehrlich, danke fuer den Tipp, aber ich wollte das nur so, da die Zeilen ueber mir eine aehnlich Formatierung haben und der Code ohnehin nicht allzu lang ist.

-
#include <iostream> struct bin { int const& fremderInt; bin(int const& fi): fremderInt(fi) { } friend std::ostream& operator<<(std::ostream& out,bin const& aB) { rekursivesGefrickel(aB.fremderInt,out); return out; } static void rekursivesGefrickel(int i,std::ostream& out) { if (i!=0) { rekursivesGefrickel(i/2,out); if ((i % 2) == 0) { out << "0"; } else { out << "1"; } } } }; using namespace std; void ausgabe(int zahl) { while (zahl != 0) { cout << "Geben Sie eine Zahl ein die in HEX und Oktal-Zahl ausgegeben wird" << endl; cout << "Dezimal Zahl: "; cin >> zahl; cout << "HEX: " << hex << zahl << endl; // HEX Konvertierung cout << "Oktal: " << oct << zahl << endl; // Oktal Konvertierung cout << "Binaer: "<< bin(zahl) << endl; // Binär Konvertierung } } int main() { int zahl = 100; ausgabe(zahl); return 0; }Von so Ausgabeobjekten halte ich viel mehr als von Stream-Flags.