While schleife



  • Hallo.
    Ich möchte nach meinen Quiz den Nutzer fragen ob er das Quiz nochmal spielen will.
    Ich bekomme es aber nicht hin. erfragt zwar aber beendet es so wie auch ohne der Fragestellung .
    Ich werde es mit /**/ markieren was ich gedacht habe das es funktioniert.

    
    #include <iostream>
    #include <string>
    #include "FragenAntworten.h"
    #include <Windows.h>
    #include "Logo.h"
    
    using namespace std;
    int main()
    {
    
    
    
        Logo();
    
        Fragen fragen;
        Antworten antworten;
    
        string Eingabe, Wiederholung;
        int zaehler = 1;
        int punkteRichtig = 0;
        int punkteFalsch = 0;
    
        cout << "Hallo .\nBitte achte auf Gross und klein schreibung und nutze einen Punkt statt das Komma." << endl;
        cout << "M\224chtest du jetzt mit dem Quiz beginnen? ";
        cin >> Eingabe;
    
        while (Eingabe == "ja" || Eingabe == "Ja" || Wiederholung == "Ja" || Wiederholung == "ja")
        {
            using namespace std;
    
    
            while (zaehler <= fragen.fragenAnzahl|| Wiederholung=="ja")
            {
    
    
                string eingabe = "";
    
                cout << fragen.getFrage(zaehler - 1);
                cin >> eingabe;
    
                cout << endl;
    
                if (eingabe == antworten.getAntworten(zaehler - 1))
                {
                    cout << "Richtig: Deine antwort " << antworten.getAntworten(zaehler - 1) << " ist richtig";
                    punkteRichtig++;
                }
                else
                {
                    cout << "Falsch: Die Antwort w\204re " << antworten.getAntworten(zaehler - 1);
                    punkteFalsch++;
                }
    
                Sleep(2000);        // Es sorgt dafuer das nach der antwort zeit vergeht bis die naechste Frage erscheind. 
                system("cls");      // cls loescht alles. Damit l\224scht er das bild mit der Frage um die neue Frage anzuzeigen.
                zaehler++;          //addiert 1 dazu.
    
    
            }
            cout << "Richtige beantwortet: " << punkteRichtig << " / " << fragen.fragenAnzahl << endl;
            cout << "Falsch beantwortet: " << punkteFalsch << endl;
           /*
            punkteRichtig = 0;
            punkteFalsch = 0;
            zaehler =1;
            cout << "M\224chtest du nochmal anfangen? ";
    
            cin >> Wiederholung;
            */
    
    
    
    
             system("Pause");
            fragen.~Fragen();
            antworten.~Antworten();
            return 0;
            cout << "Bis bald";
        }
    }
    
    
    
    


  • @Dpascalm sagte in While schleife:

        fragen.~Fragen();
        antworten.~Antworten();
    

    Was soll das? Mach das weg!



  • du rufst in der äußeren schleife return 0 auf......



  • Ja aber selbst wenn ich sie entferne ändert sich nichts.



  • wenn du was entfernst?



  • @Dpascalm Die } (geschweifte Klammer) aus Zeile 80 sollte wohl etwas höher.



  • das ist übrigens DIE gelegenheit, erste erfahrungen im umgang mit dem debugger zu machen.



  • Also wenn ich

     fragen.~Fragen();
      antworten.~Antworten();
    

    passiert nichts und wenn ich das return entferne passiert nichts anderes.



  • @Dpascalm sagte in While schleife:

    und wenn ich das return entferne passiert nichts anderes.

    Das ist Merkwürdig, da die while(Eingabe ...)-Schleife immer laufen sollte, du du Eingabe nie änderst.



  • wenn du das return entfernst, sollte der compiler eigentlich meckern.



  • @Wade1234 sagte in While schleife:

    wenn du das return entfernst, sollte der compiler eigentlich meckern.

    Mit dem return auch.
    Als Warnung. In etwa „Code wird nie ausgeführt“



  • Ok wenn ich return entferne startet das Programm. Es läuft auch, nur am ende des Programms kommt ein Fehler. Mehr aber nicht.

    Ich habe auch

     fragen.~Fragen();
     antworten.~Antworten();
    

    enfernt. Aber wieso sollte ich das entfernen? Es hilft mir ja im Grunde genommen nicht weiter wenn man mir sagt mach das weg und das weg ohne eine Erklärung um es auch zu verstehen wieso ich es so machen muss.
    Und ich komme da einfach nicht weiter wieso ich die while Schleife nicht wieder von vorne anfangen kann. Oder setze ich die Werte

     punkteRichtig = 0;
            punkteFalsch = 0;
            zaehler =1;
           
    

    falsch zurück, das für die while Schleife der zähler erreicht worden ist?

    Sollte ich hier lieber mit Zeigern arbeiten?



  • @Dpascalm sagte in While schleife:

    Es hilft mir ja im Grunde genommen nicht weiter wenn man mir sagt mach das weg und das weg ohne eine Erklärung um es auch zu verstehen wieso ich es so machen muss.

    Ich habe dir eine Frage gestellt. Du hast er vorgezogen diese Frage nicht zu beamtworten. Dann lernst du halt nichts.



  • fragen.~Fragen();
    antworten.~Antworten();
    

    Bis Du mal versierter in C++ bist .... reicht es Dir, wenn ich Dir sage, dass man Destruktoren nicht explizit aufruft?
    Wenn Du dann mal versierter bist, kommst Du gar nicht mehr auf so eine Idee.

    Dass Deine Schleife nicht so funktioniert, wie Du möchtest, liegt dann wohl an Deinem Algorithmus ...



  • @Dpascalm sagte in While schleife:

    das für die while Schleife der zähler erreicht worden ist?

    Um welche while-Schleife geht es eigentlich?
    Zeile 28 sollte immer laufen, da Eingabe immer noch das "ja" aus Zeilke 26 hat.
    Zeile 33 sollte immer laufen, wenn du "ja" für Wiederholung eingegeben hast.

    Welchen Wert hat eigentlich fragen.fragenAnzahl?



  • @Dpascalm sagte in While schleife:

    Ich habe auch

     fragen.~Fragen();
     antworten.~Antworten();
    

    enfernt. Aber wieso sollte ich das entfernen?

    Nein, die Frage ist: warum hast du das überhaupt geschrieben? Wer hat dir das beigebraucht?

    Die Funktion ~irgendwas wird automatisch da aufgerufen, wo das Objekt aus dem Scope verschwindet. Also dort, wo die geschwungene Klammer zu } steht.

    Bei

    void irgendeineFunktion() {
       Fragen f;
       if (bedingung) {
          Antwort a;
       }  // <-- hier wird a.~Antwort() aufgerufen
    } // <-- hier wird f.~Fragen() aufgerufen
    

    Die Destruktoren rufst du im Regelfall niemals* selbst auf.

    (* es sei denn, du weißt, was du tust, z.B. bei Unions)

    Als allgemeiner Tipp: deine while-Bedingung while (Eingabe == "ja" || Eingabe == "Ja" || Wiederholung == "Ja" || Wiederholung == "ja") sieht sehr kompliziert aus. Das "Eingabe" hat da auch nur was mit der Frage darüber zu tun, das "Wiederholung" nicht.

    Also wäre wohl etwas wie

    if (Eingabe == "ja" || Eingabe == "Ja") {
       quiz();
    }
    

    geeigneter als die while-Schleife.



  • @wob sagte in While schleife:

    Also wäre wohl etwas wie
    if (Eingabe == "ja" || Eingabe == "Ja") {
    quiz();
    }

    Und du darfst die Variable Eingabe auch bei der Frage zur Wiederholung benutzen.



  • Ich benutze nicht so gerne eine Variable für verschiedene Dinge.

    Allerdings könnte man es noch anders machen:

    bool istJa(const std::string &s) {
      return s == "Ja" || s == "ja" || s == "j" || s == "J";  // J und j für die faulen Leute
    }
    
    std::string liesString() {
      std::string eingabe;
      std::cin >> eingabe;
      // wir ignorieren hier, ob cin in failstate ist
      return eingabe;
    }
    
    (...)
    
    cout << "Beginnen?\n";
    if (istJa(liesString())) {
      do {
        quiz();
        cout << "Nochmal?\n";
      while (istJa(liesString()));
    }
    


  • @wob: Du hast gerade unnötigerweise den Code verkompliziert 😉 ->

    cout << "Beginnen?\n";
    while (istJa(liesString()))
    {
        quiz();
        cout << "Nochmal?\n";
    }
    


  • @wob sagte in While schleife:

    Die Funktion ~irgendwas wird automatisch da aufgerufen, wo das Objekt aus dem Scope verschwindet. Also dort, wo die geschwungene Klammer zu } steht.

    Genau.
    Frage: Wie ruft man in C++ einen Destruktor auf?
    Antwort: }
    🙂


Log in to reply