einlesen von Dualzahlen
-
Hallo ich bin neu hier und brauche Hilfe.Ich muss in einer Hausarbeit ein Progamm schreiben welches Dualzahlen in Dezimalzahlen umrechnet. Ich habe Mir überlegt die Dualzahl in einen int einzulesen und die Zahlen dann über eine Schleife in ein Feld einzulese.Leider klappt das nicht so richtig,wenn ich ich zb. 1011 über die Schleife in das Feld einlese kommt 1000000000000000 raus.
Ich bin absoluter Anänger und komm nicht drauf.
Danke im Voraus
#include <iostream>using namespace std;
int main()
{long binwert,position=0;
//feld zum speichern ergebnis der modulo operation
long feld[16];
//feld wird mit null besetzt
for (long index=0;index<16;index++)
feld[index]=0;
//einlesen
cout<<"Bitte Dualzahl eingeben"<<endl;
cin>>binwert;
//berechnung modulo
do{
feld[position]=binwert%10;
//nächste position
position++;
//letzte stelle wird gelöscht
binwert=binwert/10;}while(binwert== 0 && binwert == 1);
//feld ausgebe
for (int index=0;index<16;index++){
cout<<feld[index];}//cout<<feld[position]<<endl;
return 0;
}
-
kite schrieb:
Hallo ich bin neu hier und brauche Hilfe.Ich muss in einer Hausarbeit ein Progamm schreiben welches Dualzahlen in Dezimalzahlen umrechnet. Ich habe Mir überlegt die Dualzahl in einen int einzulesen und die Zahlen dann über eine Schleife in ein Feld einzulese.Leider klappt das nicht so richtig,wenn ich ich zb. 1011 über die Schleife in das Feld einlese kommt 1000000000000000 raus.
Ich würde sagen, dies ist der falsche Ansatz. Die Dualdarstellung einer Zahl ist eben kein int, sondern eine Zeichenfolge. Das sollte im Programm auch so sein. Hingegen ist das was du am Ende haben möchtest eben keine Zeichenfolge mehr (es sei denn, du wärst wirklich nur an der Dezimaldarstellung interessiert und möchtest nicht damit rechnen) und daher wäre hier ein Integertyp angebracht.
Dein konkreter Fehler hier ist übrigens die Abbruchbedingung der Schleife. Da steht "solange wie binwert == 0 und binwert == 1 ist". Das ist logischerweise nie der Fall, daher wird sofort abgebrochen. Auch wenn du das leicht beheben kannst, würde ich trotzdem noch meinen Rat zu den Datentypen berücksichtigen.
-
Hallo erstmal danke für die schnelle Hilfe,habs hin bekommen.Allerdings stellt sich mir schon die nächste Frage.Ich würde gerne die Eingabe überprüfen ob sie mehr als 16 stellen hat.zb
if (binwert>1111111111111111)cout<<falsche Eingabe;
Wenn ich das so schreibe erhalte ich die Fehlermeldung :error:integer constant is to large for "long" type
Ich habs auch schon mit unsigned long versucht hat aber leider auch nicht geklappt.
-
SeppJ schrieb:
... dies ist der falsche Ansatz. Die Dualdarstellung einer Zahl ist eben kein int, sondern eine Zeichenfolge. Das sollte im Programm auch so sein.
-
Hier mal eine straightforward Lösung:
SeppJ schrieb:
Die Dualdarstellung einer Zahl ist eben kein int, sondern eine Zeichenfolge.
Damit haben wir schonmal einen Datentyp, den wir brauchen: std::string.
Jetzt brauchen wir noch was, in das wir den std::string reinstecken können und das mit Bits umgehen kann. Wir durchstöbern also die Container die C++ bietet und finden std::bitset.Das wars auch schon. Mehr brauchen wird nicht.
#include <bitset> #include <iostream> #include <string> using namespace std; int main() { string bits; cout << "Bitfolge: "; cin >> bits; if( bits.length() > 16 ) { cout << "Fehler! Maximal 16 Bits!"; } else { bitset<16> bits_handle( bits ); cout << "Zahl: "; cout << bits_handle.to_ulong(); } }