Fehlersuche-kann mir jemand helfen?

Diskutiere Fehlersuche-kann mir jemand helfen? im Java Basics - Anfänger-Themen Bereich.
G

Garfild2015

Ich suche verzweifelt den Fehler, warum dieser Tickeautomat nicht die richtige
gesammtsumme ausgibt.
findet ihn jemand und kann ihn mir vielleicht verbessern?


Die Gesamtsumme sollte = Kinderticket+Erwachsnenetickets *Linie sein , aber das funktioniert nicht ganz :)



Code:
public class Ticketautomat
{
    // Instanzvariablen - ersetzen Sie das folgende Beispiel mit Ihren Variablen
    private int preis;
    private int bisherGezahlt;
    private int gesamtsumme;
    private int ticketpreis;
    public int kindertickets;
    public int erwachsenentickets;
    public int streckenpreis;
    public int neuerPreis;
 
    private String linie;
    private String name;
    public Ticketautomat()
    {
 
        preis = ticketpreis;
        preis=540;
        
        
        erwachsenentickets= 0;
        kindertickets = 0;
        bisherGezahlt = 0;
        gesamtsumme = 0;
        linie = "Gelsenkirchen";
 
        name = "Person";
    }
 
    public void KinderTickets(int neueKindertickets){
        kindertickets=neueKindertickets;
        preis= (neueKindertickets*preis)/2;
 
    }
 
    public void Erwachsenetickets(int neueErwachsenentickets){
        erwachsenentickets=neueErwachsenentickets;
        preis=preis;
    }
 
    public void linieÄndern(String neueLinie)
    {
        linie = neueLinie;
 
        if("München".equals(neueLinie)){
            preis=2550;
 
        }
        if("Hamburg".equals(neueLinie)){
            preis=1550;   
        }
        if("Düsseldorf".equals(neueLinie)){
            preis=750;   
        }
        if("Stutgart".equals(neueLinie)){
           preis=850;   
        }
        if("München".equals(neueLinie)){
            preis=1050;   
        }
        if("Berlin".equals(neueLinie)){
           preis=1280;   
        }
        
 
    }
 
    public void neuenPreisFestsetzen(int neuerPreis)
    {
        if(bisherGezahlt==0){
            preis=neuerPreis;
        }else{
            System.out.println("Der Preis kann während einer Tranaktion nicht geändert werden");
 
        }
    }
 
    public int gibPreis()
    {
        return preis;
    }
 
 
    
 
    public int gibBisherGezahltenBetrag()
    {
        return bisherGezahlt;
    }
 
    public void geldEinwerfen(int betrag)
    {
        if(betrag==10 || betrag ==20|| betrag==50|| betrag ==50|| betrag==100|| betrag==200||betrag==500||betrag==1000){
            bisherGezahlt= bisherGezahlt+betrag;
        } else{
            System.out.println("Der Betrag ist nicht zulässig. Bitte 10, 20 oder 50 Cent,1 Euro,2 Euro,5 Euro oder 10 Euro einwerfen");
        }
 
    }
 
    public void personaliesierung(String neuerName){
        name = neuerName ;
    }
 
    public void geldAuszahlen()
    {
        if (bisherGezahlt >0){
            System.out.println("Geldrückgabe:"+ bisherGezahlt);
            bisherGezahlt=0;
        }
    }
 
    public void ticketDrucken()
    {
        if(bisherGezahlt>=preis){
 
            System.out.println("######################################");
            System.out.println("#_______________Ticket_______________#");
            System.out.println("#Datum:07.03.2020 Uhrzeit: 13:00Uhr  #");
            System.out.println("Name:"+name);
            System.out.println("# Von:Gladbeck Nach:"+linie+ "                          #");
 
            System.out.println("#"+ preis/100 +","+ (preis %100)+"Euro");                         
            System.out.println("######################################");
            System.out.println();
 
            gesamtsumme= gesamtsumme + bisherGezahlt;
            bisherGezahlt= bisherGezahlt-preis;
 
            geldAuszahlen();
 
        }
 
        else if (bisherGezahlt<preis)  {
            int fehlt;
            fehlt= preis-bisherGezahlt;
            System.out.println("Es fehlt noch"+ fehlt+ "Cent!");
            System.out.println();
 
        }
 
    }
}
 
