Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Dualzahl umwandeln in Dezimalzahl

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
27.05.2015, 16:07 Uhr
msuser



Hallo zusammen,
ich habe vor kurzem mein Informatikstudium begonnen und habe nun die Aufgabe bekommen ein Konsolenprogramm in C++ zu schreiben welches Dualzahlen in Dezimal umwandelt. Leider komme ich mit meinem Programm nicht weiter. Anbei poste ich mal meinem bisherigen Quelltext.

C++:
#include <iostream>
#include <string>

using namespace std;


int main()
{
    //Inizialisierung von Eingabe, Ausgabe, Potenz und Zwischenspeicher
    int binEing, dezAusg=0, pot=1,dezZwischen=0, pos;
    string bin;


    // Einlesen des Dualwertes und Prüfung auf max 8. Stellen
    do{
        cout << "Geben sie den Dualwert ein, der umgerechnet werden soll (max. 8 Stellen): ";
        cin >> binEing;
    } while (binEing >11111111);

    //Umwandlung der Eingabe in einen String
    bin = binEing;

    //die Umrechnung
    for (pos =0; pos < bin.length(); pot *2, pos++)
    {
        if (bin[pos] == '1')
        {
           dezZwischen = dezZwischen + bin[pos]*pot;
        }
    }
    dezAusg = dezZwischen;
    cout << dezAusg << endl;

    return 0;
}


Das Programm scheint syntaktisch korrekt zu sein. Der Compiler meckert nicht. Als Ergebnis bekomme ich allerdings immer 0.

Könnt ihr mir einen Tipp geben was ich falsch mache?
Danke schon mal vorab.

Gruß Bernd

------
Edit: cpp-Tags gesetzt.

Dieser Post wurde am 29.05.2015 um 00:57 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.05.2015, 11:31 Uhr
ao

(Operator)


Der erste Fehler ist, dass du die Eingabe in eine Int-Variable einliest, d.h. du speicherst "10010" als Dezimalzahl (also zehntausend und zehn). In Dualdarstellung wäre das 10 0111 0001 1010.

Als nächstes weist du dem String bin diesen int-Wert zu. Das führt aber entgegen deiner Annahme nicht dazu, dass "10010" in dem String drinsteht. Der passendste =-Operator ist operator=(char c), d.h. die 10010 (dezimal) werden auf die unteren 8-Bit reduziert (0001 1010), was 26 (dezimal) entspricht. Das ist überhaupt nicht das, was du willst, und deswegen liefert das Programm auch immer denselben Unsinn.

Richtig ist, die Eingabe "10010" direkt in den String zu schreiben und den dann zeichenweise auseinander zu nehmen:


C++:
    // Einlesen des Dualwertes und Prüfung auf max 8. Stellen
    string bin;
    do{
        cout << "Geben sie den Dualwert ein, der umgerechnet werden soll (max. 8 Stellen): ";
        cin >> bin;
    } while (bin.length() > 8);



Du solltest dir angewöhnen, Kontrollausgaben einzubauen. cout << bin << endl; an dieser Stelle zeigt dir sofort an, ob das Programm deine Eingabe richtig verstanden hat.

Man muss dann wohl beachten, dass die Zeichen im String die falsche Reihenfolge haben (bin[0] ist das höchstwertige Bit). Das kann man auf verschiedene Weisen abfangen. Naiv könnte man in der Schleife die Indizierung von rechts beginnen lassen (also if (bin[bin.length() - pos - 1] == '1')), man kann aber auch einmal direkt nach der Eingabe den String spiegeln:


C++:
    //    Eingabe spiegeln (links <-> rechts)
    string rbin (bin.rbegin(), bin.rend());
    bin = rbin;



----------------------------------------------

Es gibt noch zwei weitere Fehler, auf die du erst dann stoßen wirst, wenn du die Eingaberoutine korrigiert hast:

Der zweite Fehler ist hier:

C++:
    for (pos =0; pos < bin.length(); pot * 2, pos++)


"pot * 2" ist ein Ausdruck ohne Wirkung, vermutlich meintest du "pot *= 2".

An dieser Stelle die Empfehlung, deinen Compiler auf höchste Empfindlichkeit bei den Warnungen zu schalten und die Ausgaben ernst zu nehmen. Mein gcc mit "-Wall" weist auf solche Vertipper sofort hin.

-----------------------------------------------

Dritter Fehler:

C++:
            dezZwischen = dezZwischen + bin[pos]*pot;


muss richtig heißen:

C++:
            dezZwischen = dezZwischen + pot;


bin[pos] ist das Zeichen '1', das hat nicht den Zahlenwert 1. Du würdest dir hier das Ergebnis verfälschen.

Dieser Post wurde am 28.05.2015 um 11:37 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.05.2015, 13:06 Uhr
msuser



Vielen vielen Dank ao für deine Hilfe. Das Programm funktioniert und ich habe wieder einiges dazu gelernt.

Schönes Wochenende.

Gruß Bernd
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: