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); } #endifZu 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