Hilfe beim arbeiten mit Feldern



  • @Fischbrezel sagte in Hilfe beim arbeiten mit Feldern

    Ich bleibe dennoch an dieser Aufgabe dran, da ich sie nicht auf diese weise lösen wollte. Ab jetzt ist es halt nicht für meine Lehre, sondern für mein Ego. ^^

    Als Anregung hilft dir vielleicht auch dieser Kollege hier weiter, der immer sehr gute Erklärungen zu verschiedenen Grundlagenthemen gibt. Für den umgekehrten Fall (Dezimal in Binär) gibt's hier z.B. ein Video von ihm:
    https://www.youtube.com/watch?v=u6nYYCJ7Zuo

    Oder zum Nachschlagen find ich auch diese Reihe hier gut:
    https://www.youtube.com/watch?v=nFM0SuPSxnc&list=PLfthkO_8dYCqARBKnZQm6Ck614Td9Vmz7



  • So würde ich das lösen, wenn die Aufgabenstellung wäre:
    Verwende nur den iostream:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        char Binaer[7];
        int Dezimal;
        int E0,E1,E2,E3,E4,E5,E6,E7;
        do{
            cout<<"8 Bits eingeben: ";
            cin>>Binaer;
            cout<<Binaer[0]<<Binaer[1]<<Binaer[2]<<Binaer[3]
                <<Binaer[4]<<Binaer[5]<<Binaer[6]<<Binaer[7]<<endl;
        }while((Binaer[0] != '0' && Binaer[0] != '1')
                ||(Binaer[1] != '0' && Binaer[1] != '1')
                ||(Binaer[2] != '0' && Binaer[2] != '1')
                ||(Binaer[3] != '0' && Binaer[3] != '1')
                ||(Binaer[4] != '0' && Binaer[4] != '1')
                ||(Binaer[5] != '0' && Binaer[5] != '1')
                ||(Binaer[6] != '0' && Binaer[6] != '1')
                ||(Binaer[7] != '0' && Binaer[7] != '1'));
    
        if (Binaer[7] == '1')
            E7 = 1;
        else
            E7 = 0;
    
        if (Binaer[6] == '1')
            E6 = 2;
        else
            E6 = 0;
    
        if (Binaer[5] == '1')
            E5 = 4;
        else
            E5 = 0;
    
        if (Binaer[4] == '1')
            E4 = 8;
        else
            E4 = 0;
    
        if (Binaer[3] == '1')
            E3 = 16;
        else
            E3 = 0;
    
        if (Binaer[2] == '1')
            E2 = 32;
        else
            E2 = 0;
    
        if (Binaer[1] == '1')
            E1 = 64;
        else
            E1 = 0;
    
        if (Binaer[0] == '1')
            E0 = 128;
        else
            E0 = 0;
    
        Dezimal = E7+E6+E5+E4+E3+E2+E1+E0;
        cout<<"Die Dezimalzahl ist: "<<Dezimal<<endl;
    
        return 0;
    }
    


  • @theAnfänger77
    Du weißt wie man Schleifen benutzt?
    Die ganze Kaskade kann man ohne Hilfsvariablen in einer einzigen Schleife lösen.

    1. Initialisiere das Ergebnis mit 0
    2. für jedes Zeichen im String:
      - Schiebe Ergebnis 1 bit nach links
      - setze Bit 0 im Ergebnis, falls das aktuelle Zeichen eine '1' ist


  • @theAnfänger77 sagte in Hilfe beim arbeiten mit Feldern:

    char Binaer[7];

    Das ist ja noch schlimmer als die Lösung von @RBS2.



  • An die Anfänger/Neulinge:
    bitte kompiliert euren Code immer mit eingeschalteten Warnungen!

    Wenn ich den Code von @theAnfänger77 kompiliere, ergibt sich:

    $ clang++-7 -Wall -Wextra forum.cpp                   
    forum.cpp:14:48: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds]
                <<Binaer[4]<<Binaer[5]<<Binaer[6]<<Binaer[7]<<endl;
                                                   ^      ~
    forum.cpp:7:5: note: array 'Binaer' declared here
        char Binaer[7];
        ^
    forum.cpp:22:16: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds]
                ||(Binaer[7] != '0' && Binaer[7] != '1'));
                   ^      ~
    forum.cpp:7:5: note: array 'Binaer' declared here
        char Binaer[7];
        ^
    forum.cpp:22:36: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds]
                ||(Binaer[7] != '0' && Binaer[7] != '1'));
                                       ^      ~
    forum.cpp:7:5: note: array 'Binaer' declared here
        char Binaer[7];
        ^
    forum.cpp:24:9: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds]
        if (Binaer[7] == '1')
            ^      ~
    forum.cpp:7:5: note: array 'Binaer' declared here
        char Binaer[7];
        ^
    4 warnings generated.
    

    Also - so funktioniert es nicht. Vergesst am Anfang erst einmal die Arrays und nehmt stattdessen std::string für Char-Arrays und std::vector für alle anderen Array-Typen. Ich verwende in C++ praktisch überhaupt keine C-Style-Arrays.


  • Gesperrt

    @manni66 sagte in Hilfe beim arbeiten mit Feldern:

    @theAnfänger77 sagte in Hilfe beim arbeiten mit Feldern:

    char Binaer[7];

    Das ist ja noch schlimmer als die Lösung von @RBS2.

    Was sagt der große Meister dazu?

    char Binaer[8];
    cin >> setw(8) >> Binaer;
    

    Immer noch Buffer Overflow?



  • @RBS2 sagte in Hilfe beim arbeiten mit Feldern:

    @manni66 sagte in Hilfe beim arbeiten mit Feldern:

    @theAnfänger77 sagte in Hilfe beim arbeiten mit Feldern:

    char Binaer[7];

    Das ist ja noch schlimmer als die Lösung von @RBS2.

    Was sagt der große Meister dazu?

    char Binaer[8];
    cin >> setw(8) >> Binaer;
    

    Immer noch Buffer Overflow?

    Herrgott noch mal...

    std::string ScheissEgalWievieleZeichenVerdammtNochMal = "";
    std::cin >> ScheissEgalWievieleZeichenVerdammtNochMal;
    

    😆

    Ich schwöre, ich poste hier gleich die fertige Lösung, damit hier endlich Ruhe ist....



  • @RBS2 sagte in Hilfe beim arbeiten mit Feldern:

    Was sagt der große Meister dazu?

    char Binaer[8];
    cin >> setw(8) >> Binaer;
    

    Immer noch Buffer Overflow?

    Wieviele Bits kann man da jetzt eingeben?

    Aber warum sollte man eine einfache Lösung verwenden, wenn man sich doch mit char-Arrays auf unendlich vielen Wegen in den Fuß schießen kann?


  • Gesperrt

    @manni66 sagte in Hilfe beim arbeiten mit Feldern:

    Wieviele Bits kann man da jetzt eingeben?

    Ich seh's schon. Es wird wieder eine überflüssige Null angehängt. 😭


  • Gesperrt

    @It0101 sagte in Hilfe beim arbeiten mit Feldern:

    Herrgott noch mal...
    std::string ScheissEgalWievieleZeichenVerdammtNochMal = "";
    std::cin >> ScheissEgalWievieleZeichenVerdammtNochMal;

    Der Herrgott kann nichts dafür. Das war bestimmt der Teufel, der 'cin' auch char-Arrays befüllen lässt.



  • Ach du heilige... ^^
    Zerfleischt euch jetzt nicht wegen einer Anfängerfrage.



  • So ungefähr würde wohl eine halbwegs gescheite Lösung aussehen. Um das Thema hier mal zu beschließen 😉

    int main( int argc, char **argv )
    {
        unsigned long long Dezimal = 0;
        // Zahl eingeben
        std::cout << "Gib eine Binaerzahl ein, beginnend mit dem niederwertigsten Bit: ";
        std::string Binaer = "";
        std::cin >> Binaer;
    
        // Bits berenzen
        if ( Binaer.size() > sizeof( Dezimal  ) * 8 )
        {
            std::cout << "Zuviele Bits fuer Zieldatentyp\n";
            return 0;
        }
    
        // Eingabe ueberpruefen
        for ( const char &bit : Binaer )
        {
            if ( bit != '0' && bit != '1' )
            {
                std::cout << "Binaerzahlen duerfen nur aus 0 oder 1 bestehen\n";
                return 0;
            }
        }
        std::cout << "Binaerzahl erfolgreich eingelesen\n";
    
        // Umrechnen in
        unsigned long long BitValue = 1;
        for ( const char &bit : Binaer )
        {
            if ( bit == '1' )
                Dezimal |= BitValue;
            BitValue = BitValue << 1;
        }
    
        std::cout << "Binaerzahl " << Binaer << " ins Dezimalsystem umgerechnet ergibt " << Dezimal << "\n";
        return 0;
    }
    


  • Warum die explizite Zuweisung in Zeile 5? Das erledigt doch schon der Konstruktor?
    Und warum steht das niederwertigste Bit am Anfang des strings und nicht am Ende?
    😆


  • Gesperrt

    @DocShoe sagte in Hilfe beim arbeiten mit Feldern:

    Warum die explizite Zuweisung in Zeile 5? Das erledigt doch schon der Konstruktor? 😆

    Für den C++ noob könnte so der Eindruck enstehen, 'cin' würde die Eingabe an den String anhängen.