Prozentrechner spinnt rum


  • Mod

    999999999999

    Zu Groß. int kann nur (ganzzahlige) Werte im Invervall [-2.147.483.648, 2.147.483.647] speichern. Alles andere führt zu vorzeichenbehafteten Überläufen; das resultiert in undefiniertem Verhalten.

    Und was bitte erwartest du, wenn du einen Buchstaben eingibst?



  • Das eine Fehlermeldung kommt



  • Prozento schrieb:

    Das eine Fehlermeldung kommt

    Das musst du selber programmieren.



  • Wie kann man denn einen Filter erstellen?



  • Prozento schrieb:

    Wie kann man denn einen Filter erstellen?

    Gar nicht (so).
    Es wird versucht eine Zahl einzulesen. Schlägt das fehl - weil z.B. ein Buchstabe eingegeben wurde - wird abgebrochen und der Stream in einen Fehler Zustand gesetzt. Mit

    if (!cin)
      cerr << "error";
    

    kannst du das abgfragen. Da der operator<< vom Stream, allerdings den Stream selber wieder zurückgibt, kannst du auch kürzer:

    if (cin >> val)
      // ok
    else
      // fehler
    

    oder so schreiben. Auch Schleifen sind möglich:

    while (!(cin >> val)) // solange das Einlesen nicht klappt
    {
      cin.clear(); // resette Fehlerzustand
      cin.ignore(numeric_limits<streamsize>::max, '\n'); // s.u.; erfordert Header limits
    }
    

    Allerdings musst du eine Sache beachten:
    Wenn du z.B. abc eingibst, merkt der Stream nach dem Einlesen von a, das da etwas nicht stimmt und bricht ab. Wenn nun erneut versucht einzulesen, ist das nächste Zeichen ein b und er bricht erneut ab. Um das zu vermeiden, wird ignore aufgerufen. ignore nimmt im ersten Parameter die maximale Anzahl an Zeichen, die ignoriert werden numeric_limits<streamsize>::max ist der höchste mögliche Wert von streamsize und bedeutet so viel wie unendlich, der zweite Parameter ist das Zeichen, bei dem gestoppt werden soll.

    cin.ignore(numeric_limits<streamsize>::max, '\n');
    

    überliest alles bis zum nächsten Newline.
    BTW: Nutz keine globalen Variablen (besonders nicht für so etwas)!



  • Nathan schrieb:

    BTW: Nutz keine globalen Variablen (besonders nicht für so etwas)!

    Auf goto würde ich auch verzichten. Hier einfach durch eine Endlosschleife ersetzen.



  • Arcoth schrieb:

    int kann nur (ganzzahlige) Werte im Invervall [-2.147.483.648, 2.147.483.647] speichern. Alles andere führt zu vorzeichenbehafteten Überläufen; das resultiert in undefiniertem Verhalten.

    Optimist.
    Schau mal bei http://www.cplusplus.com/reference/climits/ oder http://en.cppreference.com/w/cpp/language/types wo die Grenzen für int mindestens liegen.


  • Mod

    Ich habe direkt Annahmen über seine Plattform gemacht und ihm dementsprechend geantwortet.



  • Arcoth schrieb:

    Ich habe direkt Annahmen über seine Plattform gemacht und ihm dementsprechend geantwortet.

    Endlich mal einer mit einer funktionierenden Glaskugel 👍

    Oder nimmst du Hühnerknochen?

    🤡


  • Mod

    Bei dieser Annahme reicht auch eine Glaskugel aus dem Supermarkt, um richtig zu liegen. Einen nicht-32-Bit-int muss man schon ganz schön lange suchen.


Anmelden zum Antworten