MoxxiManagarm

MoxxiManagarm

Dein Code ergibt für mich insgesamt keinen Sinn. Das liegt hauptsächlich daran, dass du 'preis' für alles Mögliche verwendest. Ist es der Preis für die Strecke? Ist es der zu zahlende Preis? Das kommt nicht klar raus und ich glaube du vermischst es hier auch.
 
MoxxiManagarm

MoxxiManagarm

Code:
public void linieÄndern(String neueLinie) {
    linie = neueLinie;

    if("München".equals(neueLinie)){
        preis=2550;

    }
    if("Hamburg".equals(neueLinie)){
        preis=1550;
    }
    if("Düsseldorf".equals(neueLinie)){
        preis=750;
    }
    if("Stutgart".equals(neueLinie)){
        preis=850;
    }
    if("München".equals(neueLinie)){
        preis=1050;
    }
    if("Berlin".equals(neueLinie)){
        preis=1280;
    }
}
Außer ganz ehrlich, alleine bei dieser Methode krümmen sich meine Zehennägel :D
Besser wäre ein switch-Case (oder ne Map oder sowas), weil du irgendwie auch einen default/Error Case benötigst. Was passiert, wenn die neueLinie von keinem if angesprochen wird? Du hast hier auch 2x München drin und Stuttgart fehlt ein t.
 
G

Garfild2015

Code:
public void linieÄndern(String neueLinie) {
    linie = neueLinie;

    if("München".equals(neueLinie)){
        preis=2550;

    }
    if("Hamburg".equals(neueLinie)){
        preis=1550;
    }
    if("Düsseldorf".equals(neueLinie)){
        preis=750;
    }
    if("Stutgart".equals(neueLinie)){
        preis=850;
    }
    if("München".equals(neueLinie)){
        preis=1050;
    }
    if("Berlin".equals(neueLinie)){
        preis=1280;
    }
}
Außer ganz ehrlich, alleine bei dieser Methode krümmen sich meine Zehennägel :D
Besser wäre ein switch-Case (oder ne Map oder sowas), weil du irgendwie auch einen default/Error Case benötigst. Was passiert, wenn die neueLinie von keinem if angesprochen wird? Du hast hier auch 2x München drin und Stuttgart fehlt ein t.
Wir haben gerade erst angefangen mit dem programmieren, bis uns Corona unterbrochen hat :)
Das haben wir noch mit unsere Lehrerin gemacht.
 
L

LimDul

Der Code ist wie schon erwähnt was Preis Handling angeht komplett unbrauchbar.

Fragen, die du mal beantworten solltest:
* Wo wird der Gesamtpreis gespeichert?
* Wo wird der Preis für das gewählte Ziel gespeichert?
* Wo der Preis für ein Kinderticket gespeichert?
* Wo wird der Preis für ein Erwachsenenticket gespeichert?
* Wo wird die Anzahl der Erwachsenentickets gespichert?
* Wo wird die Anzahl der Kindertickets gespeichert?

Bei dir wird 1 bis 4 gleichzeitig wie es aussieht in "Preis" gespeichert - dass kann nicht funktionieren.
 
MoxxiManagarm

MoxxiManagarm

1588930327819.png

Eine gute IDE zeigt übrigens auch, welche Parameter gar nicht verwendet werden. Diese sind hier grau. Spätestens wenn man sowas sieht ist irgendwas verkehrt meistens :) Und auf Grund des Geheimhaltungsprinzips sollten letzte 4 Attribute auch bitte nicht public sein.
 
G

Garfild2015

Der Code ist wie schon erwähnt was Preis Handling angeht komplett unbrauchbar.

Fragen, die du mal beantworten solltest:
* Wo wird der Gesamtpreis gespeichert?
* Wo wird der Preis für das gewählte Ziel gespeichert?
* Wo der Preis für ein Kinderticket gespeichert?
* Wo wird der Preis für ein Erwachsenenticket gespeichert?
* Wo wird die Anzahl der Erwachsenentickets gespichert?
* Wo wird die Anzahl der Kindertickets gespeichert?

