Eingabeüberprüfung
-
Hey,
folgendes Problem:
Ich muss eine Zahl eingeben...soweit so leicht^^
cin>>zahl
diese Zahl muss einer Funktion übergeben werden..das ist auch kein problem.
dann gehts los:
In der Funktion soll die Zahl überprüft werden und wenn sie, keine zahl sondern ein Buchstabe ist oder eine Kommazahl ist, oder kleiner als 4 oder größer 9 ist, soll in der Funktion eine neueingabe erfolgen, wieder alle überprüfungen durcharbeiten und wenn die zahl endlich den ansprüchen genügt, soll sie zurückgegeben werden. Das zurückgeben ist jetzt auch nicht das Problem.//... int main(void) //... cin>>zahl; //eingabe pruef1(zahl); //übergabe an funktion //...so schaut die übergabe aus
für die Kommazahl überprüfung hab ich mir sowas überlegt das von der zahl einfach die ganze zeit 1 abgezogen wird bis die Zahl am ende zwischen 0 und 1 liegt, also einen rest hat und damit eine Kommazahl ist, oder das sie ==0 ist und damit zulässig ist.
Vom prinzip her schaut das dann so aus:int pruef1(int x) { int b; b=x;// b wird x zugewiesen da x in der funktion noch verändert wird while (x<4 || x>9) { cout<<"Fehler. Neueingabe\n"; cin>>x; } while (x>=0) { x--; if (x<1 && x>0) { cout<<"Kommazahl. Falscheingabe\n" cin>>x; } if (x==0) { return(b); } return(0) }soweit so schlecht. Jetzt ist die Frage wie Buchstaben verhinder kann und alles so zusammenfüge das es passt. Ich habe schon ein bisschen mit cin.fail() und isdigit(x) experimentiert und ihr glaub gar nicht wie gut ich endlosschleifen programmieren kann^^
Wenn ihr mir weiterhelfen könnt wäre ich sehr dankbar.
Grüße
-
Ich würde mit einem
std::stringund mitstd::getlinearbeiten und dann auf die Kriterien prüfen. Denn wenn man einen Buchstabe eingibt und dustd::cin >> MeinInt;geschrieben hast, krachts.
MfG, EOutOfResources
EDIT:
int pruef1(int x) { int b; b=x;// b wird x zugewiesen da x in der funktion noch verändert wird ... }b ist nur nötig, wenn x eine Referenz oder ein Zeiger ist. Auf deine Art wird eine Kopie erstellt.
-
Das was du geschrieben hast hab ich schon mal gelesen...aber mehr auch nicht
wenns gar nicht anders geht werde ich mich jetzt schon in solche angelegenheiten einlesen aber geht das nicht auch ein bisschen leichter? gibts da nicht doch eine möglichkeit das mit cin.fail() und cin.clear() zu machen?
Bin noch nicht ganz so weit was c++ angeht und hab eben versucht mit meinem wissen irgendwas für die aufgabe zu basteln^^
-
Ein
intkann nur ganze Zahlen aufnehmen. Keine Buchstaben und keine Kommazahlen. Wenn also etwas anderes als eine ganze Zahl eingegeben wird, kann inMeinIntgar kein sinnvoller Wert stehen.
cinbietet dir aber an, nach dem Einlesen zu prüfen, ob denn der Nutzer eine korrekte Eingabe getätigt hat. Die Prüffunktion muss dann noch prüfen, ob die Zahl auch in dem richtigen Bereich liegt (das kanncinja nicht wissen). Außerdem würde ich in der Prüffunktion nur die Überprüfung und nicht die Neueingabe tätigen.Am Ende könnte es so aussehen:
bool pruefe(int x) { return x >= 4 && x <= 9; } int main() { int zahl; cout << "Bitte Zahl eingeben: "; while(!(cin >> zahl) || !pruefe(zahl)) cout << "Falsch. Neueingabe: "; // arbeite mit zahl }
-
#include <iostream> int main() { int Zahl; std::cin >> Zahl; if(std::cin.fail()) { std::cin.clear(); std::cout << "Keine "; }; std::cout << "Zahl"; };MfG, EOutOfResources
EDIT: Ungetestet, Flüchtigkeitsfehler möglich
-
Hey,
ich hab noch ein bisschen weitergesucht nachdem ich nicht auf eine lösung gekommen bin mit der ich was anfangen kann. (Danke für eure Posts)Aber: Ich bin hier im Forum fündig geworden und hab nen alten Code ausgegraben
double MASSE; string eingabe; char *err_ptr = NULL; do { err_ptr = NULL; cout << "Bitte geben sie die Masse ein (Wert >= 10): " << endl; cin >> eingabe; MASSE = strtod( eingabe.c_str(), &err_ptr ); } while ( *err_ptr != '\0' || ( MASSE < 10) ); cout << "Sie haben bombensicher einen Wert >= 10 " "eingegeben: " << MASSE << endl;Kann mir jemand erklären was genau da passiert? hab das für meinen Code schon umgeformt nur ich versteh nicht wirklich was genau da gemacht wird. Ich will ja wissen wie das funktioniert das ich für solche Abfragen immer ne Lösung hab.
Wenn sich jemand findet wäre ich echt dankbar. (Er darf dann auch mal mein, jetzt fertiges Vier-Gewinnt-Spiel spiele^^)Lg
-
Das ist ein Gemisch zwischen C++ und C
double MASSE; //Neue Variable deklarieren (Zahl) string eingabe; //Neue Variable deklarieren (Eingabe) char *err_ptr = NULL; //Neue Variable deklarieren (Chars die nicht zur Zahl gehören) wobei die Definition sinnlos ist do //Schleife { err_ptr = NULL; //Nicht-Nummer-CString nullen cout << "Bitte geben sie die Masse ein (Wert >= 10): " << endl; //Antwort anfragen cin >> eingabe; //Eingabe aufnehmen MASSE = strtod( eingabe.c_str(), &err_ptr ); //Die Eingabe in eine Zahl konvertieren (alles ab dem ersten Nicht-Zahl-Char bis zum '\0' kommt in err_ptr) } while ( *err_ptr != '\0' || ( MASSE < 10) ); //Wiederholen wenn keine Zahl oder Masse zu klein cout << "Sie haben bombensicher einen Wert >= 10 " //Ausgabe "eingegeben: " << MASSE << endl;EDIT: Wenn
eingabe"32b9\0" ist, dann isterr_ptrnach dem Aufruf vonstrtod"b9\0".
-
Mhhh...
bin ich jetzt ein sehr böser Junge gewesen und komme deshalb in die Hölle oder darf man das so durchgehenlassen und ich kann mich freuen das ich mein erstes halbwegs großes Programm beendet habe?Ach ja: Danke für die erklärung
aber geht das noch ein bisschen mehr in richtung c++ für richtig dumme?^^Glaube an sich hab ichs verstanden da fehlt nur dieses *klick*
-
Thörb schrieb:
bin ich jetzt ein sehr böser Junge gewesen und komme deshalb in die Hölle oder darf man das so durchgehenlassen und ich kann mich freuen das ich mein erstes halbwegs großes Programm beendet habe?
Ich wäre nicht zufrieden...
Thörb schrieb:
Glaube an sich hab ichs verstanden da fehlt nur dieses *klick*
Wo liegt das Problem? Wenn du es jemandem erklären müsstest, was würdest du selbst nicht kapieren/wissen/verstehen?
-
Also wenn man es wirlich einfach Step by Step durchgeht ist es ja echt nicht schwer

Dann danke dir für deine Hilfe

-
Ich würde, wie bereits eingangs empfohlen, mit
getlineaufcinarbeiten, und das Parsen mit einemistringstreammachen. Dann spart man sich das Problem, im Fehlerfallcinwieder aufzuräumen.Irgendwie so (ungetestet):
std::string input; bool read_on = true; int result; std::cout << "Bitte Zahl eingeben ( 4 <= x <= 9)\n> "; while(read_on && std::getline(std::cin, input, '\n')) { bool input_okay = (std::istringstream(input) >> result); read_on = !input_okay || (result < 4) || (result > 9); if(read_on) { std::cerr << "Eingabe fehlerhaft.\n> "; } } std::cout << "Eingabe war: " << result << std::endl;Geht bestimmt auch mit weniger Zeilen...