Programm zur Umrechnung Dualer/Binärer Zahlen in Dezimale Zahlen
-
Hi zusammen,
ich soll ein C++ Programm erstellen, mit Hilfe dessen eine duale Zahl in eine dezimale umgewandelt wird. Leider stehe ich noch relativ am Anfang des Studiums und somit stehen mir noch nicht viele Funktionen "zur Verfügung". Kann mir jemand weiterhelfen und sagen, wo der/die Fehler in meinem Code sind?#include <iostream> using namespace std; int main() { int zahl, stellen, n=0, position = 0; //das Feld zum Speichern der Ergebnisse int ergebnis[stellen]; //Das Feld wird mit 0 besetzt for (int index = 0; index < stellen; index++) ergebnis[index] = 0; //Eingabe des binären Wertes cout << "Geben Sie den dualen Wert ein: "; cin >> zahl; //Eingabe Anzahl Stellen cout << "Geben Sie die Anzahl der Stellen der dualen Zahl ein: "; cin >> stellen; do { //Ergebnis der Modulo-Berechnung ablegen ergebnis[position] = zahl %10 * 2^n; //nächste Position position++; //neue Zuweisung zahl=zahl/10; } while (zahl != 0); for (int index = 0; index < stellen; index++) { ergebnis = ergebnis + ergebnis[position]; cout <<"Die dezimale Zahl lautet: " << ergebnis; } return 0; }
Schon jetzt vielen lieben Dank. Ich bin mit meinem Latein am Ende
-
Ich wuerde die binaere Darstellung der Zahl als String speichern. Das macht das Ganze einfacher.
Hier ein Pseudocode wie du das (aus meiner Sicht) am einfachsten machen kannst:
int n; // Initialisiere n; string bin_n; // Initialisiere bin_n; while ( n > 0 ) { if n durch 2 teilbar Haenge eine '0' an bin_n an; else Haenge eine '1' and bin_n an; n = n / 2; } Drehe bin_n um; Gib bin_n aus
Hinweise:
- Schau dir std::string an. Schau mal was der + Operator angewendet auf zwei std::strings macht
- Fuer den Test auf Teilbarkeit kannst du den Modulo-Operator % verwenden.
- Anstatt die '0' oder '1' an den String anzuhaengen und diesen dann umzudrehen kannst du auch 0 oder 1 vorne an den String schreiben, dann musst du den String nicht mehr umdrehen.*Edit
Ich hatte gelesen "Dezimalzahl in Binaerzahl" umrechnen. Aber du meintest wohl "Dualzahl in Dezimalzahl" umrechnen gemein (aber nicht so geschreiben ^^).
-
dualzahl = binärzahl, du willst wahrscheinlich dualzahlen in dezimalzahlen umrechnen.
dann zu deinem code, zeile 12 willst du ein feld mit der der anzahl der stellen anlegen, die dynamisch ist! Das ist erstmal ein problem, da das eine compilerspezifische erweiterung des c++-standards ist und man nicht benutzen sollte. std::vector/std::string ist dein freund (schau in einer referenz nach was die machen) und wenn du den std::vector/std::string nicht benutzen darfst, musst du dir ein ein feld mit ausreichender größe anlegen. Das zweite Problem an der sache ist, das die varibale stellen nicht initialisiert ist, dass heißt, es steht irgendwas in der varibale drin.int feld[20]; //feld, dass eine statische größe hat std::vector<int> feld_2; //feld, dass dynamisch erweiterbar ist (NICHT statisch) udn genau, was du brauchst std::string feld_3;
in zeile 15 ist auch wieder das problem, dass stellen uninitialisiert ist.
zeile 29: 2^n wird nicht das machen, was du erwartest, schau nach, wie man in c++ potenziert.
zeile 39: ich verstehe nicht, was das werden soll.
du solltest dir ein gutes (!) buch nehmen und es anfangen durchzuarbeiten, sonst wird das wahrscheinlich nichts
und zu deinem algorithmus (ich weiß nciht so genau, ob der stimmt, wenn nicht, beachte den link): http://www.arndt-bruenner.de/mathe/scripts/Zahlensysteme.htm
-
Ja klar, von dual in dezimal, war ein Tippfehler im Eingangstext. Wie gesagt ich stehe noch am Anfang, aber trotzdem soll dieses Programm erstellt werden. Als Hinweise werden gegeben:
- Die letzte Ziffer einer beliebigen Zahl erhalten Sie, wenn Sie die Zahl durch 10 dividieren und den Rest dieser Division ermitteln (daher modulo 10).
- Die letzte Ziffer einer Zahl können Sie löschen, wenn Sie die Zahl durch 10 dividieren und nur das ganzzahlige Ergebnis berücksichtigen.
Dies vielleicht zur näheren Erklärung. Die Funktion pow kenne ich vom lesen, wurde aber eigentlich auch noch nicht verwendet.
Ich habe das Programm etwas umgestaltet und vereinfacht, aber es scheint mir, dass das mit der pow-Funktion nicht funktioniert:
#include <iostream> #include <math.h> using namespace std; int main() { int zahl; double berechnung = 0, potenz=0; //den Wert einlesen cout << "Geben Sie den dualen Wert ein (besteht ausschliesslich aus 0 und 1): "; cin >> zahl; //die Schleife do { //Berechnung und Addition berechnung = berechnung + pow(zahl%10,potenz); static_cast<int>(berechnung); //zur nächsten Position gehen potenz++; //durch 2 teilen und wieder zuweisen zahl = zahl / 10; } while (zahl != 0); cout << "Die dezimale Zahl lautet: " << berechnung ; return 0; }
Habt ihr vielleicht noch Tipps wie ich das Ganze zum Laufen bringe?
-
zahl%10 ist entweder 0 oder 1.
0potenz ist immer 0
1potenz ist immer 1So kommst du nicht weiter.
Wenn du unbeding so weitermachen willst:berechnung = berechnung + (zahl%10)*pow(2,potenz);
Allerdings geht es besser wenn du
potenz=1; ... berechnung = berechnung + (zahl%10)*potenz; potenz *= 2; // statt potenz++
machst.
-
Super vielen Dank! Jetzt sehe ich meinen Denkfehler. Vielen Dank!
-
Eine Sache noch: duale Zahl != Dualzahl
Edit: Den Code überarbeite ich und poste ihn in einem neuen Thread.