Fehlersuche bei Zeicheneingabe
-
Ich habe eine Frage zu Zeicheneingaben. Ich habe hier ein Programm, dass zwar bei der Eingabe eines + nicht meckert, aber bei Zeichen, dh. A->Z oder # etc.
Warum wird das Pluszeichen akzeptiert?
#include <iostream.h> enum CHOICE{DrawRect=1,GetArea,GetPerim,ChangeDimensions,Quit}; // Aufzaehlungskonstante für die Funktionen class Rectangle{ // Klassenerstellung damit Daten, auch komplexe Daten über das Objekt definiert, //geändert werden können public: Rectangle(int width, int height); // Konstruktor ~Rectangle(); // Destruktor int GetHeight() const {return itsHeight; } // Elementfunktion Get eingegebene Höhe int GetWidth() const {return itsWidth; } // Elementfunktion Get eingegebene Breite int GetArea() const {return itsHeight*itsWidth; } // Elementfunktion Get berechnete Flaeche int GetPerim() const {return 2*itsHeight+2*itsWidth; } // Elementfunktion Get eingegebene Parameter void SetSize(int newWidth, int newHeight); // Elementfunktion Setzt Werte (Höhe, Breite) private: int itsWidth; // Elementvariablen int itsHeight; }; void Rectangle::SetSize(int newWidth, int newHeight){ // Funktionsdefinition itsWidth=newWidth; // Initialisierung itsHeight=newHeight; } Rectangle::Rectangle(int width, int height){ itsWidth=width; // Konstruktor Initialisierung itsHeight=height; } Rectangle::~Rectangle(){} // Destruktor (zerstört das Objekt) int DoMenu(); // Deklaration der Funktionen für Main Funktion void DoDrawRect(Rectangle); void DoGetArea(Rectangle); void DoGetPerim(Rectangle); int main(){ Rectangle theRect(30,5); // Objekterstellung mit Vorgabedaten int choice = DrawRect; // Aufruf über choice der DrawRectfunktion über enum int fQuit = false; // flag, Quit soll solange false sein, bis es zu true gewählt wird while(!fQuit){ //Endlos-Schleife solange Menu aufrufen bis Quit gewählt wird choice=DoMenu(); // Aufruf des Menu's if (choice < DrawRect || choice > Quit){ // Abfrage cout << "\nAuswahl ungueltig. Bitte neu versuchen.\n\n"; continue; } switch(choice){ case DrawRect: DoDrawRect(theRect); break; case GetArea: DoGetArea(theRect); break; case GetPerim: DoGetPerim(theRect); break; case ChangeDimensions: int newLength, newWidth; cout << "\nNeue Breite: "; cin >> newWidth; cout << "\nNeue Höhe: "; cin >> newLength; theRect.SetSize(newWidth,newLength); DoDrawRect(theRect); break; case Quit: fQuit=true; cout << "\nVerlassen...\n\n"; break; default: cout << "Fehler beim Auswaehlen!\n"; fQuit=true; break; } } return 0; } int DoMenu(){ int choice; cout << "\n\n *** Menue *** \n\n"; cout << "(1) Rechteck zeichnen\n"; cout << "(2) Flaeche\n"; cout << "(3) Umfang\n"; cout << "(4) Groesse veraendern\n"; cout << "(5) Beenden.\n"; cin >> choice; return choice; } void DoDrawRect(Rectangle theRect){ int height=theRect.GetHeight(); // Aufruf über das Objekt der Elementfunktion int width=theRect.GetWidth(); for(int i=0;i<height;i++){ // Ausgabe über geschachtelte Forschleifen des Rectangles for(int j=0;j<width;j++) cout << "*"; cout << "\n"; } } void DoGetArea(Rectangle theRect){ cout << "Flaeche: " << theRect.GetArea() << endl; // Gib berechnete Fläche über das Objekt aus } void DoGetPerim(Rectangle theRect){ cout << "Umfang: " << theRect.GetPerim() << endl; //Gib Parameter aus, die den Umfang bestimmen }
-
cin erwartet einen Integralen Wert.
Wenn du aber ein Zeichen eingibst wird das badflag von cin gesetzt und cin ist immer 'false'Ich würde bevor du cin einliesst fragen, ob die Eingabe gültig ist und nicht erst danach.
Ansonsten gibts eine Endlosschleife deines Menüs.