ERLEDIGT
NEIN
NEIN
ANTWORTEN
4
4
ZUGRIFFE
6878
6878
EMPFEHLEN
-
Moin Leutz,
sollen für die Schule mal wieder was über stumpfsinniger proggen, naja das Programm steht soweit - möchte es nur Idiotensicher gestalten, dafür fehlt mir eine bestimmte Funktion:
"Wie kann ich eine Eingabe (cin >> a <- definiert durch double, nicht int) so gestallten, das wirklich nur Zahlen eingegeben werden?"
Ich habe es schon nachlesen können, das man dafür isalpha() nehmen soll, Problem bei der Sache ist aber, das isalpha() nur mit int-Definitionen arbeitet und nicht mit double ...
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
#include <iostream.h> #include <ctype.h> int main() { //Variablendeklaration long double A=0; long double PI=3.1415926535897932384626433832795028841972; //Programmeinführung cout << "\t\t\tKreisflaechenberechnung\n"; cout << "\t\t\t Alle Angaben in 'cm' \n\n"; //Wiedereinstieg nach Eingabefehler Fehler: //Frage nach der einer Kreisvariablen cout << "Welchen Radius besitzt der Kreis?\n"; //Eingabe der Kreisvariablen cout << ">> "; double radius = 0; cin >> radius; //Eingabefehler abfangen if ( radius==0 || radius<0) { cout << "\nBitte nur Zahlen (positive) verwenden bzw. keine Null!\n\n"; goto Fehler; } else { cout << ""; } //Berechnung A=2*radius*PI; //Ausgabe cout << "\nDie Kreisinnenflaeche betraegt:\n"; cout << ">> " << A << " cm" << "\n\n\n\n\n\n\n\n\n\n"; return 0; }
Wie ihr vielleicht seht, hab ich nur einen Abfang für negative Zahlen, sowie Null hinbekommen ... ne Idee?
Mfg Pixtar
-
20.09.06 16:32 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Das Ganze ist einfacher als du denkst.Zur Erklärung: Du solltest immer gleich beim Einlesen überprüfen ob das Einlesen erfolgreich war. Dazu ist es meist günstig das Einlesen selbst gleich in einer Bedingung zu machen.Code cpp:1 2 3 4 5 6 7 8
if (cin >> radius && radius > 0) { // Eingabe OK ... } else { // Eingabe war kein double oder es trat EOF auf, oder der eingelesene Wert war nicht größer 0. cerr << "Sie müssen eine gültige positive rationale Zahl eingeben!" << endl; cin.clear (); }
So wie du es vorher gemacht hast, ist es problematisch weil du da nicht kontrollierst ob überhaupt etwas eingelesen wurde oder nicht - und somit rechnest du einfach mit einem alten Wert von radius weiter.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Das mit der "leeren" Eingabe ist ja klaro, das hatte ich nun garnicht bedacht, auch das die Variable nach einer falschen Eingabe wieder geleert wird ( cin.clear () )
ABER
was beinhaltet dieser Teil des Quellcodes
if (cin >> radius && radius > 0)
das Buchstaben, negative Zahlen und eine leere Eingabe ausgeschlossen werden bzw. als falsch gewertet werden
Mfg Pixtar
PS: Das "cerr" wird dann wahrschnlich mit dem "cin" gekoppelt sein, das wenn ein Fehler auftritt, der Text ausgegeben wird, right?
-
Man kann auch (vielleicht übersichtlicher) schreiben:
oder verkürzt:Code cpp:1 2 3 4
cin >> radius; if (cin.fail() == false) { /* Zahl richtig eingelesen*/ }
oder noch mehr verkürzt:Code cpp:1 2 3 4
cin >> radius; if (!cin.fail()) { /* Zahl richtig eingelesen*/ }
Code cpp:1 2 3
if (cin >> radius) { /* Zahl richtig eingelesen*/ }
Nee, 'cerr' hat nichts direkt mit 'cin' zu tun. 'cerr' kannst du wie 'cout' überall im Quelcode verwenden. Wie der Name schon sagt, ist 'cerr' für die Fehlerausgabe gedacht. Der Vorteil von 'cerr' gegenüber zu 'cout' ist, dass die Ausgabe ungepuffert ist und dass die Ausgabe immer auf den Bildschirm erscheint, auch wenn der stdout umgeleitet wurde (also sowas wie test.exe > ausgabe.txt im shell).PS: Das "cerr" wird dann wahrschnlich mit dem "cin" gekoppelt sein, das wenn ein Fehler auftritt, der Text ausgegeben wird, right?
-
21.09.06 15:27 #5
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Das cin.clear() bedeutet nur, das der Streamzustand wieder zurückgesetzt wird , wobei es eine gute Idee wäre, das nur zu tun wenn cin noch nicht am EOF ist und danach von der Eingabe eine komplette Zeile zu lesen (um den Eingabepuffer zu leeren).
Zitat von Pixtar
Wenn der Stream cin in einem Fehlerzustand ist (egal warum), dann kann von dem Stream nichts mehr gelesen werden. Daher muß man den Zustand wieder zurücksetzen damit man vom Benutzer nochmal etwas abfragen kann. Allerdings wenn die Eingabe fehlgeschlagen ist, dann wurden auch keine Zeichen aus dem Eingabepuffer des Streams entfernt, d.h. was immer der Benutzer eingegeben hat ist immer noch da und wird beim nächsten Einlesen wiederverwendet.
Ja. Wenn radius ein double ist, dann schlägt die Eingabe fehl, sobald der eingegebene Wert kein korrekter double-Wert ist. Sollte die Eingabe klappen wird dann auch noch überprüft ob radius > 0 ist.
Zitat von Pixtar
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ähnliche Themen
-
Eingabefehler abfangen und neu eingeben
Von jku_yannic im Forum Java GrundlagenAntworten: 2Letzter Beitrag: 11.12.09, 16:45 -
Java Servlet EIngabefehler abfangen
Von shocking im Forum JavaAntworten: 4Letzter Beitrag: 11.09.09, 23:20 -
Eingabefehler - Buchstaben in Zahlen verhindern?
Von freak_xyz im Forum C/C++Antworten: 3Letzter Beitrag: 15.05.07, 14:35 -
Absturzsicherung gegen Eingabefehler
Von Seeyou im Forum C/C++Antworten: 8Letzter Beitrag: 19.06.05, 20:58 -
Eingabefehler abfangen!
Von Gambit050 im Forum C/C++Antworten: 4Letzter Beitrag: 28.10.04, 08:37





Zitieren
Login