Bei dir wird 1 bis 4 gleichzeitig wie es aussieht in "Preis" gespeichert - dass kann nicht funktionieren.

Könne sie mir sagen, was ich dann ändern soll ?
 
MoxxiManagarm

MoxxiManagarm

Könne sie mir sagen, was ich dann ändern soll ?
Eigentlich brauchst du nur 3 Attribute statt 8 (zumindest aus meiner Sicht)

- Preis für die ausgewählte Strecke: wird gesetzt bei Streckenauswahl
- Zu zahlender Preis: Wird bei Kind um n*Streckenpreis/2 und bei Erwachsenen um n*Streckenpreis erhöht
- Gezahlter Preis: Wird bei Münzeinwurf erhöht

Du hast eine überschaubare Anzahl an Events, welche du als Methoden darstellen kannst:
- Strecke auswählen
- Kindticket hinzufügen (ggf. auch entfernen)
- Erwachsenenticket hinzufügen (ggf. auch entfernen)
- Münze einwerfen
- Ticket Drucken
- Geldrückgabe
- (ggf. Abbrechen)
- ...

Also Statement: Reduziere deinen Code auf das nötigste.
 
J

JustNobody

Variablen sauber definieren und entsprechend nutzen!

Spiel doch einfach einmal durch, wie sich preis verändert, wenn ich Kindertickets bestelle:
- Ich will 10.
- Ach nein, ich will 20!
- Ach nein - doch nur 1!

==> Was ist dann der Preis?

Nutz klare Begriffe:
- linienPreis für den Preis eines Erwachsenentickets für die Linie würde ich zuerst einführen bzw. preis umbenennen.
- Dann schaust Du Dir den Code an. Beim setzen der Anzahl der Kindertickets ist der Linienpreis natürlich nicht anzupacken. Und: Wenn ich einen Aufruf setzeKinderTickets (Nur "KinderTickets" besagt nichts. Methoden bitte immer mit Verb, damit sie aussagen, was sie machen) sehe, dann erwarte ich, dass diese Methode nur die KinderTickets setzt. Aber nicht irgend einen Preis!
- Den Gesamtpreis brauchst Du dann nicht wirklich, denn den kannst Du immer berechnen: anzahlErwachsenentickets * linienPreis + anzahlKinderTickets * linienPreis / 2. (Hier kannst Du auch erkennen: kinderTickets ist kein guter Name - da steht ja eine Anzahl drin und keine Tickets!)
 
G

Garfild2015

Eigentlich brauchst du nur 3 Attribute statt 8 (zumindest aus meiner Sicht)

- Preis für die ausgewählte Strecke: wird gesetzt bei Streckenauswahl
- Zu zahlender Preis: Wird bei Kind um n*Streckenpreis/2 und bei Erwachsenen um n*Streckenpreis erhöht
- Gezahlter Preis: Wird bei Münzeinwurf erhöht

Du hast eine überschaubare Anzahl an Events, welche du als Methoden darstellen kannst:
- Strecke auswählen
- Kindticket hinzufügen (ggf. auch entfernen)
- Erwachsenenticket hinzufügen (ggf. auch entfernen)
- Münze einwerfen
- Ticket Drucken
- Geldrückgabe
- (ggf. Abbrechen)
- ...

Also Statement: Reduziere deinen Code auf das nötigste.
Code:
Ich fange mal vorne an. Was halten sie von dieser Methode für den Streckenpreis?


public class Ticketautomat{
    int streckenpreis;
    String  linie;
    public void Streckenauswahl(String neueLinie)
    {
        linie = neueLinie;

        if("München".equals(neueLinie)){
            streckenpreis=2550;

        }
        if("Hamburg".equals(neueLinie)){
            streckenpreis=1550;   
        }
        if("Düsseldorf".equals(neueLinie)){
            streckenpreis=750;   
        }
        if("Stutgart".equals(neueLinie)){
            streckenpreis=850;   
        }
        if("München".equals(neueLinie)){
            streckenpreis=1050;   
        }
        if("Berlin".equals(neueLinie)){
            streckenpreis=1280;   
        }

    }
}
 
