Schleife Abbruchbedingung klappt nicht



  • int main()
    {
        int index = 0, groessterIndex, n, ergebnis;
        int dualzahl[20];
    
        cout << "Sie werden jetzt aufgefordert, die einzelnen Stellen einer Dualzahl \nIhrer Wahl einzugeben. Fuer den Abbruch geben Sie 2 ein." << endl << endl;
    
        do
              {
                cout << "Bitte geben Sie die " << index + 1 << ". Ziffer der Dualzahl Ihrer Wahl ein: ";
                cin >> dualzahl[index];
                index++;
              } while (dualzahl[index] != 2);
    
    

    Liebe Leute,
    wenn ich die 2 eingebe, läuft die Schleife einfach weiter und hört nicht auf, geht also nicht zur nächsten Aktion. Warum ist das so? Ich möchte, dass mit Eingabe der 2 die Schleife abbricht.

    LG
    Dickie



  • Dasselbe Problem wie eben in grün. Debugger!



  • @dickie ftfy:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	int index = 0;
    	int dualzahl[20];
    
    	cout << "Sie werden jetzt aufgefordert, die einzelnen Stellen einer Dualzahl\nIhrer Wahl einzugeben. Fuer den Abbruch geben Sie 2 ein.\n\n";
    
    	do {
    		cout << "Bitte geben Sie die " << index + 1 << ". Ziffer der Dualzahl Ihrer Wahl ein: ";
    		cin >> dualzahl[index];
    	} while (dualzahl[index++] != 2);
    }
    

    Aber jetzt kann ich mehr Ziffern als 20 Eingeben ... 23 und dann springt die Eingabe zur 3. Ziffer:

    Bitte geben Sie die 23. Ziffer der Dualzahl Ihrer Wahl ein: 1
    Bitte geben Sie die 3. Ziffer der Dualzahl Ihrer Wahl ein: 1
    

    ??

    Und wenn ich etwas anderes als eine Zahl eingebe, dann steht da plötzlich

    Bitte geben Sie die 2. Ziffer der Dualzahl Ihrer Wahl ein: Bitte geben Sie die 3
    . Ziffer der Dualzahl Ihrer Wahl ein: Bitte geben Sie die 4. Ziffer der Dualzahl
     Ihrer Wahl ein: Bitte geben Sie die 5. Ziffer der Dualzahl Ihrer Wahl ein: Bitt
    e geben Sie die 6. Ziffer der Dualzahl Ihrer Wahl ein: Bitte geben Sie die 7. Zi
    ffer der Dualzahl Ihrer Wahl ein: Bitte geben Sie die 8. Ziffer der Dualzahl Ihr
    er Wahl ein: Bitte geben Sie die 9. Ziffer der Dualzahl Ihrer Wahl ein: Bitte ge
    ben Sie die 10. Ziffer der Dualzahl Ihrer Wahl ein: Bitte geben Sie die 11. Ziff
    er der Dualzahl Ihrer Wahl ein: Bitte geben Sie die 12. Ziffer der Dualzahl Ihre
    r Wahl ein: Bitte geben Sie die 13. Ziffer der Dualzahl Ihrer Wahl ein: Bitte ge
    ben Sie die 14. Ziffer der Dualzahl Ihrer Wahl ein: Bitte geben Sie die 15. Ziff
    [...]
     Bitte geben Sie die 489. Ziffer der Dualzahl Ihrer Wahl ein: Bitte geben Sie di
    e 490. Ziffer der Dualzahl Ihrer Wahl ein: Bitte geben Sie die 491. Ziffer der D
    ualzahl Ihrer Wahl ein: Bitte geben Sie die 492. Ziffer der Dualzahl Ihrer Wahl 
    ein: Bitte geben Sie die 493. Ziffer der Dualzahl Ihrer Wahl ein: Bitte geben Si
    e die 494. Ziffer der Dualzahl Ihrer Wahl ein: Bitte geben Sie die 495. Ziffer d
    er Dualzahl Ihrer Wahl ein: Bitte geben Sie die 496. Ziffer der Dualzahl Ihrer W
    ahl ein: Bitte geben Sie die 497. Ziffer der Dualzahl Ihrer Wahl ein: Bitte gebe
    n Sie die 498. Ziffer der Dualzahl Ihrer Wahl ein: Bitte geben Sie die 499. Ziff
    er der Dualzahl Ihrer Wahl ein: Bitte geben Sie die 500. Ziffer der Dualzahl Ihr
    er Wahl ein: Bitte geben Sie die 501. Ziffer der Dualzahl Ihrer Wahl ein: Bitte 
    

    !?



  • @manni66 Blöde Frage, aber wie downloade ich für die IDE Codeblocks den Debugger? Einfach googlen und downloaden? Und dann den Debugger separat öffnen oder wie wenden ich ihn in meinem Programm an? Sollte Codeblocks nicht schon einen Debugger haben, nur dass ich nicht weiß, wie ich ihn finde und benutze?

    Grüße
    Dickie



  • @swordfish Vielen lieben Dank!
    Ich möchte aber wirklich gerne auch in der Theorie verstehen, wieso das nicht geht, wenn man "index++" innerhalb der geschweiften Klammern stehen hat.
    Und wieso bei deinem Quelltext der Index überhaupt hochgesetzt wird, wenn es nicht als Befehl innerhalb den geschweiften Klammern explizit formuliert wurde. Woher weiß der Computer, dass er jedes Mal index++ rechnen soll, da ja index++ nur als zu überprüfende Bedingung in den runden Klammern von While steht?



  • @dickie sagte in Schleife Abbruchbedingung klappt nicht:

    Sollte Codeblocks nicht schon einen Debugger haben, nur dass ich nicht weiß, wie ich ihn finde und benutze?

    How to Use The Debugger in CodeBlocks.

    @dickie sagte in Schleife Abbruchbedingung klappt nicht:

    Ich möchte aber wirklich gerne auch in der Theorie verstehen, wieso das nicht geht, wenn man "index++" innerhalb der geschweiften Klammern stehen hat.

    Weil Du dann in der Bedingung im while mit dualzahl[index] != 2 nicht die letzte Benutzereingabe gegen 2 prüfst, sondern eins dahinter, das noch garnicht beschrieben worden ist.

    @dickie sagte in Schleife Abbruchbedingung klappt nicht:

    Woher weiß der Computer, dass er jedes Mal index++ rechnen soll, da ja index++ nur als zu überprüfende Bedingung in den runden Klammern von While steht?

    Auch Anweisungen in Bedingungen werden ganz normal ausgeführt.



  • @dickie sagte in Schleife Abbruchbedingung klappt nicht:

    @manni66 Blöde Frage, aber wie downloade ich für die IDE Codeblocks den Debugger?

    Keine Ahnung.

    Und dann den Debugger separat öffnen oder wie wenden ich ihn in meinem Programm an? Sollte Codeblocks nicht schon einen Debugger haben, nur dass ich nicht weiß, wie ich ihn finde und benutze?

    Codeblocks nutzt den gdb. Mehr weiß ich nicht. Schau dir die Dokumentation an.



  • @swordfish "Weil Du dann in der Bedingung im while mit dualzahl[index] != 2 nicht die letzte Benutzereingabe gegen 2 prüfst, sondern eins dahinter, das noch garnicht beschrieben worden ist."

    • Ich glaube, das ist der entscheidende Satz, durch den ich das Problem verstehen werde, könntest du mir bitte nochmal genau sagen, welches Stück aus dem Quelltext du mit "letzte Benutzereingabe" und welche Stelle du mit "eins dahinter" meinst (also eins darüber?) ?


  • mach dir mal klar, was `index++ˋ genau macht.



  • @dirkb Mir wurde beigebracht, dass index++ das gleiche wie index + 1 ist. Stimmt das nicht?



  • @dickie sagte in Schleife Abbruchbedingung klappt nicht:

    @dirkb Mir wurde beigebracht, dass index++ das gleiche wie index + 1 ist. Stimmt das nicht?

    Beim Postinkrement wird zuerst der Wert der Variable verwendet und die Variable danach um 1 erhöht:

    int foo = 42;
    int bar = foo++; // bar ist jetzt 42, foo danach 43
    

    vs.

    int foo = 42;
    int bar = ++foo; // bar ist jetzt 43, foo ist auch 43
    

    Postinkrement ist also äquivalent zu

    int post_inc(int & value) // int nur der Einfachheit halber
    {
        int temp = value;
        value += 1;   // für Typen mit überladenem operator++(int) müsste hier streng-
                      // genommen value++; stehen um garantiert äquivalent zu sein
        return temp;
    }
    

    @dickie sagte in Schleife Abbruchbedingung klappt nicht:

    Könntest du mir bitte nochmal genau sagen, welches Stück aus dem Quelltext du mit "letzte Benutzereingabe" und welche Stelle du mit "eins dahinter" meinst (also eins darüber?) ?

    int main()
    {
        int index = 0;
        int dualzahl[20];
    
        do {
            cout << index + 1 << ": ";
            cin >> dualzahl[index]; // einlesen in dualzahl[0]
            index++; // index = index + 1; (index jetzt = 1)
        } while (dualzahl[index] != 2); // prüfen von dualzahl[1] gegen 2
    
        // ...
    

    vs.

    int main()
    {
        int index = 0;
        int dualzahl[20];
    
        do {
            cout << index + 1 << ": ";
            cin >> dualzahl[index]; // einlesen in dualzahl[0]        
        } while (dualzahl[index++] != 2); // prüfen von dualzahl[*0*] gegen 2, *danach* index inkrementieren
    
        // ...
    


  • @swordfish oh ja, du hast so recht! mensch, eigentlich total logisch! Danke vielmals! für mich ist das echt wertvoll.