Buchstaben Sperren



  • Hallo hab ein kleines problem mit meinem programm.
    unzwar wenn man bei der eingabe einen buchstaben eingibt z.b a dann verhält sich das programm wie als hätte man loop drinne es wiederholt sich immer wieder ohne das man was eingeben kann muss man also beenden.

    Nun versuche ich seit einer weile eine lösung dafür zu finden.
    Da ich nix gefunden habe was funktioniert wende ich mich mal an euch

    #include <iostream>
    #include <conio.h>
    #include <stdlib.h>
    
    using namespace std;
    
    void main()
    {
    	int mal;
    
    	int auswahl;
    	double summe;
    	double summe2;
    	double summe3;
    	double summe4;
    	double Talankristall;
    	double Titan;
    	double Eisen;
    	double H2;
    	double Helium3;
    	double Crokristall;
    	double Trueptan ;
    	int ende = 0;
    
    do
    {
      cout << "Bitte keine Buchstaben eingeben "<< endl;
    
            cout << " " << endl;
    	cout << "Geben sie die Anzahl ein: ";
    	cin >> mal;
    	cout << endl << endl;
    	cout << "Wählen sie ein Objekt" << endl;
    	cout << "-----------------------------" << endl;
            cout << " " << endl;
    	cout << "Waffen "<< endl;
            cout << "--------" << endl;
            cout << " " << endl;
            cout << "-1- Pulslaser " << endl;
            cout << "-2- Trippelpulslaser " << endl;
            cout << "-3- Elektronenkanone " << endl;
            cout << "-4- Higsblaster " << endl;
            cout << "-5- Protonenlaser " << endl;
            cout << "-6- Tachionengeschütz (nur mit Premium-Account) " << endl;
            cout << "-7- Gravangeschütz (nur mit Premium-Account) " << endl;
            cout << " " << endl;
    	cout << endl << endl;
    	cout << "Ihre Auswahl: ";
    	cin >> auswahl;
    
    	switch(auswahl)
    	{
    
    	case 1: //Pulslaser 500 x Wasserstoff 750 x Titan 750 x Eisen 
    		Eisen = 750;
    		Titan = 750;
    		H2 = 500;
    		summe = mal * Eisen;
    		summe2 = mal * Titan;
    		summe3 = mal * H2;
    
    		cout << "Anzahl " << mal << endl;
    		cout << endl << endl;
    		cout << "Folgendes wird benoetigt: " << endl;
    		cout << endl;
    		cout << "Eisen: 750 " << endl;
    		cout << "Titan: 750 " << endl;
    		cout << "H2: 500 " << endl;
    		cout << endl;
    		cout << "Kosten wird das fuer " << mal << endl << endl;
    		cout << "Eisen " << summe << endl;
    		cout << "Titan " << summe2<<endl;
    		cout << "H2 " << summe3;
    		cout << endl << endl;
    		cout << "Wollen sie Beenden, wenn ja eins(1) eintippen " << endl;
            cout << "Oder um eine neue eingabe zu machen null (0) druecken: ";
    		cin >> ende;
                    cout << " "<< endl;
    		break;
    default :
    		cout << "Fehler neue Eingabe!";
    	}
    	}while(ende == 0);
    
    		if(ende == 1)
    	{
    		exit(1);
    	}
    
    	cout << "ENDE";
    	cin >> mal;
    
    }
    


  • Du hast zwei Moeglichkeiten

    1. Du schreibst dir ne eigene Funktion die nur bestimmte Zeichen bei der Eingabe erlaubt.
    2. Du liest die Eingabe erstmal in einen String, versucht diesen in eine Zahl zu konvertieren und wenn das nicht klappt gibst du nen Fehler aus oder was auch immer.
      http://www.c-plusplus.net/forum/viewtopic-var-t-is-39488.html


  • und wie mache ich das erste also was sollte da alles so rein

    ps: bin noch recht neu bei c++


  • Mod

    Wenn ein Buchstabe eingegeben wird, aber eine Zahl gelesen wird, dann wird der Eingabestrom mit einem Fehlerflag versehen. Dieses muss gelöscht werden (mit clear()), bevor weitere Eingaben erfolgen können. Und naheliegenderweise sollte man dann auch die Fehlerursache beseitigen, indem man die unerwarteten Zeichen aus dem Stream ignoriert (mit ignore()).

    #include <iostream>
    //#include <conio.h>
    #include <cstdlib>  // So heißt das in C++, stdlib.h ist C
    #include<limits>  // Brauche ich unten
    
    using namespace std;
    
    int main()   // main muss int zurückgeben
    {
        int mal;
    
        int auswahl;
        double summe;
        double summe2;
        double summe3;
        double summe4;
        double Talankristall;
        double Titan;
        double Eisen;
        double H2;
        double Helium3;
        double Crokristall;
        double Trueptan ;
        int ende = 0;
    
    do
    {
    
      cout << "Geben sie die Anzahl ein: ";
      while(!(cin >> mal))
          {
            cout << "Bitte keine Buchstaben eingeben."<< endl<<endl
                 << "Geben sie die Anzahl ein: "<<endl;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(),'\n');
         }
    
        cout << endl << endl;
        cout << "Wählen sie ein Objekt" << endl;
        cout << "-----------------------------" << endl;
            cout << " " << endl;
        cout << "Waffen "<< endl;
            cout << "--------" << endl;
            cout << " " << endl;
            cout << "-1- Pulslaser " << endl;
            cout << "-2- Trippelpulslaser " << endl;
            cout << "-3- Elektronenkanone " << endl;
            cout << "-4- Higsblaster " << endl;
            cout << "-5- Protonenlaser " << endl;
            cout << "-6- Tachionengeschütz (nur mit Premium-Account) " << endl;
            cout << "-7- Gravangeschütz (nur mit Premium-Account) " << endl;
            cout << " " << endl;
        cout << endl << endl;
        cout << "Ihre Auswahl: ";
        while(!(cin >> auswahl))
          {
            cout << "Bitte keine Buchstaben eingeben."<< endl<<endl
                 << "Ihre Auswahl: "<<endl;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(),'\n');
          }
    
        switch(auswahl)
        {
    
        case 1: //Pulslaser 500 x Wasserstoff 750 x Titan 750 x Eisen
            Eisen = 750;
            Titan = 750;
            H2 = 500;
            summe = mal * Eisen;
            summe2 = mal * Titan;
            summe3 = mal * H2;
    
            cout << "Anzahl " << mal << endl;
            cout << endl << endl;
            cout << "Folgendes wird benoetigt: " << endl;
            cout << endl;
            cout << "Eisen: 750 " << endl;
            cout << "Titan: 750 " << endl;
            cout << "H2: 500 " << endl;
            cout << endl;
            cout << "Kosten wird das fuer " << mal << endl << endl;
            cout << "Eisen " << summe << endl;
            cout << "Titan " << summe2<<endl;
            cout << "H2 " << summe3;
            cout << endl << endl;
            cout << "Wollen sie Beenden, wenn ja eins(1) eintippen " << endl;
            cout << "Oder um eine neue eingabe zu machen null (0) druecken: ";
            cin >> ende;
                    cout << " "<< endl;
            break;
    default :
            cout << "Fehler neue Eingabe!";
        }
        }while(ende == 0);
    
            if(ende == 1)
        {
            exit(1);
        }
    
        cout << "ENDE";
        cin >> mal;
    
    }
    


  • genial danke 🙂



  • Die Variable 'ende' ist durch Initialisierung Null und bleibt dies bei der Eingabe eines Buchstabens. Das Programm läuft dann in den default-Zweig. Die nachfolgende while-Schleife läuft mit Null unendlich weiter.

    Vorschlag: Trenne die Überprüfung der Eingabe (nur Ziffern) von der Entscheidung, ob wiederholt werden soll. Und mache im default-Zweig eine Fehlermeldung mit anschliessender Möglichkeit zur Neueingabe.

    Weitere Hinweise:
    1. Eine while-Schleife läuft solange, wie sie wahr ist. In C --> Null gleich falsch, alles andere wahr.
    2. Die Zuordnung == ist verzichtbar.
    3. Die while-Schleife wird besser über alles - auch die Eingabe - gemacht.

    edit: Der Vorschlag von SeppJ erscheint mir zu unübersichtlich. Aber da geht es hinein in den Programmierstil - und der ist Geschmacksache.


Anmelden zum Antworten