Dual zu dezimal - ich finde den fehler einfach nicht



  • Hallo,

    für ien Aufgabe soll ich ein Programm schreiben, das dual in dezimalzahl umrechnet. Soweit so gut. ich habe folgendes geschrieben. laufen tuts, nur rechnet es nicht richtig (ich weiß das die addition noch fehl). aber ich finde den fehler einfach nicht. kann mir jemand bitte einen hinweis geben? wäre super. vielen dank.

    hier der Code:

    [code]
    #include <iostream>
    #include <math.h>
    
    using namespace std;
    
    int main()
    {
        unsigned int wert;           //der eingegebene Wert
        unsigned int wertAnz = 0;    // Variable für die Stellenanzahl
        unsigned int wertZif = 0;    //Varibale für die Ziffern
        unsigned int stellen = 0;    //die anzahl der stellen
        unsigned int ziffer[16];     //die Ziffern
        unsigned int vergebnis = 0;
        unsigned int eergebnis = 0;
    
        cout << "eingabe: ";
        cin >> wert;
    
        wertAnz = wert;
        wertZif = wert;
    
        //stellen ermitteln
        while(wertAnz > 0)
         {
             wertAnz = wertAnz / 10;
             stellen++;
         }
    
        //wert in einzelne ziffern zerlegen und einzeln merken
        int positionZif;
        for (positionZif = 15; positionZif >= 0; positionZif--)
    
        while (wertZif > 0)
        {
            ziffer[positionZif] = wertZif % 10;
            positionZif--;
            wertZif = wertZif / 10;
        }
    
        //potenzen bilden
    for (int index = 15; index >= 0; index--)
    while (stellen > 0)
    {
    
        vergebnis = ziffer[index] * pow(2,stellen);
        index--;
        stellen--;
    
    //eergebnis = ziffer[1] + ziffer[2] + ziffer[3];
    
        cout << vergebnis;
    '\n';
    //cout << ziffer[index] << endl;
    }
    
        //cout << "Anzahl Stellen " << stellen << endl;
        //cout << "Restwert Stellen " << wertAnz << endl;
        //cout << "Eingabe Wert " << wert << endl;
        //cout << "wertZif " << wertZif << endl;
    
    return 0;
    }
    


  • bergemann9579 schrieb:

    Hallo,
    für ien Aufgabe soll ich ein Programm schreiben, das dual in dezimalzahl umrechnet.

    Also zum Beispiel 1101(2) in 13(10)?
    Dann ist es eine unglückliche Wahl, einen int einzulesen, Damit liest Du ja schon die Eingabe "1011" dezimal ein und hast dann 1011(10) in der Hand.

    bergemann9579 schrieb:

    Soweit so gut. ich habe folgendes geschrieben. laufen tuts, nur rechnet es nicht richtig (ich weiß das die addition noch fehl). aber ich finde den fehler einfach nicht. kann mir jemand bitte einen hinweis geben?

    Leider nicht, weil ich Deinen Code kein Bißchen nachvollziehen kann. Ich bin mal bei dem spaßigen Gedanken geblieben, die eingelesene Binärzahl in einem int zu lagern.

    #include <iostream>
    
    using namespace std;
    int main()
    {
        cout << "eingabe binaer: ";
        unsigned int binaer;
        cin >> binaer;
    
        unsigned int dezimal=0;
        while(binaer>0)
        {
            dezimal=dezimal*2+binaer%10;
            binaer/=10;
        }
    
        cout << "ausgabe dezimal: "<<dezimal<<'\n';
    }
    


  • volkard schrieb:

    #include <iostream>
    
    using namespace std;
    int main()
    {
        cout << "eingabe binaer: ";
        unsigned int binaer;
        cin >> binaer;
    
        unsigned int dezimal=0;
        while(binaer>0)
        {
            dezimal=dezimal*2+binaer%10;
            binaer/=10;
        }
    
        cout << "ausgabe dezimal: "<<dezimal<<'\n';
    }
    

    Bist Du sicher, dass die vom LSB aus analysierten Bits der Binärzahl nachher an der richtigen Stelle der Dezimalzahl ankommen? Versuche mal "1000000"... Überrrrraschung!
    Und was tut der Code, wenn man "1234" eingibt?


  • Mod

    minastaros schrieb:

    Und was tut der Code, wenn man "1234" eingibt?

    Das ist eines der Probleme, die volkard mit

    volkard schrieb:

    Dann ist es eine unglückliche Wahl, einen int einzulesen,

    meinte. Das ist dem Threadersteller verschuldet. Eine bessere Wahl für den Datentyp einer Ziffernkette wäre eine Zeichenkette. Wenn man es übertrieben korrekt haben möchte, lässt man für die Ziffernkette sogar nur die zum System passenden Ziffernzeichen zu. Was jedoch nicht ganz wenig Arbeit wäre.



  • minastaros schrieb:

    Bist Du sicher, dass die vom LSB aus analysierten Bits der Binärzahl nachher an der richtigen Stelle der Dezimalzahl ankommen? Versuche mal "1000000"... Überrrrraschung!

    Upps. Sie kommen genau falschrum.
    Oki, mein Code war falsch.

    Die Eingabe sollte mit string gemacht werden. Da kann man sich die Ausleserichtung aussuchen und das Problem ist weg.



  • @Volkard: die "1234" sollten nicht überheblich klingen 😉 Mir war schon klar, dass Du auf string rauswolltest.

    Geht prinzipiell zwar auch mit unsigned int , nur macht cin hier Probleme, sobald es über 10 Ziffern geht. Ich dachte an sowas:

    #include <iostream>
    #include <stdexcept>
    
    using namespace std;
    int main()
    {
        cout << "eingabe binaer: ";
        unsigned int binaer;
        cin >> binaer;
    
        unsigned int dezimal=0;
        unsigned int faktor = 1;
        while( binaer>0 )
        {
            if( faktor == 0 ) throw out_of_range( "Binärzahl zu groß." );
            unsigned int bit = binaer % 10;
            if( bit > 1 ) throw invalid_argument( "Ziffer nicht 0 oder 1." );
            dezimal += bit * faktor;
            faktor <<= 1;
            binaer /= 10;
        }
    
        cout << "ausgabe dezimal: "<<dezimal<<'\n';
    }
    

    Um noch etwas klugzuscheißen (und das war mit Sicherheit nicht die Lösung, an die der Aufgabensteller von seiner Didaktik her gedacht hatte), bin beim Stöbern über bitset gestolpert, das macht die Zeichenprüfung selbst:

    #include <iostream>
    #include <bitset>
    #include <limits>
    #include <stdexcept>
    using namespace std;
    
    enum{ MAX_DIGITS = std::numeric_limits<unsigned long>::digits };
    
    int main()
    {
        cout << "eingabe binaer: ";
        std::string binaer;
        cin >> binaer;
        if( binaer.length() > MAX_DIGITS ) throw out_of_range( "Binärzahl zu groß." );
    
        std::bitset< MAX_DIGITS > mybitset( binaer );
        unsigned long dezimal = mybitset.to_ulong();
        cout << "ausgabe dezimal: "<<dezimal<<'\n';
    
    	return 0;
    }
    


  • minastaros schrieb:

    enum{ MAX_DIGITS = std::numeric_limits<unsigned long>::digits };
    

    😕 Wieso nicht const unsigned long ??



  • Rein intuitiv würde ich behaupten, dass es nichtmal erlaubt ist, dass die const- oder volatile-Modifikation eines Typen seine Größe ändert.
    Hat jemand Lust, im Standard nachzuschauen?



  • out schrieb:

    minastaros schrieb:

    enum{ MAX_DIGITS = std::numeric_limits<unsigned long>::digits };
    

    😕 Wieso nicht const unsigned long ??

    Bei bitsets geht das genauso, da hast Du recht. Allerdings würde ich dann const size_t nehmen, da Größe für bitset (auch wenn digits streng genommen vom Typ int ist).
    Das mit den enums ist ne Marotte von der Definition von Arrays, weil Konstanten da nicht gehen ( int myArray[ einConst ] ). Hab das gedanklich dahin übertragen.



  • Vor C++11 ging das nicht.
    Nach C++11 gibts constexpr.
    Warum also enum?
    A) gibts constexpr.
    😎 reicht const .



  • minastaros schrieb:

    Das mit den enums ist ne Marotte von der Definition von Arrays, weil Konstanten da nicht gehen ( int myArray[ einConst ] ). Hab das gedanklich dahin übertragen.

    Um genau zu sein, früher gingt
    static const int size=100;
    nicht innerhalb einer Klasse, da nahm man den Umweg per enum.
    Jetzt geht es. Sogar schon lange. Hast evtl nur das static vergessen bei den letztenb Versuchen, eine Klassenkonstante zu häkeln.



  • Nathan schrieb:

    [...]
    Warum also enum?
    A) gibts constexpr.
    😎 reicht const .

    Wie gesagt, ich war gedanklich gerade bei den Arrays (und definitiv noch vor C++11). Klar geht das auch:

    const size_t MAX_DIGITS = std::numeric_limits<unsigned long>::digits;
    

    volkard schrieb:

    [...]Jetzt geht es. Sogar schon lange. Hast evtl nur das static vergessen bei den letztenb Versuchen, eine Klassenkonstante zu häkeln.

    Tatsächlich ist es ewig her, dass ich Array in der Form überhaupt benutzt hab, und das war glaub ich ein C-Projekt und damals enums die Lösung. Trotzdem danke für die Details mit dem static const + Arrays, man lernt nie aus.


Anmelden zum Antworten