Probleme mit negativen Zahlen und Buchstaben



  • 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