Hilfe bei Umwandlung von Dezimal in Binär



  • Moin,

    mein Name ist Florian und ich studiere Maschinenbau im ersten Semester.
    Ich hatte eine Einführung in C++ und soll jetzt ein Programm von Dezimal in Binärzahlen schreiben. Ich weiß, dass das schon etliche Male beantwortet wurde, ich habe nur zwei Probleme:

    Ich soll dass Array mit Hilfe einer Schleife ausgeben (bei mir kommt z.B bei einer 6 als Dezimalzahl eine 2 vor) und bei mir kommen die Zahlen falschrum raus. Vielmehr als Schleifen, Arrays etc. hatten wir noch nicht.
    Das hier habe ich schon fabriziert

    int main (){
    int x;
    std::cin >>x;
    if (x>255||x<0){
    std::cout<< "out of bounds" << std::endl;
    return 0;

    }
    int binaer [8];
    
    for (int i = 0;i < 8;i++)
        {
        if (x%2 == 0)
        {
        binaer[8]=0;
        }
            else
        {
        binaer[8]=1;
        }
        x=x/2;
    
        int h;
    
    for(h=0; h<=8;h++) ;
    
    std::cout<<binaer [h] ;
    
    		}
    

    Es wäre super, wenn mir trotzdem jemand helfen könnte.

    Ich hätte auch gerne einen Tipp, wie ich mir am besten C++ aneignen kann.

    Schönen Abend noch

    Florian



  • Du musst in Zeile 8 und 12 als Index im Array auch die Laufvariable i verwenden.



  • Hi! Ein paar Kommentare zu deinem Code (habe mir die Freiheit genommen, den etwas angenehmer zu formatieren):

    @SBHH sagte in Hilfe bei Umwandlung von Dezimal in Binär:

    int main (){
        int x;
        std::cin >>x;
    
        // Vorzeitiges 'return', das finde ich gut!
        // Das kannste dir ruhig angewöhnen - trägt m.E. zur besseren
        // Verständlichkeit bei und vermeidet oft zu tiefe 'if'-Schachtelungen,
        // bei denen niemand mehr durchblickt. 
        if (x>255||x<0){
            // Eine Alternative wäre, Fehler auf std::cerr auszugeben, auch wenn das
            // hier jetzt nicht wirklich wichtig ist. So kann man Fehler und Warnmeldungen
            // von der eigentlichen Ausgabe des Programms trennen - das ist hilfreich für
            // Skripte und andere Programme, die dein Programm aufrufen.
            std::cout<< "out of bounds" << std::endl;
            // Vielleicht möchte man im Fehlerfall wenn überhaupt etwas anderes
            // als 0 zurückgeben. Die 0 steht normalerweise für "Kein Fehler". Das
            // ist aber für so eine Übung auch nicht wirklich wichtig, dennoch mal 
            // erwähnenswert.
            return 0;
        }
    
        int binaer [8];
    
        for (int i = 0;i < 8;i++)
        {
            // Hier ein Tip für die "Kür". Die Werte, die du in das Array
            // schreibst, sind exakt das Ergebnis der Berechnung 'x % 2'
            // Das könnte man also theoretisch komplett ohne 'if' formulieren.
            // Auch wenn das für Anfänger nicht wirklich relevant ist, aber
            // wenn man auf "Branches" ('if' und sowas) so einfach wie hier
            // verzichten kann, dann ist es nicht verkehrt, das auch auszunutzen.
            // Das ist nicht selten für die Performance förderlich :-).
            if (x%2 == 0)
            {
                // wie @axels bereits erwähnte, verwende hier deine Laufvariable 'i'
                binaer[8]=0;
            }
            else
            {
                // s.o.
                binaer[8]=1;
            }
    
            x=x/2;
    
        // hier fehlt ein '}', um den Block des Schleifenkörpers abzuschließen.
    
        // Dieses 'h' kann man auch wie das 'i' in der vorherigen Schleife  
        // direkt im Schleifenkopf deklarieren - for (int h = 0; ... ).
        // Das spart eine Zeile und macht die Variable 'h' auch nur innerhalb
        // der Schleife gültig. Das ist übrigens auch der Grund, weshalb du
        // hier auch problemlos wieder den Variablennamen 'i' verwenden
        // könntest: das 'i' aus der vorherigen Schleife existiert nur innerhalb
        // des Schleifenkörpers (Stichwort 'scope').
        int h;
        // Das Semikolon am Ende der 'for'-Anweisung führt dazu, dass du
        // damit einen leeren Schleifenkörper definierst. D.h. das nachfolgende
        // 'std::cout<<binaer [h]' wird nicht innerhalb dieser Schliefe ausgeführt.
        // Was du hier geschrieben hast ist dasselbe wie: for(h=0; h<=8;h++) {}
        for(h=0; h<=8;h++) ;
        // Ebenfalls: Dein Array ist 8 Elemente lang, hat also nur Indizes von 0..7,
        // Schau dir nochmal deine Schleifeneintrittsbedingung an. Die ist nicht
        // ganz korrekt und wird auf ein Element ausßerhalb des Arrays zugreifen.
        // Das ist ein Bug, der je nach Kontext schonmal sicherheitskritisch werden 
        // kann.
        std::cout<<binaer [h] ;
    
    }
    

    Habe das jetzt nicht getestet. Gut möglich also, dass ich nochwas übersehen habe 😉



  • @Finnegan sagte in Hilfe bei Umwandlung von Dezimal in Binär:

    Gut möglich also, dass ich nochwas übersehen habe

    Einen wichtigen Tipp hast du noch vergessen. Sowas hier:

        int binaer [8];
        (...)
        for (int i = 0;i < 8;i++)
    

    ist sehr leicht fehleranfällig. Wenn du die eine 8 änderst, musst du auch gleich alle 8en an anderen Stellen ändern. Definieren sowas daher als Konstante einmalig.

    Also:
    const int max_bits = 8;
    Und dann verwendest du im folgenden nur noch max_bits. Das macht es im Code auch gleich klarer, wofür die 8 denn stehen soll. Damit könntest du auch die 255 im Check für x umformulieren und sie aus den max_bits ermitteln.

    Noch ein Hinweis: Die Größe eines C-Style Arrays (dein binaer) kannst du mit einer Konstanten festlegen, aber nicht mit einer Variablen.



  • Mega cool von euch, hilft mir sehr viel weiter!

    Könnte ich also statt if&else einfach schreiben?:

    x%2 == binaer [i];
    x=x/2;

    Bekomme ich noch einen Hinweis, wie ich rausfinden kann, wie man die Stellen andersherum aus dem Array abruft?

    Nochmal danke 🙂



  • @SBHH sagte in Hilfe bei Umwandlung von Dezimal in Binär:

    Mega cool von euch, hilft mir sehr viel weiter!

    Könnte ich also statt if&else einfach schreiben?:

    x%2 == binaer [i];
    x=x/2;
    

    Nein, das ist ein Vergleich ("ist x % 2 gleich binaer[i]?"), dessen Ergebnis (true oder false) du verwirfst, weil du nichts damit machst.
    Du willst stattdessen eine Zuweisung haben:

    binaer[i] = x % 2;
    

    Sprich "setze den Wert des i-ten Array-Elements auf das Ergebnis des Ausdrucks x % 2".

    Bekomme ich noch einen Hinweis, wie ich rausfinden kann, wie man die Stellen andersherum aus dem Array abruft?

    Ja, statt die Ausgabeschleife von 0 bis 7 laufen zu lassen, lass sie einfach rückwärts von 7 bis 0 laufen.
    Bzw. an @wob s Vorschlag angelehnt von max_bits - 1 bis 0.

    Andere Möglichkeit: Lass die Schleife wie sie ist und verwende statt den Index i den Index 7 - i, bzw. max_bits - 1 - i

    ... die Schleife selbst rückwärts laufen zu lassen ist aber denke ich die bessere Anfängerübung.

    Nochmal danke 🙂

    Gern 😉



  • Ich habs geschafft 🙂
    Bist der Beste !


Log in to reply