Probleme mit negativen Zahlen und Buchstaben



  • Hallo Community,
    im folgenden Programm sollen nun buchstaben und negative zahlen abefangen werden und eine Schleife bei eben diesen falschen Eingaben eingebaut werden.

    Ich verstehe leider nicht wie ich das mit dem bool Befehl einbauen soll, dass er BUchstaben und negative Zahlen abfängt und das auch noch bei zwei Eingaben.

    Hier das Programm:

    *entfernt*

    Vielen Dank !



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Der Grundgedanke ist dass der Stream bei ungültigen Eingaben in einen Fehlerzustand geht - zb. bei Buchstaben.
    Wenn der Stream im Fehlerzustand ist solltest du alle Zeichen im Stream-Puffer löschen da er sonst beim nächsten Leseversuch immer noch die ungültigen Zeichen vor der Nase hat.
    Könnte so aussehen:

    #include <iostream>
    #include <cmath>
    #include <limits> 
    
    using namespace std;
    
    float read_positive_float(char const* prompt)
    {
        cout << prompt;
    
        float result;
        while(!(cin >> result) || result < 0)
        {
            cout << "Fehler. " << prompt;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }
        return result;
    }
    
    int main()
    {
        float f_seite1 = read_positive_float("Geben Sie die Laenge der ersten Kathete in Zentimetern an: ");
        float f_seite2 = read_positive_float("Geben Sie die Laenge der zweiten Kathete in Zentimetern an: ");
        cout << "Die Laenge der Hypotenuse ist nach Pythagoras: " << sqrt(f_seite1*f_seite1 + f_seite2*f_seite2) << endl;  // Ausgabe der Hypotenuse
    
        system("pause");  // Anhalten des Programms
        return 0;
    }
    

    (Im Browserfenster getippt, kein Gewähr)

    Grüße,
    Ethon



  • vielen dank soweit hab aber leider noch einige Probleme mit der Lösung denen ich auch vorher in meinen Versuchen begegnet bin.

    Bei der ersten Kathete muss die Eingabe zweimal stattfinden. Also die Frage poppt auf und ich gebe eine Zahl ein, es passiert nichts und ich muss die Zahl noch einmal eingeben. Find den Fehler leider nicht.

    Des Weiteren bleibt er in einer Endlosschleife hängen sobald Buchstaben angegeben werden.

    Danke soweit !



  • Na klar, war auch Mist, sorry. Habe meine Antwort editiert.

    Der erste Fehler meinerseits war dass ich ignore vor clear aufgerufen haben - dh. der Stream war noch im Fehlerzustand.

    Der zweite dass der erste Input von ignore gefressen wurde.

    Die editierte Lösung sollte passen.



  • Okay 1A danke dir :). Ich mach mich mal an die nächste Aufgabe. Sollte eigtl. so ähnlich sein ich probiers mal alleine. Im ernstfall meld ich mich nochmal



  • So ein letztes Anliegen noch. Dieses Programm soll jegliche Zahl überspringen in der die 7 vorkommt. Klappt auch alles soweit nur sollen auch negative Zahlen nicht angenommen werden ( habs nur geschafft diese einfach in positive umzuwandeln, sollen aber abgelehnt werden und die eingabe soll wiederholt werden).

    *entfernt*



  • Wo ist das Problem? Prüf doch einfach ob sie kleiner 0 ist und lehn sie ab falls ja. 😕



  • Dann definiere i_zahl als unsigned int .
    Und schon schmeißt cin beim Minuszeichen einen Fehler.


  • Mod

    DirkB schrieb:

    Dann definiere i_zahl als unsigned int .
    Und schon schmeißt cin beim Minuszeichen einen Fehler.

    Nicht unbedingt. Ich bin mir nicht 100% sicher, ob das Lesen von negativen Zahlen ein erlaubtes Feature oder ein verlangtes Feature ist (keine Zeit, nachzugucken), aber es gibt Standardbibliotheken, die ein Minuszeichen lesen und dann entsprechend umbrechen (also -1 zum Maximalwert usw.).



  • super habs geschafft. danke euch !



  • SeppJ schrieb:

    Ich bin mir nicht 100% sicher, ob das Lesen von negativen Zahlen ein erlaubtes Feature oder ein verlangtes Feature ist (keine Zeit, nachzugucken), aber es gibt Standardbibliotheken, die ein Minuszeichen lesen und dann entsprechend umbrechen (also -1 zum Maximalwert usw.).

    Es ist vorgeschrieben, dass dann UINT_MAX zugewiesen wird und kein Fehlerbit gesetzt wird.

    [facet.num.get.virtuals] schrieb:

    Stage 3: The sequence of chars accumulated in stage 2 (the field) is converted to a numeric value
    by the rules of one of the functions declared in the header <cstdlib>:
    — For a signed integer value, the function strtoll.
    — For an unsigned integer value, the function strtoull.
    — For a floating-point value, the function strtold.
    The numeric value to be stored can be one of:
    — zero, if the conversion function fails to convert the entire field. ios_base::failbit is assigned
    to err.
    — the most positive representable value, if the field represents a value too large positive to be
    represented in val. ios_base::failbit is assigned to err.
    — the most negative representable value or zero for an unsigned integer type, if the field repre-
    sents a value too large negative to be represented in val. ios_base::failbit is assigned to
    err.

    strtoull gibt den Wert ULLONG_MAX zurück, falls die Eingabe nicht im Wertebereich vom long long liegt.

    Wobei err:

    iostate err = iostate::goodbit;
    use_facet< numget >(loc).get(*this, 0, *this, err, val);
    

    Man bemerke, dass bei int und short das Failbit gesetzt wird, falls ein Overflow passiert, bei allen anderen Typen nicht.

    Sinn=0


  • Mod

    feature schrieb:

    SeppJ schrieb:

    Ich bin mir nicht 100% sicher, ob das Lesen von negativen Zahlen ein erlaubtes Feature oder ein verlangtes Feature ist (keine Zeit, nachzugucken), aber es gibt Standardbibliotheken, die ein Minuszeichen lesen und dann entsprechend umbrechen (also -1 zum Maximalwert usw.).

    Es ist vorgeschrieben, dass dann UINT_MAX zugewiesen wird und kein Fehlerbit gesetzt wird.

    Nicht ganz. Hatte Zeit den Standard zu lesen und man muss bei diesen Operationen eben bis zur untersten Ebene gehen, daher ist es so schwer, das Standardverhalten genau nach zu vollziehen. strtoull gibt nämlich bei einem negativen Wert nämlich das umgebrochene Ergebnis zurück.

    Das ist äußerst verwirrend formuliert im Standarddokument (7.20.1.4,5 und 7.20.1.4,8 in C99) , aber das ist wohl sowohl Intention des (C-)Standards und es ist auch, wie es alle mir bekannten Implementierungen es handhaben (und damit indirekt auch istream::operator>>).

    Man bemerke, dass bei int und short das Failbit gesetzt wird, falls ein Overflow passiert, bei allen anderen Typen nicht.

    Sinn=0

    lol. Vermutlich ein Relikt aus der Zeit, als long noch der größte Basisintegertyp war und nicht long long.


Anmelden zum Antworten