Exit und restart/continue bug?



  • Hallo! 🙂
    Zuerst möchte ich im vorhinein sagen, dass ich ein blutiger Anfänger und Neuling bin was C++ betrifft und bisher nur wenig Erfahrung damit gemacht habe. Daher bitte um Verständniss falls das eine oder andere in diesem Code keinen Sinn ergeben sollte oder völlig fehl am Platz ist.

    Der Code generiert zwei random Werte und addiert diese miteinander. Wird das addierte Ergebniss vom User richtig eingegeben so kann dieser per Keybinds entscheiden ob er das Programm restarten(continue) will oder schließen möchte. Gibt der User eine falsche Zahl ein, so kann er ebenfalls entscheiden ob er es nochmal versuchen will oder nicht (per Keybinds wieder).

    Nun aber zu dem Problem: Wird beim ersten Versuch das Ergebniss richtig eingegeben, so ist man in der Lage entweder zu restarten (continue) oder das Programm zu schließen. Führt man fort und drückt die Taste 1 um weiter zu machen, ist man beim zweitem Versuch nicht mehr in der Lage das Programm zu schließen durch das drücken der Taste 2. Jedoch continue durch das drücken der Taste 1 lässt sich ausführen.

    Leider bin ich bis jetzt zu keiner Lösung gekommen..

    Hier ist der Code:

    #include <iostream>
    
    using namespace std;
    
    int main(){
    
              int n1 = rand() % 100;  // Random Zahl 1.
              int n2 = rand() % 100;  // Random Zahl 2.
              int num1;               // Eingabe für Ergebniss/Lösung.
              int pick;               // Entscheidung für restart oder exit.
              int answer;             // Richtiges addiertes Ergebniss.
              system ("COLOR A");     // Farbe der Schrift in der Textbox.
    
              cout <<"What is "<<n1<<"+"<<n2<<"?"<<endl;  
    
              {
                   answer= n1 + n2;   // Berechne das Ergeniss/richtige Antwort.
              }
    
             cin >> num1;             // Gebe Lösung ein.
    
             if (num1 == answer){     // Vergleiche Lösung mit richtiger Antwort
    
             cout <<"Correct!"<<endl;
             cout <<"Press 1 to continue"<<endl; 
             cout <<"Press 2 to exit"<<endl;
    
             cin >> pick;             // Entscheide für continue oder exit.
             if (pick == 1){          // Wenn 1 gedrückt wird --> continue.
    
                      main ();        // Continue.
    
                      }
    
              if (pick == 2){         // Wenn 2 gedrückt wird --> exit.
    
                      return 0;       // Exit.
                      }       
    
              }
              if (num1 != answer){        //Wenn Lösung falsch ist...
                    cout <<"False!"<<endl;  
                    cout <<"Press 1 to try again!"<<endl;
                    cout <<"Press 2 to exit this programm!"<<endl;
    
              }
    
              cin >> pick;            // Entscheide für continue oder exit.    
    
              if(pick == 1){          // Wenn 1 gedrückt wird --> continue.
    
                      main ();        // Continue.
    
                      }
    
              if (pick == 2){         // Wenn 2 gedrückt wird --> exit.
    
                         return 0;    // Exit.
    
                       }
    
              return 0;               // Exit.
    
              }
    

    Danke für jede Antwort! 🙂



  • die main -funktion aufzurufen ist afaik ub. mach es mit einer grossen hauptschleife.



  • Schreib dir doch mal vor jedes cin, was der Benutzer eingeben soll:

    std::cout << "Gib mir das Ergebnis von " << n1 << " + " << n2 << " ein: ";
    std::cin >> answer;
    

    Dann wirst du ganzschnell sehen, was bei dir falsch läuft.



  • Danke für die Antworten!

    @Skym0sh0 Ich meine den Fehler gefunden zu haben da das Programm nun funktioniert. Mir ist danach auch eine andere Variante aufgefallen mit der das Programm funktionsgemäß lief. Die codelines für die Entscheidung wurden bei der ersten Entscheidung vollkommen entfernt.

    cin >> pick;             // Entscheide für continue oder exit.
             if (pick == 1){          // Wenn 1 gedrückt wird --> continue.
    
                      main ();        // Continue.
    
                      }
    
              if (pick == 2){         // Wenn 2 gedrückt wird --> exit.
    
                      return 0;       // Exit.
                      }
    

    Bezüglich dem eigentlichen Fehler:

    if (num1 != answer){        //Wenn Lösung falsch ist...
                    cout <<"False!"<<endl;  
                    cout <<"Press 1 to try again!"<<endl;
                    cout <<"Press 2 to exit this programm!"<<endl;
    
               }                      // Das war der Fehler. Da wurde die Funktion geschlossen.
    
              cin >> pick;            // Entscheide für continue oder exit.    
    
              if(pick == 1){          // Wenn 1 gedrückt wird --> continue.
    
                      main ();        // Continue.
    
                      }
    
              if (pick == 2){         // Wenn 2 gedrückt wird --> exit.
    
                         return 0;    // Exit.
    
                       }
    
              return 0;               // Exit.
    
              }
    
              return 0;
    
              }
    

    Durch das entfernen dieser Klammer funktioniert es jetzt so wie es sollte 👍



  • du hast meinen post nicht gelesen, was? oder hast du einfach keine lust es richtig zu machen?

    §3.6.1.3 schrieb:

    The function main shall not be used within a program.



  • Keine Lust ist meinem empfinden nach der falsche Ausdruck, so solls nicht aussehen. Du hast eventuell meine ersten Sätze des Threads überflogen! Vielleicht habe ich vergessen zu erwähnen, dass es mir sehr geholfen wäre wenn vielleicht ein Beispiel hinzugefügt wird, wie das und jenes aussehen könnte. Denn unter "Hauptschleife" statt "main" kann ich mir momentan nichts vorstellen 😕

    Aber natürlich, ich würde die korrekte Version gerne sehen wollen! 🙂

    Vielen Dank für den Hinweis.



  • Aber eine Schleife ( for, while, do-while ) kennst du?
    Die sind nicht nur zum Durchzählen da, sondern zum wiederholen.

    Du sollst main nicht rekursiv aufrufen sondern einfach deinen Code wiederholen.
    Da diese Schleife in main ist und fast alles umschließt, wird diese Hauptschleife genannt.

    Und else als Alternative bei if kennst du auch?
    Da sparst du dir ein zweites if mit negierter Bedingung.

    do
    { Frage stellen
      Antwort holen
    
      if (Antwort ist richtig)
      { Glückwunsch ausgeben
      } 
      else 
      { Bedauern ausgeben
      }
    
      Ausgabe "Nochmal 1, Ende 2"
      Eingabe
    } while (Eingabe != 2)
    

Log in to reply