Warum geht else nicht?



  • Hi, wenn man nen buchstaben eingibt, muesste doch else stattfinden tut es aber nicht. Weiss jemand wieso?

    #include <iostream>

    using namespace std;

    int main ()

    {
    const int tempolimit = 100;
    int Geschwindigkeit = 0;

    cout << "Hier sind " << tempolimit << "km/h erlaubt\n";
    cout << "Wie schnell sind Sie gefahren?\n";
    cin >> Geschwindigkeit;

    if (Geschwindigkeit == tempolimit)
    { cout << "Nochmal Glueck gehabt, Junge..";
    }
    else if (Geschwindigkeit <= tempolimit)
    { cout << "Du bist " << tempolimit - Geschwindigkeit<< " km/h unter dem Tempolimit gefahren. Beruhig dich Junge.." << endl;
    }

    else if (Geschwindigkeit >= tempolimit)
    {
    cout << "Du bist " << Geschwindigkeit - tempolimit<< " km/h zu schnell gefahren. Das gibt maechtig Probleme, Junge..";
    }

    else
    {
    cout << "Ungueltige Eingabe";
    }

    return 0;

    }



  • Buchstaben, also chars, können implizit nach int konvertiert werden. Jeder Buchstabe hat einen bestimmten Wert, den du aus der ASCII-Tabelle entnehmen kannst.


  • Mod

    sdfgfds schrieb:

    Buchstaben, also chars, können implizit nach int konvertiert werden. Jeder Buchstabe hat einen bestimmten Wert, den du aus der ASCII-Tabelle entnehmen kannst.

    Nein, das Problem ist ein anderes:

    cin >> Geschwindigkeit;
    

    Hier wird versucht einen int einzulesen. Das kann klappen oder nicht, das wird hier nicht geprüft. Wenn es nicht klappt, dann ist Geschwindigkeit aber immer noch irgendein int mit irgendeinem Wert. Da die ersten drei if-Bedingungen die Fälle Gleichheit, kleiner und größer abdecken*, muss ja irgendetwas davon eintreffen. Daher kommt der letzte else-Fall niemals dran.
    Richtig wäre, den Erfolg der Eingabe zu prüfen, zum Beispiel:

    if (cin >> Geschwindigkeit)
    {
      // .. restlicher Code
    }
    else
    {
      cout << "Ungueltige Eingabe";
    }
    

    An den Threadersteller: In Zukunft bitte Codetags benutzen (unter dem Editorfenster, bei den Smileys) und nur ein Thema pro Frage erstellen.

    *: Unnötigerweise sogar kleiergleich und größergleich, was gar nicht mehr sein kann.



  • Wenn du einen Buchstaben eingibst, wird

    cin >> Geschwindigkeit;
    

    fehlschlagen (und einen Fehlerzustand in cin setzen; darauf kommen wir gleich zurück). Die Variable Geschwindigkeit bleibt dabei unverändert (hat also nachher immer noch den Wert 0).

    Den Fehlercode in cin kannst du abfragen; das sieht dann so aus:

    cin >> Geschwindigkeit;
    
    if(!cin) {
      cout << "Ungueltige Eingabe";
    } else if (Geschwindigkeit == tempolimit) {
      cout << "Nochmal Glueck gehabt, Junge..";
    } else if (Geschwindigkeit <= tempolimit) {
      cout << "Du bist " << tempolimit - Geschwindigkeit<< " km/h unter dem Tempolimit gefahren. Beruhig dich Junge.." << endl;
    } else if (Geschwindigkeit >= tempolimit) {
      cout << "Du bist " << Geschwindigkeit - tempolimit<< " km/h zu schnell gefahren. Das gibt maechtig Probleme, Junge..";
    }
    


  • Danke fuer die Antworten.
    Gibt es einen befehl fuer buchstaben und zahlen generell? Nach dem motto if (zifferneingabe..) if a-z geht schonmal nicht .. :p



  • SeppJ schrieb:

    Wenn es nicht klappt, dann ist Geschwindigkeit aber immer noch irgendein int mit irgendeinem Wert.

    Wenn ich mich recht entsinne, garantiert der Standard doch, dass der Wert der Variablen bei einem Fehler unverändert bleibt. Dann hat Geschwindigkeit also nicht irgendeinen Wert, sondern 0.



  • out schrieb:

    SeppJ schrieb:

    Wenn es nicht klappt, dann ist Geschwindigkeit aber immer noch irgendein int mit irgendeinem Wert.

    Wenn ich mich recht entsinne, garantiert der Standard doch, dass der Wert der Variablen bei einem Fehler unverändert bleibt. Dann hat Geschwindigkeit also nicht irgendeinen Wert, sondern 0.

    Ja, seit C++11 schon. Vorher war der Wert beliebig.

    §22.4.2.1.2/3 schrieb:

    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 represents a value too large negative to be represented in val. ios_base::failbit is assigned to err.
    — the converted value, otherwise.
    The resultant numeric value is stored in val.

    Das finde ich ganz nett.

    Gibt es einen befehl fuer buchstaben und zahlen generell?

    get extrahiert ein einzelnes Zeichen aus dem Stream.



  • kamelkacke schrieb:

    Danke fuer die Antworten.
    Gibt es einen befehl fuer buchstaben und zahlen generell? Nach dem motto if (zifferneingabe..) if a-z geht schonmal nicht .. :p

    Du kannst prüfen ob ein Zeichen eine Zahl oder ein Buchstabe oder ... ist. Dafür gibst isalpha, isalnum, isdigit,...



  • Sone schrieb:

    out schrieb:

    SeppJ schrieb:

    Wenn es nicht klappt, dann ist Geschwindigkeit aber immer noch irgendein int mit irgendeinem Wert.

    Wenn ich mich recht entsinne, garantiert der Standard doch, dass der Wert der Variablen bei einem Fehler unverändert bleibt. Dann hat Geschwindigkeit also nicht irgendeinen Wert, sondern 0.

    Ja, seit C++11 schon. Vorher war der Wert beliebig.

    §22.4.2.1.2/3 schrieb:

    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 represents a value too large negative to be represented in val. ios_base::failbit is assigned to err.
    — the converted value, otherwise.
    The resultant numeric value is stored in val.

    Das finde ich ganz nett.

    Wo liest du da raus dass der Wert unverändert bleiben soll? Da steht explizit zero.



  • Wo liest du da raus dass der Wert unverändert bleiben soll? Da steht explizit zero.

    Verdammt, da habe ich outs Post nicht richtig gelesen. Ich habe eigentlich nur bejahen wollen, dass (seit C++11) der Wert 0 ist, falls nichts extrahiert werden konnte. 😣


Anmelden zum Antworten