Problem mit einer Menü-Schleife
-
Hallo Leute,
habe ein kleines.. oder auch größeres Problem. Haben in der Schule gerade Kontrollschleifen. Ich schaffe bekomme nur gerade mit einem Problem nicht zurecht.
Wenn statt einer Zahl irgendein Buchstabe eingegeben wird dann wiederholt sich das Menü ununterbrochen. Wie kann ich dies verhindern? Also wenn ich kein Menü habe dann beendet sich das Programm ja Automatisch aber mit dem Menü... nunja. Wäre sehr net wenn mir jemand helfen könnte. Danke schonmal im vor raus.#include <iostream> #include <iomanip> #include <stdlib.h> using namespace std; long double summe(long double, long double), plusschleife (long double); long double minusschleife (long double), fakultaet (long double); int menu (int), plusschleifemR (int), maleins (int); int main() { int z, mennu=0, grenzeR, kleinmaleins; long double fak, n1, n2, grenze; do { z = menu(mennu); switch (z) { case 1: cout << "Bitte geben Sie n1 ein: "; cin >> n1; cout << "Bitte geben Sie n2 ein: "; cin >> n2; summe (n1, n2); break; case 2: cout << "Bitte geben Sie n! ein: "; cin >> fak; fakultaet (fak); break; case 3: cout << "Bitte geben Sie die obere Zaehlgrenze ein: "; cin >> grenze; plusschleife (grenze); break; case 4: cout << "Bitte geben Sie den Wert ein ab dem runtergezaehlt werden soll: "; cin >> grenze; minusschleife (grenze); break; case 5: cout << "Bitte geben Sie die obere Grenze ein: "; cin >> grenzeR; plusschleifemR (grenzeR); break; case 6: cout << "Bitte geben Sie eine Zahl von 1 - 10 ein: "; cin >> kleinmaleins; maleins (kleinmaleins); break; default: cout << "Das Programm wird Beendet!" << endl; } } while (z <= 6); return 0; } int menu (int mennu) { system("cls"); cout << "---------------------------------------------\n" << " --- Schleifen --- \n" << "---------------------------------------------\n\n" << "Berechnungen von Summen und Fakultaeten\n\n" << "1\t- Summe von n1 bis n2\n" << "2\t- Faktultaet n!\n" << "3\t- Zaehlschleife (Plus)\n" << "4\t- Zaehlschleife (Minus)\n" << "5\t- Zaehlschleife (Plus) Gauss Lösung\n" << "6\t- Kleines Ein-Mal-Eins\n\n" << "sonst\t- Programmende\n\n"; cin >> mennu; return mennu; } long double summe (long double n1, long double n2) { long double ergebnis = 0; if (n2 >= n1) { for (long double i = n2; i >= n1; i--) { ergebnis += i; } cout << "Die Summenrechnung von n1 bis n2 betraegt: " << ergebnis << endl; } else { cout << "n2 muss hier groesser sein als n1" << endl; } cin.get(); cin.get(); return 0; } long double fakultaet (long double fak) { long double ergebnis = 1; for (long double i = fak; i > 0; i--) { ergebnis *= i; } cout << "Die Fakultaet von n! betraegt: " << ergebnis << endl; cin.get(); cin.get(); return 0; } long double plusschleife (long double grenze) { long double ergebnis = 0; cout << "s = "; for (long double x = 1; x <= grenze-1; x++) { cout << x << " + "; ergebnis += x; } ergebnis += grenze; cout << grenze << " = " << ergebnis << endl; cin.get(); cin.get(); return 0; } long double minusschleife (long double grenze) { for(long double i = 0; i < grenze; grenze--) { cout << grenze << ", "; } cout << grenze << endl; cin.get(); cin.get(); return 0; } int plusschleifemR (int grenze) { int ergebnis = 0; cout << "s = "; for (int x = 1; x <= grenze-1; x++) { cout << x << " + "; ergebnis += x; } ergebnis += grenze; cout << grenze << " = "; if (grenze%2==0) { cout << grenze/2*(grenze+1) << endl; } else { cout << ((grenze-1)/2)*(grenze+2)+1 << endl; } cin.get(); cin.get(); return 0; } int maleins (int kleinmaleins) { for(int i = 1; i <= 10; i++) { cout << setw(6) << kleinmaleins*i; } cin.get(); cin.get(); return 0; }
-
Das kann man zum Beispiel so machen:
long double summe(long double, long double), plusschleife (long double); long double minusschleife (long double), fakultaet (long double); char menu (); // Hier habe ich die Signatur geändert int plusschleifemR (int), maleins (int); int main() { int grenzeR, kleinmaleins; long double fak, n1, n2, grenze; bool exit=false; // Dies habe ich hinzugefügt do { char z = menu(); // Ich abe den Typ von z geändert switch (z) { // Die cases habe ich jeweils von int nach char geändert case '1': cout << "Bitte geben Sie n1 ein: "; cin >> n1; cout << "Bitte geben Sie n2 ein: "; cin >> n2; summe (n1, n2); break; case '2': cout << "Bitte geben Sie n! ein: "; cin >> fak; fakultaet (fak); break; case '3': cout << "Bitte geben Sie die obere Zaehlgrenze ein: "; cin >> grenze; plusschleife (grenze); break; case '4': cout << "Bitte geben Sie den Wert ein ab dem runtergezaehlt werden soll: "; cin >> grenze; minusschleife (grenze); break; case '5': cout << "Bitte geben Sie die obere Grenze ein: "; cin >> grenzeR; plusschleifemR (grenzeR); break; case '6': cout << "Bitte geben Sie eine Zahl von 1 - 10 ein: "; cin >> kleinmaleins; maleins (kleinmaleins); break; default: cout << "Das Programm wird Beendet!" << endl; exit = true; // Das hier habe ich hinzugefügt } } while (!exit); // Hier habe ich die Abbruchbedingung geändert return 0; } char menu () { system("cls"); cout << "---------------------------------------------\n" << " --- Schleifen --- \n" << "---------------------------------------------\n\n" << "Berechnungen von Summen und Fakultaeten\n\n" << "1\t- Summe von n1 bis n2\n" << "2\t- Faktultaet n!\n" << "3\t- Zaehlschleife (Plus)\n" << "4\t- Zaehlschleife (Minus)\n" << "5\t- Zaehlschleife (Plus) Gauss Lösung\n" << "6\t- Kleines Ein-Mal-Eins\n\n" << "sonst\t- Programmende\n\n"; char mennu; // Hier habe ich den Typ von mennu geändert cin >> mennu; return mennu; }
-
bool goon=true; do { z = menu(mennu);default: cout << "Das Programm wird Beendet!" << endl; goon=false; } } while (goon);PS: Du solltest dein Fehlerhandling verbessern, z.B. bei eingegebenen Buchstaben (Endlosschleife), negativen Zahl oder Kommazahlen.
-
Super, es funktioniert... auf die "char" variante bin ich gar nicht gekommen -.-
Danke
Aber jetzt eine andere Frage, auf das gleiche Problem bezogen, wenn ich ja nun einen Buchstaben eingebe beendet sich ja das gesamte Programm. Wie bekomme ich es hin das er, wenn ich in irgendeiner der Aufgaben, statt einer Zahl, einen Buchstaben eingebe dann zum Menü zurückgeht.
Am liebsten wären mir erstmal Ideen, da ich momentan keine habe, ausser entweder mit einem "goto" oder mit einer wahrschleife für fast jede Zahleneingabe.
Was könnte man da machen?
-
Althi schrieb:
Super, es funktioniert... auf die "char" variante bin ich gar nicht gekommen -.-
Danke
Aber jetzt eine andere Frage, auf das gleiche Problem bezogen, wenn ich ja nun einen Buchstaben eingebe beendet sich ja das gesamte Programm. Wie bekomme ich es hin das er, wenn ich in irgendeiner der Aufgaben, statt einer Zahl, einen Buchstaben eingebe dann zum Menü zurückgeht.
Am liebsten wären mir erstmal Ideen, da ich momentan keine habe, ausser entweder mit einem "goto" oder mit einer wahrschleife für fast jede Zahleneingabe.
Was könnte man da machen?
Vorschlag: In den Unteraufgaben prüfst du nach dem Einlesen der Zahl, ob der cin-stream noch in Ordnung ist ( if (cin) ... ). Denn wenn du einen Buchstaben eingibst, wenn eine Zahl erwartet wird, dann wird das failbit gesetzt. Wenn das der Fall ist, machst du einfach return und schon bist du zurück in deiner Menüschleife. Vergiss aber nicht, vor dem return den stream wieder in Ordnung zu bringen und die (noch nicht eingelesenen) Buchstaben daraus zu entfernen!