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.


Anmelden zum Antworten