J

JustNobody

Da du ja etwas lernen sollst, zeige ich Dir einfach einmal das switch auf Strings:
Code:
public class Ticketautomat{
    int streckenpreis;
    String  linie;
    public void Streckenauswahl(String neueLinie)
    {
        switch (neueLinie) {
            case "München":
                streckenpreis=2250;
                break;
                
            case "Hamburg":
                streckenpreis=1550;
                break;

            case "Düsseldorf":
                streckenpreis=750;
                break;

            case "Stuttgart":
                streckenpreis=850;
                break;

            case "Berlin":
                streckenpreis=1250;
                break;
                
            default:
                // Hier noch eine Fehlermeldung ausgeben!
                return; // return statt break um die Methode zu verlassen.
        }
        
        linie = neueLinie;
    }
}
 
G

Garfild2015

Da du ja etwas lernen sollst, zeige ich Dir einfach einmal das switch auf Strings:
Code:
public class Ticketautomat{
    int streckenpreis;
    String  linie;
    public void Streckenauswahl(String neueLinie)
    {
        switch (neueLinie) {
            case "München":
                streckenpreis=2250;
                break;
               
            case "Hamburg":
                streckenpreis=1550;
                break;

            case "Düsseldorf":
                streckenpreis=750;
                break;

            case "Stuttgart":
                streckenpreis=850;
                break;

            case "Berlin":
                streckenpreis=1250;
                break;
               
            default:
                // Hier noch eine Fehlermeldung ausgeben!
                return; // return statt break um die Methode zu verlassen.
        }
       
        linie = neueLinie;
    }
}
Fehlermeldung im Sinne von "Diese Strecke ist nicht vorhanden "?
Sollte man da nicht lieber einen "Standardpreis" eingeben, damit immer ein Preis vorhanden ist ?
 
MoxxiManagarm

MoxxiManagarm

Also wenn ich nach Equestria fahren möchte darf ich das für low? Cool ^^
 
G

Garfild2015

Wenn man das so macht wie sie es Vorgeschlagen haben, kann man dann irgendwie eine Liste aufrufen lassen um die verfügbaren Ziele zu zeigen ?
 
MoxxiManagarm

MoxxiManagarm

Wenn du das machen willst wäre ein Enum vielleicht nicht schlecht, oder eine Map. Ich bastel dir mal ein Beispiel... stay tuned
 
MoxxiManagarm

MoxxiManagarm

Java:
public class Reise {
    enum Reiseziel {
        München(2250),
        Hamburg(1550),
        Düsseldorf(750),
        Stuttgart(850),
        Berlin(1250);

        private int streckenpreis;

        private Reiseziel(int streckenpreis) {
            this.streckenpreis = streckenpreis;
        }
    }

    
  public static void main(String[] args) {
    System.out.println("Bitte wähle eine Strecke");

    for (int i = 0; i < Reiseziel.values().length; i++) {
        Reiseziel moeglichesReiseziel = Reiseziel.values()[i];
        System.out.println(i + ": " + moeglichesReiseziel.name());
    }
    try {
        int auswahl = new Scanner(System.in).nextInt();
        Reiseziel gewaehltesReiseziel = Reiseziel.values()[auswahl];
        System.out.println("Streckenpreis von " + gewaehltesReiseziel.streckenpreis + " für das Reiseziel " + gewaehltesReiseziel.name());
    } catch (ArrayIndexOutOfBoundsException | InputMismatchException e) {
        System.out.println("Ungültige Auswahl.");
    }
}
}
Ausgabe:
Code:
Bitte wähle eine Strecke
0: München
1: Hamburg
2: Düsseldorf
3: Stuttgart
4: Berlin
0
Streckenpreis von 2250 für das Reiseziel München


Du kannst die Enum dann beliebig erweitern ohne den Rest anfassen zu müssen. Also jedes weitere mögliche Reiseziel ist nur eine Zeile Code
 
Thema: 

Fehlersuche-kann mir jemand helfen?

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben