tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
6878
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Pixtar Pixtar ist offline Rookie
    Registriert seit
    Sep 2006
    Beiträge
    8
    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
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Das Ganze ist einfacher als du denkst.
    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 ();
    }
    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.

    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.

  3. #3
    Pixtar Pixtar ist offline Rookie
    Registriert seit
    Sep 2006
    Beiträge
    8
    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?
     

  4. #4
    Avatar von GeHo
    GeHo GeHo ist offline Mitglied Gold
    Registriert seit
    May 2004
    Beiträge
    133
    Man kann auch (vielleicht übersichtlicher) schreiben:
    Code cpp:
    1
    2
    3
    4
    
    cin >> radius;
    if (cin.fail() == false) {
      /* Zahl richtig eingelesen*/
    }
    oder verkürzt:
    Code cpp:
    1
    2
    3
    4
    
    cin >> radius;
    if (!cin.fail()) {
      /* Zahl richtig eingelesen*/
    }
    oder noch mehr verkürzt:
    Code cpp:
    1
    2
    3
    
    if (cin >> radius) {
      /* Zahl richtig eingelesen*/
    }

    PS: Das "cerr" wird dann wahrschnlich mit dem "cin" gekoppelt sein, das wenn ein Fehler auftritt, der Text ausgegeben wird, right?
    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).
     

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Pixtar
    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 () )
    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).

    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.
    Zitat Zitat von Pixtar
    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
    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.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Eingabefehler abfangen und neu eingeben
    Von jku_yannic im Forum Java Grundlagen
    Antworten: 2
    Letzter Beitrag: 11.12.09, 16:45
  2. Java Servlet EIngabefehler abfangen
    Von shocking im Forum Java
    Antworten: 4
    Letzter Beitrag: 11.09.09, 23:20
  3. Antworten: 3
    Letzter Beitrag: 15.05.07, 14:35
  4. Absturzsicherung gegen Eingabefehler
    Von Seeyou im Forum C/C++
    Antworten: 8
    Letzter Beitrag: 19.06.05, 20:58
  5. Eingabefehler abfangen!
    Von Gambit050 im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 28.10.04, 08:37