do while schleife (integer string abfrage)



  • Hallo!

    Könnt ihr mir bitte helfen wie ich das ungewünschte Looping fixe falls man etwas anderes als Nummern benutzt bei der String abfrage?
    Muss ich vielleicht einen anderen Variablentyp benutzen für choice? (ist int)

    Hier mal der Code

    do
          {
              cout << "1 Basic-Fire-Mon - Greift mit Feuerattacken an!\n";
              cout << "2 Basic-Water-Mon - Greift mit Wasserattacken an!\n";
              cout << "3 Basic-Plant-Mon - Greift mit Pflanzenattacken an!\n";
              cin >> choice;
              if         (choice == 1)
                   {
                             cout << "Gut! Du besitzt nun Basic-Fire-Mon!\n";
                   }
                   else if (choice == 2)
                   {
                             cout << "Gut! Du besitzt nun Basic-Water-Mon!\n";
                   }
                   else if (choice == 3)
                   {
                             cout << "Gut! Du besitzt nun Basic-Plant-Mon!\n";
                   }
                   else
                   {
                             cout << "Bitte benutze eine Nummerntaste!\n";    
                   }
          }
          while(choice !=1 || choice !=2 || choice !=3);
    

  • Mod

    In Integern kann man nur Ganzzahlen speichern. Steht etwas im Eingabestream, was nicht als Ganzzahl gelesen werden kann, so schlägt die Eingabefunktion fehl und der Stream wird in einen Fehlerzustand versetzt. Ob ein Stream in einem Fehlerzustand ist oder nicht, kann man ganz einfach prüften, indem man ihn in einem boolschen Kontext benutzt. Fehlerzustand wird zu 0/false ausgewertet, alles ok wird zu nicht 0/wahr ausgewertet. Im Falle von cin also so etwas wie

    if (cin)
      // alles ok
    else
      // Fehlerzustand
    

    Da die Eingabefunktionen auch (fast) alle den Stream selber als Rückgabewert haben, kann man auch kurz schreiben

    if(cin >> choice)
      // alles ok
    else
      // Fehlerzustand
    

    Ist der Stream erst einmal in einem Fehlerzustand, so schlagen alle weiteren Funktionen auf dem Stream fehl, bevor man diesen nicht aufhebt mit clear. Beachte, dass die gleichen Zeichen, die den Fehler verursacht haben, immer noch im Stream stehen. Wenn man genau die gleiche Lesefunktion wiederholt, wird diese wieder fehlschlagen. Vermutlich möchte man daher noch mit ignore eines oder mehrere dieser Zeichen verwerfen.

    PS:

    while(choice !=1 || choice !=2 || choice !=3);
    

    Bist du sicher, dass diese Bedingung das beschreibt, was du möchtest?



  • hi!

    Das hat mir sehr geholfen 🙂
    Ich habe testweise verucht mit break; zu arbeiten, las aber, dass dies "stümperhaft" sei.

    Bist du sicher, dass diese Bedingung das beschreibt, was du möchtest?

    Ich möchte nunmal, dass diese Abfrage solange kommt, bis choice einen dieser Werte annimmt, ist doch richtig so oder?

    Aso und dann hab ich noch eine Frage zum Programmierstil, soll ich für so ein Programm wo mehrere (gleiche) Abfragen kommen die Abfrage-Routine ansich in ein Sub-Programm packen?


  • Mod

    sinnlos123 schrieb:

    hi!

    Das hat mir sehr geholfen 🙂
    Ich habe testweise verucht mit break; zu arbeiten, las aber, dass dies "stümperhaft" sei.

    Bist du sicher, dass diese Bedingung das beschreibt, was du möchtest?

    Ich möchte nunmal, dass diese Abfrage solange kommt, bis choice einen dieser Werte annimmt, ist doch richtig so oder?

    "do..while" heißt "so lange, wie", nicht "so lange, bis". Die Schleife läuft also so lange, wie choice nicht 1 ist oder choice nicht 2 ist oder choice nicht 3 ist. Jetzt muss man sich doch fragen, welchen Wert choice annehmen müsste, um nicht ungleich 1, ungleich 2 oder ungleich 3 zu sein. Oder umgeformt: Welchen Wert choice annehmen müsste, um gleichzeitig gleich 1, gleich 2 und gleich 3 zu sein. Erst wenn choice diesen tollen Wert annimmt, kann die Schleife abbrechen.

    Aso und dann hab ich noch eine Frage zum Programmierstil, soll ich für so ein Programm wo mehrere (gleiche) Abfragen kommen die Abfrage-Routine ansich in ein Sub-Programm packen?

    Wenn sich mehrmals gleichartiger Code wiederholt, bietet sich das an, ja.



  • aber da steht doch "!=Zahl"

    Dachte das heißt ungleich und er soll solange machen bis choice nicht mehr (ungleich 1) und (ug 2) und (ug 3 ist) ("||" ist doch und oder?).

    Eine elegantere Lösung wäre vielleicht while (0<choice<4) ? (sofern Buchstaben etc. schon anderweitig ausgemerzt sind)



  • sinnlos123 schrieb:

    "||" ist doch und oder?

    "||" ist "oder" hab ich mal gehört.



  • EOP schrieb:

    sinnlos123 schrieb:

    "||" ist doch und oder?

    "||" ist "oder" hab ich mal gehört.

    darum schreibt man "or" statt "||", gell?



  • aso 😉

    okile dokile!

    danke euch.



  • volkard schrieb:

    EOP schrieb:

    sinnlos123 schrieb:

    "||" ist doch und oder?

    "||" ist "oder" hab ich mal gehört.

    darum schreibt man "or" statt "||", gell?

    Ich hab noch nie im Leben "or" geschrieben.
    Was wäre denn eine Alternative für "^" ?

    EDIT:
    Die Verwechslung von "and" und "or" und "and not", usw. ist aber ein altbekanntes Problem bei Programmieranfängern.
    Nicht von der Schreibweise, aber von der Logik.





  • Cool, Braunstein.
    Man kann immernoch was dazulernen.
    Und da fragen manche Leute: "Wie lange brauche ich um C/C++ zu lernen?".
    Antwort: Es ist ein fast unendlicher Prozess.



  • Hi, nochmal eine Frage zu while...

    also das hier

    #include <iostream>
    #include <string>
    using namespace std;
    int main()
    {
        unsigned long long x; \\warum unbendingt sone variable?
        int y; \\scheint quick and dirty
        do{
        cout << "Geben Sie eine beliebige positive ganze Zahl ein!\n"; \\nun eine beliebige Zahl kann ich auch als String speichern oder nicht? obwohl positiv..?
        cin >> x;
        if(!cin.good())
        {
        cin.clear(); \\
        cin.ignore(); \\
        system("cls"); \\overkill?
        y=1;
        }
        else {
        cout << "dezimal:     " << dec << x <<endl
             << "octal:       "<<oct << x<<endl
             << "hexadezimal: "<<hex << x<<endl;
        y=0;
             }
        }while (y>0);\\ notlösung
    
        getchar();
        getchar();
        getchar();
        return 0;
    }
    

    scheint mir ein bisschen viel code zu sein, kann ich das was dieses Programm macht auch besser bewerkstelligen?
    Das kommentierte soll Sachen darstellen die ich ein bisschen unnötig finde, zum Beispiel könnte ich doch ruhig das was eingegeben werden kann erweitern auf die dazugehörigen Buchstaben(z.b. A für 65) oder nicht?

    Auch scheint mir das komplette resetten wie Kanonen auf Spatzen, mit "string x" hätte ich ja nichtmal das Problem.

    Ich habe gelesen, dass man mit

    for(;;)
    

    auch sowas machen kann, allerdings kenne ich das garnicht.

    Was meint ihr?


  • Mod

    Ich würde mich an dem bereits verlinkten Beispiel zu clear orientieren:
    http://en.cppreference.com/w/cpp/io/basic_ios/clear
    Das string & getline in dem Beispiel dient der Nutzerführung, es kann je nach Bedarf natürlich auch mit einem stillen ignore ersetzt werden.



  • EOP schrieb:

    volkard schrieb:

    EOP schrieb:

    sinnlos123 schrieb:

    "||" ist doch und oder?

    "||" ist "oder" hab ich mal gehört.

    darum schreibt man "or" statt "||", gell?

    Ich hab noch nie im Leben "or" geschrieben.
    Was wäre denn eine Alternative für "^" ?

    Also ich finde, daß "or" statt "||" meinen Code lesbarer macht, nicht nur für Nubes, sondern auch für mich.

    EOP schrieb:

    EDIT:
    Die Verwechslung von "and" und "or" und "and not", usw. ist aber ein altbekanntes Problem bei Programmieranfängern.
    Nicht von der Schreibweise, aber von der Logik.

    Ja, vor allem mit DeMorgan zusammen und dem selbstauferlegten Zwang, ihn zu benutzen.

    Ich geh nur raus, wenn der Benutzer '0' oder 'x' eingegeben hat.
    ...while(not (e=='0' or e=='x') )

    Ich mag Äpfel und Birnen nicht. ==(verrückte Sprache) Ich mag Äpfel nicht. && Ich mag Birnen nicht.



  • volkard schrieb:

    Ich geh nur raus, wenn der Benutzer '0' oder 'x' eingegeben hat.
    ...while(not (e=='0' or e=='x') )

    Stimmt, das sieht übersichtlich aus, kompiliert aber unter VS 2005 nicht (error C3861: 'not': identifier not found).
    while( !(e=='0' || e=='x') ) funktioniert.

    Ich hätte while( e!='0' && e!='x') geschrieben.


  • Mod

    Laut Anleitung musst du in Visual Studio wohl den Schalter /Za benutzen, um die alternativen Schlüsselwörter zu aktiveren. Alternativ den C-Weg gehen und iso646.h einbinden. Vielleicht funktioniert auch ciso646, aber das macht laut C++-Standard gar nichts; aber wer weiß, was Microsoft da schon wieder gemacht hat?



  • Danke für den Tip.


Anmelden zum Antworten