Schleife bei falscher eingabe



  • Hallo @ll,

    Hab mich mal bei euch angemeldet, Ihr habt viele schöne Tipps bei euch im Forum 🙂

    Ich habe eine Frage, weil ich in mein Buch nicht wirklich was dazu finde.
    Ich habe mir mal aus langerweile eine Anwendung geschrieben.

    Mein Problem ist folgendes :

    Ich frage nach einen Betrag, man kann ja nur einen "." und kein "," verwenden.
    Wenn jetzt der Benutzer aber 5,50 und nicht 5.50 schreibt komm ich in eine Endlos Schleife..

    Aber Warum ?

    Vielleicht hat einer von euch ein Tipp für mich.
    Hier ist mal mein Code.

    LG und Danke schonmal.

    #include <cstdlib>
    #include <iostream>
    #include <conio.h>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        int kippen;
        double betrag;
        int monate;
        int tage;
        char name[10];
        int art;
        int anzahl;
        int schachtel;
        int schachtel2;
        int pack;
        int mota=30;
        int mota2;
        double preis;
        double preis2;
    
        cout<<"Na dann lass uns mal Rechnen was dein Zigaretten so kosten"<<endl<<endl<<endl;
        cout<<"Hallo ....... Mhh Ja ... Wer bist du denn eigentlich ?"<<endl<<endl;
        cin>>name;
        system("cls");
        cout<<endl<<"Ja "<<name<<" dann wollen wir uns mal ausrechnen was du verrauchst"<<endl<<endl;
        do
        {
        cout<<endl<<"Was kostet dich denn eine Schachtel Zigaretten ?"<<endl<<endl;
        cin>>betrag;
        cout<<endl<<"Und wie viele Zigaretten rauchst Du am Tag ?"<<endl<<endl;
        cin>>kippen;
        cout<<endl<<"Wie viele Zigaretten hast du in einer Schachtel"<<endl<<endl;
        cin>>schachtel;
        system("cls");
        cout<<endl<<"Willst du Tage oder Monate berechnen"<<endl<<endl;
        cout<<"Bei Tagen Druecke die 1 und bei Monaten Druecke die 2"<<endl<<endl<<endl;
        cin>>art;
        system("cls");
        if (art==1)
        {
        cout<<endl<<"Fuer wie viele Tage willst du berechnen ?"<<endl<<endl;
        cin>>tage;
        anzahl=kippen*tage;
        schachtel2=anzahl/schachtel;
        preis=schachtel2*betrag;
        system("cls");
        cout<<endl<<endl<<"DU RAUCHST IN "<<tage<<" TAGEN "<<anzahl<<" ZIGARETTEN"<<endl;
        cout<<endl<<"Das sind "<<schachtel2<<" Schachtel(n) !"<<endl<<endl;
        cout<<endl<<"Diese "<<schachtel2<<" Schachtel(n) kosten dich "<<preis<<" Euro"<<endl;
        }
        else
        if (art==2)
        {
        cout<<endl<<"Fuer wie viele Monate willst du berechnen ?"<<endl;
        cout<<"Ich rechne den Monat mit 30 Tagen"<<endl<<endl;
        cin>>monate;
        mota2=monate*mota;
        anzahl=kippen*mota2;
        schachtel2=anzahl/schachtel;
        preis=schachtel2*betrag;
        system("cls");
        cout<<endl<<endl<<"DU RAUCHST IN "<<monate<<" Monaten "<<anzahl<<" ZIGARETTEN"<<endl;
        cout<<endl<<"Das sind "<<schachtel2<<" Schachtel(n) !"<<endl<<endl;
        cout<<endl<<"Diese "<<schachtel2<<" Schachtel(n) kosten dich "<<preis<<" Euro"<<endl<<endl<<endl;
        preis2=schachtel2*preis/monate;
        cout<<endl<<"Das sind pro Monat "<<preis2<<" Euro die du verrauchst"<<endl;
        }
        else 
        {
        cout<<"Du Witzbolt! Du kannst nur zwischen 1 = Tage und 2 = Monate waehlen"<<endl<<endl;
        cout<<"Oder Ich habe dich eben gefragt was eine Schachtel kostet"<<endl;
        cout<<"Dann benutze einen Punkt KEIN KOMMA !"<<endl; 
        cout<<"Beispiel: 4.60 und NICHT 4,60"<<endl<<endl;
        cout<<endl<<endl<<"Also fangen wir nochmal an"<<endl<<endl;
        }
        }
        while (art<1||art>2);
        cout<<endl<<endl<<endl<<"Wer hat es geschrieben ? Druecke irgend eine Taste"<<endl;
        getch();
        system("iche.jpg");
        getch();
        return EXIT_SUCCESS;
        }
    

  • Mod

    Wenn eine Eingabe fehlsschlägt, dann wird der Eingabestream in einen Fehlerzustand versetzt. Dann schlagen alle weiteren Eingaben fehl, bis man sich darum gekümmert hat. Mit clear kann man den Fehlerstatus aufheben. Die Daten die zum Fehlschlagen der Eingabe geführt haben sind dann aber immer noch im Stream, es bietet sich an, diese zu überspringen (z.B. mit ignore).

    P.S.: Du liest nicht zufällig "C++ von A bis Z" als Lehrbuch? Hör lieber auf damit.



  • Hallo Danke für die schnelle Antwort.
    Ich werd mal versuchen ob ich es schaffe mit den funktionen.

    Wenn der Benutzer in Zeile 32 ein Komma schreibt, soll es die ausgabe Zeile 73 - 75 bring. und wieder die Abfrage starten

    Nein ich habe 2 Bücher
    "c++ Objektorientiertes Programmieren von Anfang an" Helmut Erlenkötter
    "c Programmieren von Anfang an" Helmut Erlenkötter

    lg



  • Vielleicht schreibt JW inzwischen unter einem Pseudonym?

    Aber so schlimm sieht der Quelltext doch garnicht aus, bis auf die char Arrays sieht das syntaktisch schon mal wie C++ aus.


  • Mod

    DocShoe schrieb:

    Vielleicht schreibt JW inzwischen unter einem Pseudonym?

    Aber so schlimm sieht der Quelltext doch garnicht aus, bis auf die char Arrays sieht das syntaktisch schon mal wie C++ aus.

    Naja. Sehr viel system. getch. Alle Variablen am Anfang. Unnötiges return in der main mit C-Stil Makros. Hat mich jetzt ehrlich gesagt überrascht, dass dies nicht der Wolf war.



  • Der Wolf ?

    Mhh also ich bekomms nicht dazwischen.
    Kann man denn in einer While Anweisung irgendwie sagen wenn es kein punkt ist bei den Betrag dann spring zurück ?

    Ansonsten ist auch net so wild , soweit gehts ja erstmal.
    Das getch hab ich wegen eine Pause rein gesetzt.

    LG



  • Hab mir den Code jetzt nicht so genau durchgesehen (die fehlenden Einrückungen erschweren etwas den Überblick...), aber auf den ersten Blick würde ich vorschlagen:

    Wenn sowohl . als auch , als Eingabe möglich sein sollen, dann lese doch einfach einen String ein, ersetze ein mögliches Komma durch einen Punkt und wandle das Ganze dann in den Double um.

    Ach ja: Schau mal auf Deine Variable schachtel . Was passiert, wenn man 0 eingibt?



  • Hallo..

    Auch dir schonmal Danke..
    Stimmt wenn ich 0 eingebe bei "schachtel" dann bricht es ab wenn es zur rechnung kommt. Danke dir ! Ist mir noch nicht aufgefallen.

    Werd mich mal mit den String befassen. Hab sowas bis jetzt noch nicht gemacht.

    danke

    lg



  • Keine Ursache. Ist bei monate das gleiche...

    mehr reinschreibt, d.h. einen Buffer Overrun verursacht. Nicht sehr gesund.

    Daher solltest Du eher scanf benutzen (die C-Version), oder Du sattelst auf C++ um und verwendest die std::string -Klasse. Die gehen auch mit cin. Im Moment ist es ein Gemisch...

    Ach ja: Deine do..while-Schleife soll doch wiederholen, wenn art falsch ist, richtig? Schau Dir mal an, was da evtl. noch mit wiederholt wird; ist das Absicht?


Log in to reply