Dualzahl in dezimalzahl
-
Ich hab ein Problem und das hängt mit den Dualzahlen zusammen. Hier mein Programm:
// Wolframm, 22.4.2007, all rights reserved #include <iostream.h> #include <conio.h> #include <math.h> int main() { int z,du,de,k,T[12],i,u,g; cout<<"Was möchten Sie berechnen lassen?"<<endl; cout<<"1 = Dualzahl in Dezimalzahl"<<endl; cout<<"2 = Dezimalzahl in Dualzahl"<<endl; cin>>z; de=0;i=0;g=0; if(z==1) { clrscr(); cout<<"Wieviele Stellen hat Ihre Dualzahl?"<<endl; cin>>z; cout<<"Geben Sie Ihre Dualzahl ein: "<<endl; for(i=0;i<z;i++) { cin>>T[i]; } do { i=i-1; u=T[i]*pow(2,i); g=g+u; }while(i!=0); cout<<"Die Dezimalzahl ist:"<<g; } if(z==2) { clrscr(); cout<<"Geben Sie Ihre Dezimalzahl ein: "<<endl; cin>>de; u=de; do { u=u/2; k=u*2; if(de!=k) { T[i]=1; } else { T[i]=0; } i=i+1; de=u; }while(u!=0); do { i=i-1; cout<<T[i]; }while(i!=0); } getchar(); return 0; }Das Programm Funktioniert! Aber ich will 1. abschaffen die Abfrage: "Wieviele Stellen hat die Dualzahl" und 2. wenn man die erste Ziffer eingibt das man nicht immer Enter drücken muss.
-
dann mach es nicht ziffer für ziffer, sondern als ein unsigned int, und zwar in beiden fällen...
Beispiel:
1001101001wenn der benutzer sowas eingibt, ist es für den rechner natürlich erstmal eine dezimalzahl, aber der benutzer weiß es ja nicht, und es ist ihm auch egal.
Diese dezimalzahl kann man jetzt im grunde ziffer für ziffer wieder auseinandernehmen, und als dualzahl interpretieren.... dann hast du auch kein problem mit der länge der zahl... wär ja blöd, wenn man jedes mal nachzählen müsste
-
Danke für deine Antwort, aber ich weiß nicht wie man unsigned int einsetzt und wie es dann aussieht. Könntest du mir das bitte noch schreiben?
-
"unsigned" heisst einfach, dass da das vorzeichen nicht beachtet wird, dass also nur positive zahlen dargestellt werden können, und negative zahlen brauchst du wahrscheinlich nicht...
-
hmm also das mit den Enter könntest du so regeln:
du stellst di frage: " Was möchten sie tun? (1)In der Nase bohren; (2) Nichts!"
dann deklarierst du eine int variable( int vote = 0 ), anschliessend machst du eine do while schleife
int vote = 0; bool is voting = false; do { voting = true; if( kbhit() ) { // wurde die tastatur benutzt vote = getch() // die vote var bekommt den tastencode der ausgelöst wurde switch( vote ) { // mit einer switch-case machst du eine // fallunterscheidung, dadurch ist es dir möglich nur // auf bestimmte tasten zu reagieren case '1': { //tu was; voting = false; break; } case '2': { //tu was; voting = false; break; } default: { cout << "Benutze die Ziffern 1 und 2 zum voten!"; voting = true; } } } }soviel zu deinem enter problem.
Gruß Tobi.
-
Danke, aber das wollte ich eigentlich nicht wissen, hab es trotzdem mit eingebaut im Programm.
-
Wolframm schrieb:
Danke für deine Antwort, aber ich weiß nicht wie man unsigned int einsetzt und wie es dann aussieht. Könntest du mir das bitte noch schreiben?
Na so:
unsigned int Zahl; std::cin >> Zahl; //jetzt hast in Zahl vllt. so was: 1011 //jetzt zerlegst die zahl in die einzelen stellen prüfst ob nur einsen und nullen vokommen und wertest es ausmfg tobZel
-
Genau das ist mein größtes Problem. Wie zerlege ich dann die Zahl, so das ich diese wieder in Arrays speichern kann?
-
Andrey schrieb:
dann mach es nicht ziffer für ziffer, sondern als ein unsigned int, und zwar in beiden fällen...
besser die binärzahl als string...
#include <iostream> #include <string> using namespace std; unsigned long binary_to_number (string &binary) { unsigned long n = 0; for (size_t s=0; s<binary.length(); s++) n = (n<<1) + binary[s]-'0'; return n; } int main() { string in; cin >> in; cout << binary_to_number (in) << endl; }
-
Danke, das funktioniert also schonmal, aber jetzt muss ich erstmal verstehen was du da geschrieben hast :D.
Danke nochmals an alle für die Unterstützung.
-
Wolframm schrieb:
Danke, das funktioniert also schonmal, aber jetzt muss ich erstmal verstehen was du da geschrieben hast :D.
erst wird der vorherige wert 1 nach links geschoben (entspricht einer multiplikation mit 2, weil links die höchste stelle ist, muss auch so oft mit 2 multipliziert werden), dann wird das zeichen '0' oder '1' aus dem string dazu addiert. damit aus dem zeichen '0' oder '1' der zahlenwerte 0 oder 1 werden, muss man '0' abziehen. das ganze wird so oft gemacht, wie viele zeichen im string sind.
der string darf übrigens nur aus nullen und einsen bestehen...

-
Wie wär's damit:
#include <iostream> #include <bitset> int main () { std::bitset<32> myBitset; std::cout << "Bitte dualzahl eingeben(max. 32 Stellen): "; std::cin >> myBitset; std::cout << "Dezimalzahl ist: " << std::dec << myBitset.to_ulong() << std::endl; }