While schleife



  • @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: }
    🙂



  • @hustbaer sagte in While schleife:

    @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: }
    🙂

    Sauber 🙂



  • @Th69 sagte in While schleife:

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

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

    Naja, das geht aber nur, solange du keine else-Fälle hast. Insbesondere nach dem initialen "Beginnen?" kann ich mir sowas vorstellen wie ein cout von "Schade, dann wurde ich armes Programm ja ganz umsonst gestartet" 🙂 Da wäre dann auch ein eary return möglich, wenn man das if vor-not-et.



  • Ok ich hab jetzt die erste while Schleife ersetzt gegen einer if Funktion.
    Eine do while Schleife nimmt das Programm nicht an. Ich denke weil die fragen.fragenanzahl auf 3 fragen laufen. Und eine do while Schleife würde doch noch ein viertes mal laufen oder nicht?
    Wahrscheinlich ist die Lösung zu dem Problem einfach aber ich komme nicht drauf. Ich probiere es ja jetzt schon länger aber ich komme nicht darauf zurück . Ich vermute das es das return 0 ist was das Programm ja beendet.
    Aber wenn ich es entferne meckert das Programm weil ich es in #include FragenAntworten.h als rückgabe (return Antwort [wert] ) benutze.

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Fragen
    {
    public:
        Fragen() {};
       
    
        const static int fragenAnzahl = 3;
    
        string getFrage(int wert)
        {
            string Frage[fragenAnzahl];
    
            Frage[0] = "frage1";
            Frage[1] = "frage2";
            Frage[2] = "frage3";
    
            return Frage[wert];
    
        }
    private:
    };
    class Antworten
    {
    public:
    
        Antworten() {};
        
    
        const static int antwortenAnzahl = 3;
    
        string getAntworten(int wert)
        {
            string Antwort[antwortenAnzahl];
    
            Antwort[0] = "antwort1";
            Antwort[1] = "antwort2";
            Antwort[2] = "antwort3";
    
            return Antwort[wert];
    
        }
    
    private:
    
    };
    


  • @Dpascalm du weißt schon, dass du da ungültigen speicher zurück gibst?



  • @Wade1234 sagte in While schleife:

    @Dpascalm du weißt schon, dass du da ungültigen speicher zurück gibst?

    Wo tut @Dpascalm das?



  • @wob man kann unter c++ teile aus lokal in funktionen angelegten arrays zurück geben?



  • Solange das nicht als Referenz oder Pointer erfolgt: warum sollte das nicht gehen?



  • @wob es sieht halt irgendwie komisch aus.



  • @Wade1234 Finde ich nicht. Sieht ganz normal aus.

    Man fragt sich hier aber natürlich, warum immer erst ein Array von 3 Strings erzeugt wird, das dann wieder verworfen wird, wenn man eigentlich nur einen String haben will.



  • @wob achso dann hab ich mich wohl geirrt.🙄


Anmelden zum Antworten