Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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?

Geschrieben

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.

Geschrieben
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.

Geschrieben

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]


}

Geschrieben

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..

Geschrieben
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?
Geschrieben

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");

}

Geschrieben
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).

Geschrieben

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

Geschrieben

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]

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...