Hilfe beim arbeiten mit Feldern



  • Allgemeine Programmier-Regel: Du musst bei JEDEM Zeichen in deinem Quellcode wissen, was es tut. Hast du ^ nachgeschlagen?


  • Gesperrt

    @manni66 sagte in Hilfe beim arbeiten mit Feldern:

        std::string input;
    

    Besser

    char input[8];
    

    ☺



  • Mit cin >> zahlFeld[8]; liest du kein Feld sondern nur ein Element ein.
    Hier das mit dem Index 8. Und das existiert nicht.


  • Gesperrt

    Für den Anfang ☺

    #include <iostream>
    #include <regex>
    using namespace std;
    
    int main()
    {
        char in[8];
        cout << "8 Bits eingeben ... ";
        cin >> in;
        if (regex_match(in, regex("[01]{8}")))
        {
            // TODO: nach Dezimal umrechnen
        }
        else
        {
            cout << "Falsche Eingabe!" << endl;    
        }
    }
    
    


  • @out sagte in Hilfe beim arbeiten mit Feldern:

    Allgemeine Programmier-Regel: Du musst bei JEDEM Zeichen in deinem Quellcode wissen, was es tut. Hast du ^ nachgeschlagen?

    Danke für den Hinweis, da habe ich wohl was komplett falsches eingegeben gehabt.
    pow(a,b) sollte in diesem Fall richtig sein, oder?

    @RBS2 sagte in Hilfe beim arbeiten mit Feldern:

    Für den Anfang ☺

    #include <iostream>
    #include <regex>
    using namespace std;
    
    int main()
    {
        char in[8];
        cout << "8 Bits eingeben ... ";
        cin >> in;
        if (regex_match(in, regex("[01]{8}")))
        {
            // TODO: nach Dezimal umrechnen
        }
        else
        {
            cout << "Falsche Eingabe!" << endl;    
        }
    }
    
    

    Ich habe den Code so eingegeben und CodeBlocks hat bei regex angefangen zu streiken. ^^


  • Gesperrt

    @Fischbrezel sagte in Hilfe beim arbeiten mit Feldern:

    Ich habe den Code so eingegeben und CodeBlocks hat bei regex angefangen zu streiken. ^^

    C++ hat Regex erst seit der Version 11: http://www.cplusplus.com/reference/regex/

    Du solltest Compiler und Standard Library updaten,
    oder du schmeißt die Überprüfung einfach raus. Ist ja nicht für deine Aufgabe relevant.



  • @Fischbrezel sagte in Hilfe beim arbeiten mit Feldern:

    pow(a,b) sollte in diesem Fall richtig sein, oder?

    Ist aber nicht nötig.

    Das Hornerschema wurde schon genannt.

    Du fängst beim ersten Wert/Index an
    Dann nimmst den aktuellen Wert und addierst den zum Ergebnis.
    Wenn es noch Stellen gibt, multiplizierst du das Ergebnis mit 2 (wegen Dualsystem) und gehst zum nächsten Wert/Index

    Mal als Beispiel den Wert "1001"

    Ergebnis = 0;
    Index 0 = 1
    Ergebnis * 2 -> Ergebnis = 0
    Ergebnis + 1 -> Ergebnis = 1

    Index 1 = 0
    Ergebnis * 2 -> Ergebnis = 2
    Ergebnis + 0 -> Ergebnis = 2

    Index 2 = 0
    Ergebnis * 2 -> Ergebnis = 4
    Ergebnis + 0 -> Ergebnis = 4

    Index 3 = 1
    Ergebnis * 2 -> Ergebnis = 8
    Ergebnis + 1 -> Ergebnis = 9

    Index 4 gibt es nicht: fertig

    Ergebnis = 9

    Das kann man in einer Schleife machen.

    Da du nur die Binärdarstellung der Zahl haben möchtest, kannst du auch mit Zeichen/Strings arbeiten.
    Du musst nur beachten, dass das Zeichen '0' nicht den Wert Null hat.
    Eine Überprüfung aob überhaupt nur Nullen und Einsen eingegeben wurde wäre auch nicht schlecht. (Das macht das regex_match, geht aber auch in der Schleife)


  • Gesperrt

    Davon abgesehen funktioniert mein Code nicht einmal.
    Statt Zeile 10 muß sowas hin:

    regex r = regex("[01]{8}");
    if (regex_match(in, r))
    

    Warum auch immer. C++ ist eben seltsam. Oder ich bin zu doof dafür.



  • @RBS2 sagte in Hilfe beim arbeiten mit Feldern:

    @manni66 sagte in Hilfe beim arbeiten mit Feldern:

        std::string input;
    

    Besser

    char input[8];
    

    ☺

    Wenn du "besser" durch "gefährlicher" ersetzt... An den @Fischbrezel: halte dich an @manni66 s Vorschlag


  • Gesperrt

    @wob sagte in Hilfe beim arbeiten mit Feldern:

    Wenn du "besser" durch "gefährlicher" ersetzt...

    Schreibt dann 'cin' über die Arraygrenze hinaus?



  • Zwar war das nicht mein Plan, ich musste aus Zeitgründen, den Code so simple und dennoch umständlich wie möglich gestalten, da die Aufgabe zu meinen Einsendeaufgaben gehört und ich bereits an den drei Aufgaben (Diese hier ist die dritte) seit drei Wochen dran hänge. ^^

    Ich habe es jetzt so gemacht, dass ich jede Ziffer der Binärzahl einzeln und nacheinander eintippen muss. Die Ziffern werden direkt überprüft ob diese größer ist als 2.
    Gerechnet habe ich:

    input = input*pow(a,b)
    

    und die einzelnen Input(1-8) habe ich dann addiert.

    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. ^^



  • @RBS2 Ja.
    Außerdem: warum char[x] benutzen, wenn es mit String auch geht?

    Und char[8] reicht für 7 Zeichen + '\0', nicht für 8 Zeichen.


  • Gesperrt

    @wob sagte in Hilfe beim arbeiten mit Feldern:

    @RBS2 Ja.
    Außerdem: warum char[x] benutzen, wenn es mit String auch geht?

    Und char[8] reicht für 7 Zeichen + '\0', nicht für 8 Zeichen.

    Jammerschade; ich glaubte 'cin' würde die Array-Länge kennen. Habe lange kein C++ mehr gemacht, die Hälfte vergessen. Bin eben Java-verwöhnt. ☕

    Immerhin freut mich, dass C++ inzwischen Regexe hat. Vielleicht kannst du mir erklären, warum meine erste Version nicht geht, aber die mit der Variablen tut's dann. Seltsam, oder?



  • @Fischbrezel sagte in Hilfe beim arbeiten mit Feldern:

    den Code so simple ... wie möglich gestalten,

    Das ist C:

    int myBinaryTtoI(char *str) 
    { 
        int ergebnis = 0; 
       
        for (int i = 0; str[i] != '\0'; ++i) 
            ergebnis = ergebnis * 2 + str[i] - '0'; 
       
        return ergebnis ; 
    } 
       
    int main() 
    { 
        char str[] = "1001"; 
        int val = myBinaryTtoI(str); 
        printf ("%d ", val); 
        return 0; 
    }
    


  • @RBS2 sagte in Hilfe beim arbeiten mit Feldern:

    Jammerschade; ich glaubte 'cin' würde die Array-Länge kennen. Habe lange kein C++ mehr gemacht, die Hälfte vergessen. Bin eben Java-verwöhnt.

    Verwendest du in Java auch char[] c = new char[8], wenn du eigentlich einen String lesen willst? Vermeidest du java.lang.String? Nein? Dann nimm in C++ auch einfach std::string!

    Immerhin freut mich, dass C++ inzwischen Regexe hat. Vielleicht kannst du mir erklären, warum meine erste Version nicht geht, aber die mit der Variablen tut's dann. Seltsam, oder?

    Beide Varianten sind entweder false, weil der String zu kurz ist und somit nicht passt - oder aber du hast in beiden Varianten undefiniertes Verhalten, weil du 8 (oder mehr) Zeichen eingegeben hast und somit mindestens ein Zeichen hinter den Puffer geschrieben hast. Es sind also beide Varianten von dir falsch. Nimm std::string!


  • Gesperrt

    @wob sagte in Hilfe beim arbeiten mit Feldern:

    Beide Varianten sind entweder false, weil der String zu kurz ist und somit nicht passt - oder aber du hast in beiden Varianten undefiniertes Verhalten, weil du 8 (oder mehr) Zeichen eingegeben hast und somit mindestens ein Zeichen hinter den Puffer geschrieben hast. Es sind also beide Varianten von dir falsch.

    Danke für die Erklärung. Mit 'string' geht auch die erste Variante.


  • Gesperrt

    @wob sagte in Hilfe beim arbeiten mit Feldern:

    Verwendest du in Java auch char[] c = new char[8], wenn du eigentlich einen String lesen willst?

    Das habe ich bestimmt auch mal versucht, aber die ArrayIndexOutOfBoundsException hat mich eines Besseren belehrt.



  • @RBS2 ...dann kompiliere in C++ doch mit g++/clang++ -fsanitize=address ... oder vermeide einfach C-style Arrays.



  • @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;
    }