Ergebnis 1 bis 16 von 16
  1. #1
    Mitglied
    Registriert seit
    Jan 2009
    Beiträge
    243

    Standard [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)

    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));
    
        }
    }
    1) Kann man die Schreibweise mit den ganzen while's vielleicht noch irgendwie vereinfachen?

    2) Insgesamt läuft das Programm schon ganz gut, allerdings hat er noch Probleme beim Ausgeben eines Cents

  2. #2
    Mitglied
    Registriert seit
    Jan 2009
    Beiträge
    28

    Standard 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:

    Code:
    ABRUNDEN( 356,89 / 100 ) = 3
    Restbetrag: 356,89 - 3 * 100 = 56,89
    jetzt die fünziger:
    Code:
    ABRUNDEN (56,89 / 50) = 1
    Restbetrag: 56,89 - 1 * 50 = 6,89
    usw.

    das machst du jetzt bis zum 1cent stück.

  3. #3
    \o/ Avatar von sumisumi
    Registriert seit
    Jan 2008
    Beiträge
    4.038

    Standard Re: [Java] Ticketautomat

    1. und wie man das vereinfachen kann, finde raus was der Modulo Operator macht , sieht so aus "%"

  4. #4
    Mitglied

    (Threadstarter)


    Registriert seit
    Jan 2009
    Beiträge
    243

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

  5. #5
    Parasit Avatar von SoulSpirit
    Registriert seit
    Aug 2004
    Beiträge
    2.663

    Standard Re: [Java] Ticketautomat

    String.charAt(int)

  6. #6
    Mitglied

    (Threadstarter)


    Registriert seit
    Jan 2009
    Beiträge
    243

    Standard Re: [Java] Ticketautomat

    Zitat Zitat von SoulSpirit
    String.charAt(int)
    Mhm und wie müsste ich deinen Code hier verwenden:

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

  7. #7
    Mitglied
    Registriert seit
    May 2003
    Ort
    Zuhause
    Beiträge
    511

    Standard 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

  8. #8
    Mitglied

    (Threadstarter)


    Registriert seit
    Jan 2009
    Beiträge
    243

    Standard Re: [Java] Ticketautomat

    Zitat Zitat von spooky2k
    was hältsn davon?


    Code:
    //code
     char c = (char)br.read();
         // am besten noch sowas einbauen if(c!='\n' && c!='\r' && c!='\t')
    //code
    Jau das scheint schonmal zu klappen.

    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[] argsthrows IOException {

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

            }
        }



  9. #9
    Gotteskrieger
    Registriert seit
    Aug 2007
    Ort
    /dev/null
    Beiträge
    53

    Standard Re: [Java] Ticketautomat

    Welcher Fehler kommt denn?

  10. #10
    Mitglied
    Registriert seit
    May 2003
    Ort
    Zuhause
    Beiträge
    511

    Standard Re: [Java] Ticketautomat

    Zitat Zitat von _terrorfee
    Welcher Fehler kommt denn?
    Er haut eine NumberformatException raus

    Code:
    java.lang.NumberFormatException: For input string: ""
    Wenn du nen zweites NumberFormat Objekt erstellst gehts
    z2 = Integer.parseInt(br2.readLine());



    Aber warum er die Exception schmeisst kann ich dir auch nicht sagen...in br liegt schon was drinnen?!

  11. #11
    3xc3pt10n
    Gast

    Standard Re: [Java] Ticketautomat

    Er haut eine NumberformatException raus!
    Aber nur bei mutwillig falscher Eingabe.

    Also das Programm funktioniert, soweit ich das sehe.

  12. #12
    Mitglied
    Registriert seit
    May 2003
    Ort
    Zuhause
    Beiträge
    511

    Standard Re: [Java] Ticketautomat

    Zitat Zitat von 3xc3pt10n
    Aber nur bei mutwillig falscher Eingabe.

    Also das Programm funktioniert, soweit ich das sehe.
    nein nicht bei mutwilliger. (edit: also schon bei mutwilliger, aber führ das teil mal aus )

    Führ das Programm doch mal aus....du kannst z2 gar keinen Wert zuweisen. soweit kommst du nicht
    Geändert von spooky2k (07. 03. 2009 um 21:03 Uhr)

  13. #13
    3xc3pt10n
    Gast

    Standard Re: [Java] Ticketautomat

    Edit:
    ok sorry, wenn ich über die Konsole aufrufen, kommt auch der Fehler. Mit Scite kommt er nicht. Merkwürdig.

    Edit2:
    Geändert von 3xc3pt10n (07. 03. 2009 um 21:28 Uhr)

  14. #14
    Mitglied
    Registriert seit
    May 2003
    Ort
    Zuhause
    Beiträge
    511

    Standard Re: [Java] Ticketautomat

    Zitat Zitat von 3xc3pt10n
    Edit: ok sorry, wenn ich über die Konsole aufrufen, kommt auch der Fehler. Mit Scite kommt er nicht. Merkwürdig.
    guggst du
    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 ^^
    Angehängte Grafiken Angehängte Grafiken
    Geändert von spooky2k (07. 03. 2009 um 21:38 Uhr)

  15. #15
    DesChaosWunderlicherSohn
    Registriert seit
    Sep 2005
    Beiträge
    165

    Standard Re: [Java] Ticketautomat

    Die Exception wir hier geworfen:
    Code:
    z2 = Integer.parseInt(br.readLine());
    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.
    z.B.:
    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 kannst du zum Beispiel so Umgehen:
    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 );
        }
    
    }
    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.

    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)

  16. #16
    Mitglied
    Registriert seit
    Dec 2010
    Beiträge
    1

    Standard Re: [Java] Ticketautomat

    @AntiHoppa, ich weiß etwas spät, nach ca.2 Jahren. Mal aus reiner Neugier, hast du dein Programm fertig gekriegt?

  17.  
     
     

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •