If/else Abfrage solange wiederholen, bis eine Zahl eingegeben wurde.
-
If/else Abfrage solange wiederholen, bis eine Zahl eingegeben wurde.
Servus Community,
ich habe folgendes Problem.
In meinem kleinen Programm möchte ich, dass wenn ich eine Zahl eingebe, ein satz so oft wiederholt wird, wie auch die zahl groß ist.
Zum Beispiel gebe ich eine 5 ein und der Satz wird 5 mal wiederholt. Das klappt auch soweit, aber ich möchte noch sagen das man nur Zahlen eingeben kann.Wie man unten im Code sieht, habe ich die if abfrage in einer Endlosschleife die bei erfolgreichem Input (einer Zahl) mit break abgebrochen wird. Falls man keine Zahl eingibt wird bei else ausgegeben das meine eine Zahl eingeben soll. Wenn man dies nicht tut möchte ich die ganze if Abfrage wiederholen, solange bis eine Zahl eingegeben wurde.
Ich glaube mir fehlt nur die passende If Bedingung in der Zeile 18 um die vorherige If abfrage erneut ablaufen zu lassen. Wenn ich es so abspiele kommt eine Endlosschleife aus "Bitte geben sie eine Zahl ein.", wahrscheinlich kommt das dadurch da ich sagte continue und er nun else die ganze zeit wiederholt.
int zahl; cout <<"Bitte Anzahl der Wiederholungen angeben."<< endl; cin >> zahl; for(;;){ //endlosschleife if (zahl > 0)//wenn der input über null ist { cout <<"Vielen Dank. Es wird jetzt " << zahl << " mal wiederholt."<< endl; for (int i=0; i<zahl; i++) { cout <<"Du bist gut!"<< endl; } if (zahl > 0) break; //wenn der input über null ist, endlosschleife abbrechen } else//falls das nicht erfüllt ist dann, { cout <<"Bitte geben Sie eine Zahl ein."<< endl; //fehlermeldung bitte geben sie eine zahl ein if (!(zahl >0)) continue; } }
Ich glaube man merkt das ich noch ziemlich neu zu dieser ganzen Sache stehen. Hoffentlich versteht ihr was ich versuche zu realisieren und ihr könnt mir helfen
Grüße Sabifa
-
hi
ich weiß nicht ob ich dich richtig verstehe...
ich kann aus deinem text leider nicht erkennen wann du das programm beenden möchtest? niemals?
du könntest ein menü oder ähnliches machen und das dann zum abbruch bzw. start der zahleneingabe benutzen...
in etwa vll so?#include <iostream> using namespace std; int main() { int zahl; string menueingabe; while(menueingabe.compare("ende") != 0) { cout << "Menü: \n" << "start - Eingabe zahl \n" << "ende - Beenden \n" << "Bitte angeben: " << endl; cin >> menueingabe; if(menueingabe.compare("start") == 0) { cout <<"Bitte Anzahl der Wiederholungen angeben: "<< endl; cin >> zahl; if (zahl > 0) { cout <<"Vielen Dank. Es wird jetzt " << zahl << " mal wiederholt."<< endl; for (int i=0; i < zahl; i++) { cout <<"Wiederholung: "<< i << " - Du bist gut!"<< endl; } } if(!zahl>0) { cout <<"Bitte geben Sie eine Zahl größer 0 an."<< endl; //fehlermeldung bitte geben sie eine zahl ein } cout << "\n \n"; } } }
wenn du "start" eingibst - kannst du eine zahl eingeben, wenn diese >0 ist, wird dein satz in der anzahl wiederholt... (wie von dir gezeigt)
wenn man "ende" eingibt - beendet sich das programm
hoff ich konnte helfen ...
lg
-
sry hab mich vertippt
das:
if(!zahl>0)
sollte das sein:
if(zahl<0)
lg
-
Wenn du noch möchtest das bei der eingabe für dein int wert - fehler von buchstaben eingaben, verhindert werden kannst du es noch so erweitern:
#include <iostream> #include <sstream> #include <locale> using namespace std; string valid_eingabe(string eingabe) { int laenge = eingabe.size(); string ergebnis = "zahl"; for(int i = 0; i < laenge; i++) { if(!isdigit(eingabe.c_str()[i])) { ergebnis = "fehler"; return ergebnis; } } return ergebnis; } int main() { string menueingabe; while(menueingabe.compare("ende") != 0) { cout << "Menü: \n" << "start - Eingabe zahl \n" << "ende - Beenden \n" << "Bitte angeben: " << endl; cin >> menueingabe; if(menueingabe.compare("start") == 0) { cout <<"Bitte Anzahl der Wiederholungen angeben: "<< endl; string eingabezahl; cin >> eingabezahl; string ergebnis = valid_eingabe(eingabezahl); //prüft ob wirklich eine zahl eingeben wurde if(ergebnis.compare("fehler") == 0) { cout << "Fehler - Bitte geben sie nur Zahlen ein: " << eingabezahl << std::endl; }else { int zahl; stringstream ss(eingabezahl); ss >> zahl; if(zahl > 0) { cout <<"Vielen Dank. Es wird jetzt " << zahl << " mal wiederholt."<< endl; for (int i=0; i < zahl; i++) { cout <<"Wiederholung: "<< i << " - Du bist gut!"<< endl; } } if(zahl < 0) { cout <<"Bitte geben Sie eine Zahl größer 0 an."<< endl; //fehlermeldung bitte geben sie eine zahl ein } } } } cout << "Ende" << endl; }
lg
-
Hallo Sabifa,
du musst gar nicht viel ändern. Wichtig ist, dass nach falscher Eingabe der Stream cin im Fehlerstatus ist - und bevor du erneut liest, muss der Fehlerstatus gecleart werden (schau dir mal http://www.cplusplus.com/reference/ios/ios/clear/ und http://www.cplusplus.com/reference/istream/istream/ignore/ an).
Außerdem muss die Abfrage der Zahl natürlich in die Schleife. Das sieht dann so aus:
#include <iostream> #include <limits> using namespace std; int main() { for (;;) { // endlosschleife int zahl; cout << "Bitte Anzahl der Wiederholungen angeben." << endl; cin >> zahl; if (cin && zahl > 0) // wenn der input über null ist { cout << "Vielen Dank. Es wird jetzt " << zahl << " mal wiederholt." << endl; for (int i = 0; i < zahl; i++) { cout << "Du bist gut!" << endl; } if (zahl > 0) break; // wenn der input über null ist, endlosschleife // abbrechen, falls das nicht erfüllt ist dann } else { cout << "Bitte geben Sie eine Zahl ein." << endl; // fehlermeldung bitte geben sie eine zahl ein cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); } } }
-
wob schrieb:
Hallo Sabifa,
du musst gar nicht viel ändern. Wichtig ist, dass nach falscher Eingabe der Stream cin im Fehlerstatus ist - und bevor du erneut liest, muss der Fehlerstatus gecleart werden (schau dir mal http://www.cplusplus.com/reference/ios/ios/clear/ und http://www.cplusplus.com/reference/istream/istream/ignore/ an).
Außerdem muss die Abfrage der Zahl natürlich in die Schleife. Das sieht dann so aus:
Hallo wob,
vielen Dank für deine Hilfe. Es klappt wunderbar und so wie ich es mir erhofft habe. :p
Nur nochmal zum verständnis:cin.ignore(numeric_limits<streamsize>::max(), '\n');
Gibt an das alle Zeichen bis zum Zeilensprung ignoriert werden. Doch warum ist es in unserem Beispiel von nöten? Möchte es richtig verstehen damit ich es bei einem erneuten Fall noch weiß und richtig anwenden kann.
-
Weil, wenn du es wegläßt, "cin << zahl" wieder denselben Fehler liefert, da die eingegebenen Zeichen noch im Tastaturpuffer (Eingabestrom) liegen.
Kommentiere einfach mal die Zeile aus, dann gib ein paar Buchstaben ein und beobachte die Ausgabe...
-
Th69 schrieb:
Weil, wenn du es wegläßt, "cin << zahl" wieder denselben Fehler liefert, da die eingegebenen Zeichen noch im Tastaturpuffer (Eingabestrom) liegen.
Kommentiere einfach mal die Zeile aus, dann gib ein paar Buchstaben ein und beobachte die Ausgabe...
Achja das macht natürlich sinn. Wenn ich es auskommentiere, wiederholt er "Bitte geben sie eine Zahl ein" und "Bitte Anzahl der Wiederholungen angeben". Macht sinn da noch der falsche wert noch im Puffer liegt.
Vielen lieben Dank euch, da ist meine Wissenslücke geschlossen wurden.