Thema: [Java] Ticketautomat
-
07. 03. 2009, 00:37 #1Mitglied
- Registriert seit
- Jan 2009
- Beiträge
- 243
[Java] Ticketautomat
Hi,
Ich habe einen kleinen Ticketautomaten in Java geschrieben, das wichtigste des Programms ist, dass das Wechselgeld klug zurückgegeben wird. (Also nicht z.B. 1€ in ein Cent Stücken zurückgeben)
1) Kann man die Schreibweise mit den ganzen while's vielleicht noch irgendwie vereinfachen?Code:package klasse; import java.io.*; public class Kartenautomat { public static void main(String[] args) throws IOException { double tag = 3.99; double woche = 22.50; double monat = 70.00; double jahr = 199.00; double ticket = 0, preis_eingabe, rueckgabe; char c; int ticket_eingabe; String s, w; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Die Ticketpreise sind: "); System.out.println("Tagesticket: " + tag); System.out.println("Wochenticket: " + woche); System.out.println("Monatsticket: " + monat); System.out.println("Jahresticket: " + jahr); System.out.println("Wählen sie ein Tagesticket(1), ein Wochenticket(2), ein Monatsticket(3) oder ein Jahresticket(4)"); ticket_eingabe = Integer.parseInt(br.readLine()); switch(ticket_eingabe) { case 1: ticket = tag; break; case 2: ticket = woche; break; case 3: ticket = monat; break; case 4: ticket = jahr; break; default: System.out.println("Ungültige Eingabe"); return; } System.out.println("Werfen sie das Geld ein: "); preis_eingabe = Double.parseDouble(br.readLine()); rueckgabe = preis_eingabe - ticket; System.out.println("Die Rückgabe: "); while(rueckgabe >= 100) { System.out.println("100€"); rueckgabe = rueckgabe - 100; } while (rueckgabe >= 50) { System.out.println("50€"); rueckgabe = rueckgabe - 50; } while (rueckgabe >= 20) { System.out.println("20€"); rueckgabe = rueckgabe - 20; } while (rueckgabe >= 10) { System.out.println("10€"); rueckgabe = rueckgabe - 10; } while (rueckgabe >= 5) { System.out.println("5€"); rueckgabe = rueckgabe - 5; } while (rueckgabe >= 2) { System.out.println("2€"); rueckgabe = rueckgabe - 2; } while (rueckgabe >= 1) { System.out.println("1€"); rueckgabe = rueckgabe - 1; } while (rueckgabe >= 0.50) { System.out.println("0.50€"); rueckgabe = rueckgabe - 0.50; } while (rueckgabe >= 0.20) { System.out.println("0.20€"); rueckgabe = rueckgabe - 0.20; } while (rueckgabe >= 0.10) { System.out.println("0.10€"); rueckgabe = rueckgabe - 0.10; } while (rueckgabe >= 0.05) { System.out.println("0.05€"); rueckgabe = rueckgabe - 0.05; } while (rueckgabe >= 0.02) { System.out.println("0.02€"); rueckgabe = rueckgabe - 0.02; } while (rueckgabe >= 0.01) { System.out.println("0.01€"); rueckgabe = rueckgabe - 0.01; } System.out.println("gesamt: " + (preis_eingabe - ticket)); } }
2) Insgesamt läuft das Programm schon ganz gut, allerdings hat er noch Probleme beim Ausgeben eines Cents
-
07. 03. 2009, 01:31 #2Mitglied
- Registriert seit
- Jan 2009
- Beiträge
- 28
Re: [Java] Ticketautomat
ich kann zwar kein Java aber du könntest den Restbetrag durch die entsprechende Geldeinheit teilen und das Ergebnis auf die nächste Ganzzahl abrunden.
bsp.:
Restbetrag = 356,89
du willst wissen wie viele hunderter du rausgeben muss:
jetzt die fünziger:Code:ABRUNDEN( 356,89 / 100 ) = 3 Restbetrag: 356,89 - 3 * 100 = 56,89
usw.Code:ABRUNDEN (56,89 / 50) = 1 Restbetrag: 56,89 - 1 * 50 = 6,89
das machst du jetzt bis zum 1cent stück.
-
07. 03. 2009, 02:09 #3
Re: [Java] Ticketautomat
1. und wie man das vereinfachen kann, finde raus was der Modulo Operator macht , sieht so aus "%"
-
07. 03. 2009, 11:26 #4Mitglied
(Threadstarter)
- Registriert seit
- Jan 2009
- Beiträge
- 243
Re: [Java] Ticketautomat
Ich hätte noch eine Frage für einen Taschenrechner(wollte nicht extra einen neuen Thread aufmachen)
Wie kann ich einen String, der nur aus einem Zeichen besteht (z.B. + oder -) in einen Char umwandeln, damit ich diesen in einem Switch-Case anwenden kann?
-
07. 03. 2009, 11:35 #5
-
07. 03. 2009, 11:40 #6Mitglied
(Threadstarter)
- Registriert seit
- Jan 2009
- Beiträge
- 243
Re: [Java] Ticketautomat
Mhm und wie müsste ich deinen Code hier verwenden:
Zitat von SoulSpirit
Code:package javaapplication1; import java.io.*; public class Main { public static void main(String[] args) throws IOException { int z1, z2, erg = 0; String s; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Gib eine Zahl ein: "); z1 = Integer.parseInt(br.readLine()); System.out.println("Gib einen Operator ein: "); s = br.readLine(); s.charAt(0); System.out.println("Gib die zweite Zahl ein: "); z2 = Integer.parseInt(br.readLine()); switch(s) { case '+': erg = z1 + z2; break; case '-': erg = z1 - z2; break; case '*': erg = z1 * z2; break; case '/': erg = z1 / z2; break; default: System.out.println("Ungültige Eingabe"); } } }
-
07. 03. 2009, 12:36 #7Mitglied
- Registriert seit
- May 2003
- Ort
- Zuhause
- Beiträge
- 511
Re: [Java] Ticketautomat
was hältsn davon?
Code://code char c = (char)br.read(); // am besten noch sowas einbauen if(c!='\n' && c!='\r' && c!='\t') //code
-
07. 03. 2009, 13:02 #8Mitglied
(Threadstarter)
- Registriert seit
- Jan 2009
- Beiträge
- 243
Re: [Java] Ticketautomat
Jau das scheint schonmal zu klappen.
Zitat von spooky2k
Ich habe jetzt einmal das Programm durchlaufen lassen, aber es kommt noch ein Fehler vor der Eingabe der 2. Zahl, obwohl im Quelltext kein Fehler mehr angezeigt wird!? Könntet ihr das vielleicht nochmal überprüfen:
PHP-Code:package javaapplication1;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
int z1, z2, erg = 0;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Gib eine Zahl ein: ");
z1 = Integer.parseInt(br.readLine());
System.out.println("Gib einen Operator ein: ");
char c = (char)br.read();
System.out.println("Gib die zweite Zahl ein: ");
z2 = Integer.parseInt(br.readLine());
switch(c) {
case '+': erg = z1 + z2;
break;
case '-': erg = z1 - z2;
break;
case '*': erg = z1 * z2;
break;
case '/': erg = z1 / z2;
break;
default: System.out.println("Ungültige Eingabe");
}
}
}
-
07. 03. 2009, 15:51 #9Gotteskrieger
- Registriert seit
- Aug 2007
- Ort
- /dev/null
- Beiträge
- 53
Re: [Java] Ticketautomat
Welcher Fehler kommt denn?
-
07. 03. 2009, 20:34 #10Mitglied
- Registriert seit
- May 2003
- Ort
- Zuhause
- Beiträge
- 511
Re: [Java] Ticketautomat
Er haut eine NumberformatException raus
Zitat von _terrorfee
Wenn du nen zweites NumberFormat Objekt erstellst gehtsCode:java.lang.NumberFormatException: For input string: ""
z2 = Integer.parseInt(br2.readLine());
Aber warum er die Exception schmeisst kann ich dir auch nicht sagen...in br liegt schon was drinnen?!
-
07. 03. 2009, 20:46 #113xc3pt10nGast
Re: [Java] Ticketautomat
Aber nur bei mutwillig falscher Eingabe.Er haut eine NumberformatException raus!
Also das Programm funktioniert, soweit ich das sehe.
-
07. 03. 2009, 20:57 #12Mitglied
- Registriert seit
- May 2003
- Ort
- Zuhause
- Beiträge
- 511
Re: [Java] Ticketautomat
nein nicht bei mutwilliger. (edit: also schon bei mutwilliger, aber führ das teil mal aus )
Zitat von 3xc3pt10n
Führ das Programm doch mal aus....du kannst z2 gar keinen Wert zuweisen. soweit kommst du nichtGeändert von spooky2k (07. 03. 2009 um 21:03 Uhr)
-
07. 03. 2009, 21:03 #133xc3pt10nGast
-
07. 03. 2009, 21:21 #14Mitglied
- Registriert seit
- May 2003
- Ort
- Zuhause
- Beiträge
- 511
Re: [Java] Ticketautomat
guggst du
Zitat von 3xc3pt10n
da
edit: sorry, zu spät das edit gesehen ^^
edit nochmal: gute frage...wäre echt mal interessant zu wissen weswegen bluej, eclipse und co den fehler ausspucken. scite aber nicht ^^Geändert von spooky2k (07. 03. 2009 um 21:38 Uhr)
-
07. 03. 2009, 22:56 #15DesChaosWunderlicherSohn
- Registriert seit
- Sep 2005
- Beiträge
- 165
Re: [Java] Ticketautomat
Die Exception wir hier geworfen:
Das liegt daran, dass du mit "br.read()" nur ein Zeichen der Ausgabe ausliest, der Rest der Eingabe aber zwischengespeichert wird. Bei der nächsten abfrage mit "br.readLine()" wird die Eingabe bis zum \n abgefragt. Da aber noch das gespeicherte \n von der letzten Ausgabe vorhanden ist, macht er sofort weiter.Code:z2 = Integer.parseInt(br.readLine());
z.B.:
Das kannst du zum Beispiel so Umgehen:Code:Du gibst 1 ein und bestätigst mit Return. => br fragt den Eingabe Puffer bis zum \n ab. Erhält keine Rückmeldung und wartet auf das \n. => Die Eingabe wird bis zum \n (Return) gelesen und in einen int geparsed. => z1 wird auf den Wert 1 gesetzt. Du gibst + ein und bestätigst mit Return. => Das erste Zeichen der Eingabe wird ausgelesen und der Rest verbleibt im Eingabe Puffer. => c wird auf '+' gesetzt. => br fragt den Eingabe Puffer bis zum \n ab. Erhält eine Rückmeldung und gib "\n" zurück. => Integer.parseInt("\n"); => NumberformatException
Das das bei scite nicht passiert, kann daran liegen, das er noch eine Abfrage nach dem "char c = (char)br.read();" einfügt, die das \n Filtert.Code:import java.io.*; public class Main { public static void main(String[] args) throws IOException { int z1, z2, erg = 0; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Gib eine Zahl ein: "); z1 = Integer.parseInt(br.readLine()); System.out.println("Gib einen Operator ein: "); char c = (char)br.read(); br.readLine(); // Ließt den Rest der Zeile aus. System.out.println("Gib die zweite Zahl ein: "); z2 = Integer.parseInt(br.readLine()); switch(c) { case '+': erg = z1 + z2; break; case '-': erg = z1 - z2; break; case '*': erg = z1 * z2; break; case '/': erg = z1 / z2; break; default: System.out.println("Ungültige Eingabe"); } System.out.println("Ergbniss: "+erg ); } }
mfg.
night
EDIT:
Das wäre allerdings meiner Meinung nach Eleganter:
Code:char c = br.readLine().charAt(0);
Geändert von the_Night22 (07. 03. 2009 um 23:21 Uhr)
-
24. 12. 2011, 11:16 #16Mitglied
- Registriert seit
- Dec 2010
- Beiträge
- 1
Re: [Java] Ticketautomat
@AntiHoppa, ich weiß etwas spät, nach ca.2 Jahren. Mal aus reiner Neugier, hast du dein Programm fertig gekriegt?
-


Zitieren

mehr lesen...







"Wir können nichts dazu" -...
Gestern, 21:23 in gulli:news