Neuling Frage



  • Hallöchen

    Da ich vor 3 - 4 Tagen angefangen C++ zu lernen muss ich euch mal bischen Löschern XD.

    Also ich würde gerne Wissen ob es möglich ist zu Prüfen, ob in einer Variable die vom User eingegeben wurde, nur zahlen sind ??

    Da mein erstes Programm nen Kleiner Rechner ist um mit den Strukturen und Befehlen in C++ klar zu kommen XD

    Hab im Quellcode auch 2 Komentare dazu gemacht wo ich es brauchen könnte.

    // Kleiner Rechner 
    // c++ includes
    #include <iostream>
    
    using namespace std;
    
    // funktionen vorladen
    double fnRechnen(double dZahl1, double dZahl2, int nRechenart);
    
    int main(void)
    {
    	// variablen deklarieren
    	// M_ = Menü  / p_ = Prüfen
    
    	int nM_eing1, nM_eing2, nP_schl = 1, nM_ende = 1;
    	double dZ1,dZ2;
    
    	// Programm beginn
    
    	while(nM_ende)
    	{
    		//Menü
    		system("cls");
    		nP_schl = 1;
    		cout << " Menue" << endl << endl;
    		cout << "<1>	Addition" << endl;
    		cout << "<2>	Subtraktion" << endl;
    		cout << "<3>	Multiplikation" << endl;
    		cout << "<4>	Division" << endl;
    		cout << "<5>	Exit" << endl << endl;
    
    		// Benutzereingabe Menü
    		cin >> nM_eing1;
    
    		//Prüfen der eingabe ob 1-5 ist 
    		if(nM_eing1 == 1 || nM_eing1 == 2 || nM_eing1 == 3 || nM_eing1 == 4 || nM_eing1 == 5  )
    		{
    
    			// Rechenarten wählen
    			switch(nM_eing1)
    			{
    
    			case 1:   // Addition 
    
    				while(nP_schl)
    				{
    					cout << "------ Addition ------" << endl << endl;
    					cout << "Bitte Zahl1 eingeben: " << endl;
    					cin	>> dZ1;  // hier muss ich noch herrausfinden wie ich prüfe das nur zahlen eingegeben sind <------------------
    					cout << endl << "Bitte Zahl2 eingeben: " << endl;
    					cin	>> dZ2;	// hier muss ich noch herrausfinden wie ich prüfe das nur zahlen eingegeben sind <------------------
    					cout << endl << dZ1 << " + " << dZ2 << " = " << fnRechnen(dZ1, dZ2, nM_eing1) << endl << endl;
    
    					// Prüfen ob nochmal Addition rechen
    					while(nP_schl)
    					{
    
    						cout << "Wollen sie noch eine Additionsaufgabe Rechnen " << endl << endl;
    						cout << "<1> = Ja" << endl;
    						cout << "<2> = Nein" << endl << endl;
    
    						cin >> nM_eing2;
    
    						system("cls");
    
    						// eingabe prüfen
    						if(nM_eing2 == 1 || nM_eing2 == 2 )
    						{
    
    							if(nM_eing2 == 1)
    							{
    								break;
    
    							}else
    							{
    
    								nP_schl = 0;
    
    							}
    
    						}else{
    
    							continue;
    						}
    
    					}
    
    				}
    
    				break;
    
    				// Addition Ende
    
    			case 2:
    
    				while(nP_schl)
    				{
    					cout << "------ Subtraktion ------" << endl << endl;
    					cout << "Bitte Zahl1 eingeben: " << endl;
    					cin	>> dZ1;  // hier muss ich noch herrausfinden wie ich prüfe das nur zahlen eingegeben sind <------------------
    					cout << endl << "Bitte Zahl2 eingeben: " << endl;
    					cin	>> dZ2;	// hier muss ich noch herrausfinden wie ich prüfe das nur zahlen eingegeben sind <------------------
    					cout << endl << dZ1 << " - " << dZ2 << " = " << fnRechnen(dZ1, dZ2, nM_eing1) << endl << endl;
    
    					// Prüfen ob nochmal Subtraktion rechen
    					while(nP_schl)
    					{
    
    						cout << "Wollen sie noch eine Subtraktionsaufgabe Rechnen " << endl << endl;
    						cout << "<1> = Ja" << endl;
    						cout << "<2> = Nein" << endl << endl;
    
    						cin >> nM_eing2;
    
    						system("cls");
    
    						// eingabe prüfen
    						if(nM_eing2 == 1 || nM_eing2 == 2 )
    						{
    
    							if(nM_eing2 == 1)
    							{
    								break;
    
    							}else
    							{
    
    								nP_schl = 0;
    
    							}
    
    						}else{
    
    							continue;
    						}
    
    					}
    
    				}
    
    				break;
    
    				// subtraktion Ende
    
    			case 3:
    
    				while(nP_schl)
    				{
    					cout << "------ Multiplikation ------" << endl << endl;
    					cout << "Bitte Zahl1 eingeben: " << endl;
    					cin	>> dZ1;  // hier muss ich noch herrausfinden wie ich prüfe das nur zahlen eingegeben sind <------------------
    					cout << endl << "Bitte Zahl2 eingeben: " << endl;
    					cin	>> dZ2;	// hier muss ich noch herrausfinden wie ich prüfe das nur zahlen eingegeben sind <------------------
    					cout << endl << dZ1 << " * " << dZ2 << " = " << fnRechnen(dZ1, dZ2, nM_eing1) << endl << endl;
    
    					// Prüfen ob nochmal Multiplikation rechen
    					while(nP_schl)
    					{
    
    						cout << "Wollen sie noch eine Multiplikationsaufgabe Rechnen " << endl << endl;
    						cout << "<1> = Ja" << endl;
    						cout << "<2> = Nein" << endl << endl;
    
    						cin >> nM_eing2;
    
    						system("cls");
    
    						// eingabe prüfen
    						if(nM_eing2 == 1 || nM_eing2 == 2 )
    						{
    
    							if(nM_eing2 == 1)
    							{
    								break;
    
    							}else
    							{
    
    								nP_schl = 0;
    
    							}
    
    						}else{
    
    							continue;
    						}
    
    					}
    
    				}
    
    				break;
    				// Multiplikation Ende
    
    			case 4:
    
    								while(nP_schl)
    				{
    					cout << "------ Division ------" << endl << endl;
    					cout << "Bitte Zahl1 eingeben: " << endl;
    					cin	>> dZ1;  // hier muss ich noch herrausfinden wie ich prüfe das nur zahlen eingegeben sind <------------------
    					cout << endl << "Bitte Zahl2 eingeben: " << endl;
    					cin	>> dZ2;	// hier muss ich noch herrausfinden wie ich prüfe das nur zahlen eingegeben sind <------------------
    					cout << endl << dZ1 << " / " << dZ2 << " = " << fnRechnen(dZ1, dZ2, nM_eing1) << endl << endl;
    
    					// Prüfen ob nochmal Division rechen
    					while(nP_schl)
    					{
    
    						cout << "Wollen sie noch eine Divisionsaufgabe Rechnen " << endl << endl;
    						cout << "<1> = Ja" << endl;
    						cout << "<2> = Nein" << endl << endl;
    
    						cin >> nM_eing2;
    
    						system("cls");
    
    						// eingabe prüfen
    						if(nM_eing2 == 1 || nM_eing2 == 2 )
    						{
    
    							if(nM_eing2 == 1)
    							{
    								break;
    
    							}else
    							{
    
    								nP_schl = 0;
    
    							}
    
    						}else{
    
    							continue;
    						}
    
    					}
    
    				}
    
    				break;
    
    				// Division Ende
    			case 5:
    				nM_ende = 0;
    				break;
    
    			}
    
    		}else{
    
    		cout << "Falsche eingabe bitte neu eingeben " << endl;
    		system("pause");
    		system("cls");
    		}
    
    	}
    
    	system("cls");
    	cout << " Vielen Dank das sie Kleiner Rechner benutz haben <ENTER>" << endl << endl;
    
    	system("pause");
    	return 0;
    }
    
    // funktionen 
    
    double fnRechnen(double dZahl1, double dZahl2, int nRechenart)
    {
    	double dErg;
    
    	switch(nRechenart)
    	{
    	case 1:
    		dErg = dZahl1 + dZahl2;
    		break;
    
    	case 2:
    		dErg = dZahl1 - dZahl2;
    		break;
    
    	case 3:
    		dErg = dZahl1 * dZahl2;
    		break;
    
    	case 4:
    		dErg = dZahl1 / dZahl2;
    		break;
    
    	}
    
    	return dErg;
    }
    

    Wie gesagt ist mein erstes soweit fertiges Programm !!!!

    Bitte reist mir nicht den Kopf runter es geht bestimmt vieles besser zu Programmieren.

    Danke schon mal für eure Mühe.... 😉



  • Ich benutze für so was folgende Funktionsvorlage:

    #ifndef INCLUDED_READ_TYPE_HH
    #define INCLUDED_READ_TYPE_HH
    
    #include <iostream>
    #include <sstream>
    #include <string>
    
    template<typename result_t>
    result_t read_type_ref(result_t &dest,
    		       std::string const &prompt,
    		       std::istream &in  = std::cin,
    		       std::ostream &out = std::cout) {
      std::istringstream parser;
      std::string line;
    
      do {
        parser.clear();
    
        out << prompt << std::flush;
    
        std::getline(in, line);
    
        parser.str(line);
        parser >> dest;
      } while(!parser);
    
      return dest;
    }
    
    template<typename result_t>
    result_t read_type(std::string const &prompt,
    		   std::istream &in  = std::cin,
    		   std::ostream &out = std::cout) {
      result_t result;
      return read_type_ref(result, prompt, in, out);
    }
    
    #endif
    

    Zu benutzen wie folgt:

    double d = read_type<double>("Zahl eingeben: ");
    

    In der obrigen Implementation fragt das so lange nach, bis eine gültige Eingabe eingegeben wurde.

    Die Idee ist im Grunde ziemlich simpel:

    std::string line;
    double number;
    
    std::getline(std::cin, line);    // Zeile einlesen
    
    std::istringstream parser(line); // In ein lokales Stream-Objekt stopfen, das mit Strings arbeitet
    if(parser >> number) {           // Versuchen, einzulesen.
      // Erfolg
    } else {
      // Fehlschlag
    }
    

    std::istringstream verhält sich genau wie std::cin, liest aber nicht von der Konsole, sondern aus einem String (in diesem Fall line). Alle Streams sind außerdem in einen zu bool kompatiblen Typ umwandelbar, der true ist, wenn im Stream alles in Ordnung ist - nach einem fehlgeschlagenen Einleseversuch ist das nicht der Fall.



  • nun gut ich verstehe gerade erstmal nur Bahnhof.

    der C++ code ist noch um einiges zu hoch für mich denoch vielen vielen dank.



  • Naja, du kannst auch schlicht

    cin >> dZ1;
    
    if(cin) {
      // Erfolg
    } else {
      // Fehlschlag
    }
    

    schreiben, aber dann ist das, was nicht eingelesen werden konnte, halt immer noch in cin drin.

    Dann geht auch

    cin >> dZ1;
    
    if(cin) {
      // Erfolg
    } else {
      std::cin.clear(); // Fehlerzustand aufheben
      std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Bis zum Zeilenende ignorieren
    }
    

    ...aber ich finde das eigentlich nicht bedeutend einfacher als die stringstream-Variante. (Am Rande: std::numeric_limits<std::streamsize::max() ist der größte Wert, den std::streamsize annehmen kann.) Die zeilenbasierte Einlesevariante hat auch den Vorteil, dass keine Zeilenreste im Eingabestrom bleiben - Anfänger sind häufig verwirrt, wenn nach

    std::cin >> x;
    std::getline(std::cin, s);
    

    s meistens leer ist (das Zeilenende ist nach cin >> x immer noch in cin drin).



  • Xd


Anmelden zum Antworten