Problem mit Funktion
-
Wie kann ich dieses Programm ohne die Funktion schreiben ?
#include <iostream> using namespace std; void dez_bin(long int z); void main() { long int dezimal; cout<<"Geben Sie die dezimale Zahl ein: "; cin>>dezimal; cout<<"Binäre Darstellung:\n"; dez_bin ( dezimal); system("PAUSE"); } void dez_bin(long int z) { if (z>0) { dez_bin(z/2); cout<<z%2; } }Ich kriegs irgenwie nicht hin ich bekomme immer 1 als Ergebniss raus -.-
Was genau macht die Funktion da anderes ?
#include <iostream> using namespace std; void dez_bin(long int z); void main() { long int dezimal; long int erg; cout<<"Geben Sie die dezimale Zahl ein: "; cin>>dezimal; cout<<"Binäre Darstellung:\n"; if (dezimal > 0 ) { erg = dezimal / 2; cout<<"binär zahl 1: "<<dezimal%2<<endl; } system("PAUSE"); }
-
die Funktion ruft sich immer wieder selbst auf (Rekursion), siehe Zeile 30
solltest vielleicht dir n Tutorial dazu anschauen, wenn dir das nicht ganz klar istum die Funktion "nachzubauen", müsstest du in deinem Programm ohne die Funktion die Berechnung in eine Schleife bauen
z.B. so:while (dezimal > 0) { erg = dezimal / 2; cout<<"binär zahl 1: "<<dezimal%2<<endl; }so ungefähr muss es dann lauten !
PS:
es heißt int main() und nicht void main() !!
und es fehlt ein return 0 am Ende deines Programms (um mal ganz genau zu sein
)
-
Erm R3dnexx?
Also wenn man nun eine solche Schleife mit Abbruchbedingung schreibt, sollte man natürlich auch dafür sorgen, dass diese Bedingung irgendwann einmal auftritt
Und da die rekursive Funktion in sich die Bitfolge schon umdreht, musst du sowas natürlich auch simulieren durch einen entsprechenden Zwischenspeicher. Ansonsten würdest du ja zuerst mod 2 machen, dann durch 2 teilen und dann wieder mod 2. Wenn du das dann ausgibst, ist die Binärfolge falschherum.
Irgendwie so:unsigned int zahl = 5235235; unsigned int mask = 1 << 31; // Oberstes Bit gesetzt while( mask && !(mask & zahl) ) mask >>= 1; // Führende Nullen überspringen do { std::cout << ((zahl & mask)>0); // bool wird als 0 oder 1 ausgegeben mask >>= 1; } while( mask ); // Eine 0 soll immer ausgegeben werdenDas klappt natürlich in dem Fall nur mit 32-Bit-unsigned Integern. Wahrscheinlich ist mir jetzt etwas entgangen, wie man das wesentlich einfacher machen kann

MfG,
Michael
-
Ok danke, ich werd mir mal diese Rekursion Sachen anschauen.
-
R3dNeXX schrieb:
PS:
und es fehlt ein return 0 am Ende deines Programms (um mal ganz genau zu sein
)Nein, das tut es nicht (um mal ganz genau zu sein)

int main() {}ist völlig korrekt, da jeder standard-konforme Compiler das
return 0;selbstständig ans Ende der main-Fkt (und nur dort) setzt...bb
-
@Decimad:
du hast natürlich recht, sorry, bin heut sowieso etwas durcheinander
ps: denke das nächste Mal etwas mehr nach !!
-
Ich hab das gerade einfach mal ohne Abbruchbedinung und so ausprobiert.
Ich hab einfach mal eine 7 eingeben als Ergebniss müsste ja dann kommen 111
Aber ich bekomme immer nur eine 1 ausgegeben.
#include <iostream> using namespace std; void main() { long int dezimal; long int erg; cout<<"Geben Sie die dezimale Zahl ein: "; cin>>dezimal; cout<<"Binäre Darstellung:\n"; while (dezimal > 0) { erg = dezimal / 2; cout<<"binär zahl: "<<dezimal%2<<endl; } }
-
mit diesem algorythmus gehts. Musst halt nur die genauigkeit mit angeben. Also wieviel bits deine zahl hat.
#include <iostream> using namespace std; int main() { int zahl=7; for(int i=32;i>=0;i--) { if((1<<i) & zahl) cout << "1"; else cout << "0"; } cout << endl; return 0; }
-
func schrieb:
void main()Es wäre dennoch schön, wenn du dir alle Anmerkungen durchliest. "void main" ist immer noch kein gültiges C++ und war es auch noch nie, auch wenn dein Compiler es akzeptieren mag, und man es ab und zu in schlechten Büchern/Tutorials sieht.
-
Hallo func,
in Deinem Programm (Code vom 09.12.2008, 12:56) weist du der Variablen 'erg' einmal 'dezimal' halbe zu, aber die Variable 'dezimal' änderst Du nirgends in der wile-Schleife. Damit kann die Abbruchbedingung nie erfüllt werden (wenn die dezimalzahl nicht 0 oder 1 ist) und du hast eine Endlosschleife die andauernd lediglich 'binär zahl: 0/1' ausgibt.
Weiterhin erhälst du keine Ausgabe bei 'dezimal' = 0, weil Du dann nicht in die Schleife zur Ausgabe kommst.Folgender Vorschlag:
- Du brauchst eine Schleife, in die du erstmal immer reinkommst für Verarbeitung von dezimal 0: do-while.
- innerhalb der Schleife erfolgt nur die Umwandlung mit Zwischenspeicherung des Ergebnisses (mache ich hier mit einem std::ostringstream)
- Die Ausgabe erfolgt nach der Schleife nach Umkehrung der Ziffernreihenfolge im string#include <conio.h> // für getch() - nicht sehr schön #include <iostream> #include <string> #include <sstream> // für Umwandlung von integer nach string #include <algorithm> // für reverse() int main() { unsigned long int dezimal; std::cout << "Geben Sie eine positive dezimale Zahl ein: "; std::cin >> dezimal; // Umwandlung std::ostringstream ss; do { ss << (dezimal%2); dezimal = dezimal / 2; } while (dezimal > 0); // Reihenfolge der binärziffern umdrehen std::string erg(ss.str()); reverse(erg.begin(), erg.end()); // Ausgabe std::cout << "Binäre Darstellung: " << erg << std::endl; // schließen der Konsole verhindern - quick and dirty std::cout << "Taste zum beenden"; getch(); return 0; };