blondi2108 Geschrieben 25. Mai 2008 Geschrieben 25. Mai 2008 Hi Guys, muss mal wieder für die Schule etwas programmieren und brauch Eure Hilfe!! Also, ich habe einen Fahrscheinautomaten programmiert, die Fehler bisher aber nur mit if-else Zweigen ausgegrenzt. Jetzt sollen wir das mit Try- Catch Blöcken machen und mir fehlt total der Durchblick wie ich das anstellen soll... Was ich bisher mit if Zweigen habe ist etwa dies: cout<<"\t****Bitte waehlen Sie die Altersklasse aus!*****"<<endl; cout<<"\n\t [E] Erwachsene ab 18 Jahre"<<endl; cout<<"\t [K] Kinder ab 6 Jahre"<<endl; cin>>eingabe; if ((eingabe=='e') || (eingabe=='E')) { cout<<"\t* Bitte waehlen Sie das gewuenschte Ticket aus! *"<<endl; cout<<"\t* [1] Einfache Fahrt 2 Euro *"<<endl; cout<<"\t* [2] Hin- und Rueckfahrt 4 Euro *"<<endl; cout<<"\t* [3] Gruppen- Ticket (5 Personen) 8 Euro *"<<endl; cin>>fahrt; if ((fahrt=='1') ||(fahrt=='2') || (fahrt=='3')){//B cout<<"\t Bitte waehlen Sie die Ticketanzahl aus!"<<endl; cout<<"\t Es sind maximal 5 Tickets einer Kategorie verfuegbar!"<<endl; cout<<"\t Abbruch mit beliebiger Taste!"<<endl; cin>>anzahl; anzahlKarten = anzahl - 48; //ASCII-Code if ((anzahlKarten == 1) ||(anzahlKarten == 2) || (anzahlKarten == 3)||(anzahlKarten == 4)||(anzahlKarten == 5)){//C switch (fahrt){ case '1': rest = 2.0 * anzahlKarten; break; usw... } //Ende switch/case cout<<"\t*Sie muessen "<< rest<<" Euro zahlen.*"<<endl; dann werden mit den else- Zweigen falsche Eingaben etc. abgefangen.. Kann mir jemand nen Tip geben, wie ich das mit Try und Catch machen soll? Zitieren
Panke Geschrieben 25. Mai 2008 Geschrieben 25. Mai 2008 oh man .. Also wenn du den Code sauber formatiert und vollständig hier hochlädst, dann schau ich mal drüber. Da ist nämlich noch Luft nach oben. Zitieren
Klotzkopp Geschrieben 26. Mai 2008 Geschrieben 26. Mai 2008 Ich hätte ja Code-Tags eingefügt, aber der Quelltext war von Anfang an nicht eingerückt. Jetzt sollen wir das mit Try- Catch Blöcken machen und mir fehlt total der Durchblick wie ich das anstellen soll...Da an dem Code zunächst einmal nichts dran ist, das eine Exception werfen könnte, damit du sie fangen kannst, musst du selbst werfen. Bau deinen ganzen Code in einen try-Block. Immer, wenn du einen Fehler feststellst, wirfst du eine Exception (throw). Am Ende behandelst du die Fehler im catch-Block. Zitieren
Panke Geschrieben 26. Mai 2008 Geschrieben 26. Mai 2008 Da an dem Code zunächst einmal nichts dran ist, das eine Exception werfen könnte, damit du sie fangen kannst, musst du selbst werfen Die Streamklassen werfen Ausnahmen, wenn man sie lässt. Zitieren
Klotzkopp Geschrieben 26. Mai 2008 Geschrieben 26. Mai 2008 Die Streamklassen werfen Ausnahmen, wenn man sie lässt.Ja, für die State Flags. Die werden aber vermutlich nicht so oft gesetzt werden, wenn man über cin einzelne chars einliest. Zitieren
TDM Geschrieben 26. Mai 2008 Geschrieben 26. Mai 2008 int readInCards() { [INDENT] cout<<"\t Bitte waehlen Sie die Ticketanzahl aus!"<<endl; cout<<"\t Es sind maximal 5 Tickets einer Kategorie verfuegbar!"<<endl; cout<<"\t Abbruch mit beliebiger Taste!"<<endl; cin>>anzahl; [COLOR="red"]//<-- ist das ein char?! O.o[/COLOR] anzahlKarten = anzahl - 48; //ASCII-Code if (anzahlKarten < 1 || anzahlKarten > 5) throw "Falsche Eingabe"; return anzahlKarten; [/INDENT] } Zitieren
blondi2108 Geschrieben 26. Mai 2008 Autor Geschrieben 26. Mai 2008 Paste #53990 | LodgeIt! habe den ganzen code aufgrund eines tips da hochgeladen! Zitieren
Klotzkopp Geschrieben 26. Mai 2008 Geschrieben 26. Mai 2008 habe den ganzen code aufgrund eines tips da hochgeladen! Und was sollen wir jetzt damit? Du musst schon konkrete Fragen stellen, wenn du konkrete Antworten willst. Zitieren
blondi2108 Geschrieben 26. Mai 2008 Autor Geschrieben 26. Mai 2008 habe ich doch... ich soll das prog jetzt mit try catch blöcken anstatt der if- anweisungen vor fehlern schützen.. wie mache ich dass...?? (der lehrer hat leider nur gesagt, dass man die fehler auch mit try catch blöcken abfangen kann...) brauche wahrscheinlich wieder nur nen besipiel um da durch zu steigen.. Zitieren
Klotzkopp Geschrieben 26. Mai 2008 Geschrieben 26. Mai 2008 wie mache ich dass...?? (der lehrer hat leider nur gesagt, dass man die fehler auch mit try catch blöcken abfangen kann...)Welche Fehler sollen das denn sein? Selbst wenn du alle deine Eingaben von char auf int umstellst, kannst du durch die automatischen Stream-Exceptions (die du, wie Panke bereits sagte, explizit einschalten musst) nur abfangen, wenn jemand statt einer Zahl ein anderes Zeichen eingibt. Für die Gültigkeitsprüfung des Wertes müsstest du selbst Exceptions werfen (throw). brauche wahrscheinlich wieder nur nen besipiel um da durch zu steigen..Willst du damit sagen, du hast kein Beispiel für try/throw/catch gefunden? Zitieren
blondi2108 Geschrieben 26. Mai 2008 Autor Geschrieben 26. Mai 2008 nein, das man die exceptions irgenwie auswirft habe ich auch hereausgefunden nur wie... meint ihr er meint nur das, dass die fehlerquelle der falscheingabe abgefangen werden soll... ich kenn das ganze nur aus java, wo die sachen z.b in eclipse schon vorgegeben sind, deshalb versteh ich das prinzip in c nicht.. bsp java. try{ zahl = Integer.parseInt(stdin.readLine()); } catch(IOException e){ System.out.println("Falsche Eingabe"); starteingabe(); } catch(NumberFormatException e){ System.out.println("Falsche Eingabe"); starteingabe(); } catch(Exception e){ System.out.println("Falsche Eingabe"); } Zitieren
TDM Geschrieben 26. Mai 2008 Geschrieben 26. Mai 2008 nein, das man die exceptions irgenwie auswirft habe ich auch hereausgefunden nur wie... meint ihr er meint nur das, dass die fehlerquelle der falscheingabe abgefangen werden soll... ich kenn das ganze nur aus java, wo die sachen z.b in eclipse schon vorgegeben sind, deshalb versteh ich das prinzip in c nicht.. Das kommt im Endeffekt aufs selbe raus. Und es ist nicht durch Eclipse, sonder durch das JDK vorgegeben, welche Funktionen etwas werfen. im Endeffekt kannst du selber Exceptions werfen, wenn z.B. Werte außerhalb des Gültigkeitsbereiches liegen (siehe Beispiel oben). Zitieren
blondi2108 Geschrieben 26. Mai 2008 Autor Geschrieben 26. Mai 2008 ok.. schau mir das ganze noch mal in ruhe an... Zitieren
TDM Geschrieben 26. Mai 2008 Geschrieben 26. Mai 2008 Hier ist das eigentlich ganz gut erklärt. Zitieren
Amstelchen Geschrieben 26. Mai 2008 Geschrieben 26. Mai 2008 wobei hier anzumerken ist, dass dein beispielhafter java-code ein miserables beispiel ist und das gegeteil von gutem programmierstil bewirkt; eine Exception *jeglicher* art mit "Falsche Eingabe" zu behandeln, macht keinen sinn - dann kannst du sie gleich weglassen. s'Amstel Zitieren
Panke Geschrieben 26. Mai 2008 Geschrieben 26. Mai 2008 So, erstmal allgemein zu deinem Code: #include <stdio.h> // #include <cstdio> #include <iostream.h> // #include <iostream> #include <conio.h> //kein Standardheader, falls möglich drauf verzichten #include <stdlib.h> // #include <cstdlib> [/PHP] Nach Standard nimmt man <iostream>, also ohne .h. Die Header aus der C Standardbibliothek werden mit vorangestelltem c genutzt. [PHP] double rest; int Abbruch = 0; //für boolesche Werte auch den Typ bool nutzen! double rueck = 0; int anzahlKarten; char fahrt; char anzahl; //hier einen integralen Zahltyp nutzen char eingabe; char auswahl; 1. Es ist generell besser Variablen dort zu definieren, wo sie verwendet werden. Aber hier weniger wichtig. 2. Nimm die Datentypen, die auch passen. Also für Zahlen Zahlen und für boolesche Werte bool. Bool erhöht die Lesbarkeit, das Nutzen von Zahlen ermöglicht dir von der automatischen Typprüfung zu profitieren. Benutze kein goto zur Ablaufsteuerung, wo Schleifen sinnvoller wären. Statt Marke: anweisung; anweisung; if(weiter) goto Marke; [/PHP] lieber [php] while(weiter) { anweisung; anweisung; } Du solltest auch darüber nachdenken, deinen Code in Funktionen aufzuteilen. Insbesondere die Teile die du zwei Mal in den Code geschrieben hast, wie die Nachfrage nach dem Tickettyp (Erwachsen/Kind), bietet sich da förmlich an. if ((anzahlKarten == 1) ||(anzahlKarten == 2) || (anzahlKarten == 3)||(anzahlKarten == 4)||(anzahlKarten == 5)) [/php] Mein Vorschlag: [php] if(anzahlKarten >= 1 and anzahlKarten <= 5) switch (auswahl){ case '1': rest = rest-0.50; rueck = rueck+0.50; break; case '2': rest = rest - 1.00; rueck = rueck+1.00; break; case '3': rest = rest - 2.00; rueck = rueck+2.00; break; case '4': rest = rest - 5.00; rueck = rueck+5.00; break; case '5': rest = rest - 10.00; rueck = rueck+10.00; break; case '6': rest = rest - 20.00; rueck = rueck+20.00; break; case '0': Abbruch=1; break; [/php] Sowas kann man auch so lösen: [php] double mengen = {0, 0.5, 1, 2, 5, 10, 20}; rest -= mengen[auswahl] rueck += mengen[auswahl] So, wegen den Exceptions: int main() { int value; cin.exceptions(istream::eofbit | istream::failbit | istream::badbit); while(true) { try { cin >> value; break; } catch (ios_base::failure e) { cout << "Fehler: " << e.what() << endl; cin.clear(); cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } } } [/php] Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.