Ticketautomat strukturierter hinbekommen

Garfild2015

Aktives Mitglied
Hallo zusammen,
Wir haben über die Corona freie-Zeit aufbekommen einen Ticketautomaten zu programmieren.
Das habe ich soweit getan.
Ich finde aber, dass ich es etwas unstrukturiert gemacht habe.
Wie genau kann man das noch strukturierter hinbekommen?

Danke im voraus
 

Garfild2015

Aktives Mitglied
Java:
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 erwachseneTickets;

    public int neuerName;
    private String linie;
private String name;
public Ticketautomat()
    {
        preis = ticketpreis;
preis = 540;

if(erwachseneTickets==1)
{ kindertickets=0;}
if (kindertickets == 1)
{ erwachseneTickets=0;}
bisherGezahlt = 0;
gesamtsumme = 0;
linie = "Gelsenkirchen";
name = "Person";
    }
    public void KinderTickets(int kindertickets){
        preis= (kindertickets*preis)/2;
    }
    public void ErwachseneTickets(int erwachsene){
preis=preis;
    }

public void linieÄndern(String neueLinie)
{
linie = neueLinie;
if(neueLinie=="München"){
neuenPreisFestsetzen(2550);
}
if(neueLinie=="Hamburg"){
neuenPreisFestsetzen(4550);
}
if(neueLinie=="Düsseldorf"){
neuenPreisFestsetzen(2050);
}
if(neueLinie=="Stutgart"){
neuenPreisFestsetzen(3050);
}
if(neueLinie=="München"){
neuenPreisFestsetzen(2750);
}
if(neueLinie=="Berlin"){
neuenPreisFestsetzen(3080);
}
    }
    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 gibGeldbestand()
{
return gesamtsumme;
    }
    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();
        }
    }
}
 
Zuletzt bearbeitet von einem Moderator:

Garfild2015

Aktives Mitglied
Code:
Java:
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 erwachseneTickets;

    public int neuerName;
    private String linie;
private String name;
public Ticketautomat()
    {
        preis = ticketpreis;
preis = 540;

if(erwachseneTickets==1)
{ kindertickets=0;}
if (kindertickets == 1)
{ erwachseneTickets=0;}
bisherGezahlt = 0;
gesamtsumme = 0;
linie = "Gelsenkirchen";
name = "Person";
    }
    public void KinderTickets(int kindertickets){
        preis= (kindertickets*preis)/2;
    }
    public void ErwachseneTickets(int erwachsene){
preis=preis;
    }

public void linieÄndern(String neueLinie)
{
linie = neueLinie;
if(neueLinie=="München"){
neuenPreisFestsetzen(2550);
}
if(neueLinie=="Hamburg"){
neuenPreisFestsetzen(4550);
}
if(neueLinie=="Düsseldorf"){
neuenPreisFestsetzen(2050);
}
if(neueLinie=="Stutgart"){
neuenPreisFestsetzen(3050);
}
if(neueLinie=="München"){
neuenPreisFestsetzen(2750);
}
if(neueLinie=="Berlin"){
neuenPreisFestsetzen(3080);
}
    }
    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 gibGeldbestand()
{
return gesamtsumme;
    }
    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();
        }
    }
}
 
Zuletzt bearbeitet von einem Moderator:

Garfild2015

Aktives Mitglied
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 erwachseneTickets;
    
    public int neuerName;

    private String linie;
    private String name;
    public Ticketautomat()
    {

        preis = ticketpreis;
        preis = 540;
      
        if(erwachseneTickets==1)
        { kindertickets=0;}
        if (kindertickets == 1)
        { erwachseneTickets=0;}
        bisherGezahlt = 0;
        gesamtsumme = 0;
        linie = "Gelsenkirchen";
        name = "Person";
    }

    public void KinderTickets(int kindertickets){
        preis= (kindertickets*preis)/2;

    }

    public void ErwachseneTickets(int erwachsene){
        preis=preis;
    }


    public void linieÄndern(String neueLinie)
    {
        linie = neueLinie;
        if(neueLinie=="München"){
            neuenPreisFestsetzen(2550);   
        }
        if(neueLinie=="Hamburg"){
            neuenPreisFestsetzen(4550);   
        }
        if(neueLinie=="Düsseldorf"){
            neuenPreisFestsetzen(2050);   
        }
        if(neueLinie=="Stutgart"){
            neuenPreisFestsetzen(3050);   
        }
        if(neueLinie=="München"){
            neuenPreisFestsetzen(2750);   
        }
        if(neueLinie=="Berlin"){
            neuenPreisFestsetzen(3080);   
        }
    }

    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 gibGeldbestand()
    {
        return gesamtsumme;
    }

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

        }

    }
}
 

Kirby.exe

Top Contributor
Das erste was mir auffällt ist, dass du im Konstruktor vieles hard codierst, ich würde dir raten, die Werte beim instanzieren zu übergeben :)
 

Kirby.exe

Top Contributor
Die Methoden ErwachsenenTickets und KinderTickets würde ich löschen und die jeweiligen werte im Konstruktor übergeben und an Instanzvariablen zuweisen ;)
 

Kirby.exe

Top Contributor
Java:
public Ticketautomat(double ticketpreisErwachsen, double ticketpreisKind, String linie, String name) {
        this.ticketpreisErwachsen = ticketpreisErwachsen;
        this.ticketpreisKind = ticketpreisKind;
        bisherGezahlt = 0;
        gesamtsumme = 0;
        this.linie = linie;
        this.name = name;
    }
Das ist übrigens dein Konstruktor ;)

BTW als Tipp, baue deine Klasse so um, dass sie als allgemeine Datenstruktur funktioniert. Damit meine ich, dass wie hoch Preise oder wie die Linie heißt kannst du, beim instanzieren eines Objektes, über den Konstruktor machen ;)

Versuche das ebenfalls bei deinen Methoden zu tuen ;) Methoden sollten nicht mehr als 9 Zeilen Code enthalten
 
Zuletzt bearbeitet:

Kirby.exe

Top Contributor
Also ich habe mich heute morgen mal drangesetzt und deine Klasse komplett überarbeitet :) Ich hatte zwar nicht alle Zeit der Welt aber das ungefähre Design ist jetzt zumindest OOP orientiert ;) Die Formatierung der Ausgabe habe ich nicht bearbeitet, jedoch solltest du das hinbekommen ;) Hier sind die Klasse:

Java:
import java.util.ArrayList;

public class Ticketautomat {
    
    private double ticketpreisErwachsen;
    private double ticketpreisKind;
    private double bisherGezahlt;
    private double gesamtsumme;
    private ArrayList<Ticket> bestellung;
    
    
    public Ticketautomat(double ticketpreisErwachsen, double ticketpreisKind) {
        this.ticketpreisErwachsen = ticketpreisErwachsen;
        this.ticketpreisKind = ticketpreisKind;
        bisherGezahlt = 0;
        gesamtsumme = 0;
        bestellung = new ArrayList<>();
    }
    
    public void neuesTicket(String linie, String name, int ticketArt) {
        double preis = 0;
        if(ticketArt == 0) {
            preis += ticketpreisKind;
        }else {
            preis += ticketpreisErwachsen;
        }
        bestellung.add(new Ticket(name, linie, preis));
    }

    public void setzeKinderticketPreis(int neuerPreis){
        ticketpreisKind = neuerPreis;
    }
    
    public void setzeErwachsenenticketPreis(int neuerPreis){
        ticketpreisErwachsen = neuerPreis;
    }

    public double zeigeGesamteBestellung(){
        return gesamtsumme;
    }

    public double zeigeBisherGezahltenBetrag(){
        return bisherGezahlt;
    }

    public void geldEinwerfen(double betrag){
        if(betrag==0.10 || betrag ==0.20|| betrag==0.50|| betrag == 5.0|| betrag == 10.0|| betrag == 20.0 || betrag==50.0||betrag==100.0){
            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 geldAuszahlen(){
        if (gesamtsumme > 0){
            System.out.println("Geldrückgabe: "+ bisherGezahlt);
            gesamtsumme=0;
        }
    }

    public void ticketDrucken() {
        if(bisherGezahlt >= gesamtsumme && !bestellung.isEmpty()){
            for(int i = 0; i < bestellung.size(); i++) {
                    System.out.println("######################################");
                    System.out.println("#_______________Ticket_______________#");
                    System.out.println("# Datum:07.03.2020 Uhrzeit: 13:00Uhr #");
                    System.out.println("# Name: "+ bestellung.get(i).getName() + "             #");
                    System.out.println("# Von: Gladbeck Nach: "+ bestellung.get(i).getLine()+"       #");
                    System.out.println("# Ticketpreis: "+ bestellung.get(i).getTicketpreis() + "Euro     #");                         
                    System.out.println("######################################\n\n");
        
                    gesamtsumme -= bisherGezahlt;
                    geldAuszahlen();
        
            }
        } else if (bisherGezahlt < gesamtsumme)  {
            System.out.println("Es fehlt noch"+ (gesamtsumme-bisherGezahlt)+ "Euro!\n");
        }
    }
}
Java:
public class Ticket {
    
    private String name;
    private String linie;
    private double ticketpreis;
    
    public Ticket(String name, String linie, double ticketpreis) {
        this.name = name;
        this.linie = linie;
        this.ticketpreis = ticketpreis;
    }
    
    public String getName() {
        return name;
    }
    
    public String getLine() {
        return linie;
    }
    
    public double getTicketpreis() {
        return ticketpreis;
    }
    
    public String toString() {
        return "Name: " + name + "\nLinie: " + linie + "\nTicketpreis: " + ticketpreis;
    }
}
Java:
public class TicketTestKlasse {

    public static void main(String[] args) {
        Ticketautomat test = new Ticketautomat(1.40, 2.10);
        test.neuesTicket("Hamburg", "Max Müller", 1);
        test.neuesTicket("Hamburg", "Lino Müller", 0);
        test.neuesTicket("Hamburg", "Christine Müller", 1);
        test.ticketDrucken();

    }
}
 
K

kneitzel

Gast
Ich beziehe mich dann jetzt einmal auf den Code von Kirby:

Dann lass uns auch TicketArt doch noch eine enum machen und nutzen:
Java:
public enum TicketArt {
    KINDER_TICKET,
    ERWACHSENEN_TICKET
}

Und wenn man das dann nutzt, dann hat man es gleich viel lesbarer. Was dieses 0 oder 1 bedeutet ist doch sonst nicht ersichtlich. Das hätte man aber ansonsten als Minimum auch als Konstanten machen können ...

Ansonsten auf die Namensgebung achten - so Codestellen zeigen, dass die Benennungen nicht wirklich durchdacht sind:
Code:
    public double zeigeGesamteBestellung(){
        return gesamtsumme;
    }
Was wird denn da zurück gegeben? Die gesamte Bestellung? Die gesamter Summe?

Dann auch hier noch einmal die Anmerkung: Bei Währungen ist double keine gute Wahl. Hintergrund ist, dass es hier um Exaktheit geht. Wenn Du 1.000.000.000 mal 0.01 Euro addierst, dann willst Du auch genau 10.000.000 Euro haben:

Code:
public class Test {

    public static void main(String[] args) {
       double summe = 0.;
       double diffValue = 0.01;

       for (long i = 0; i< 1_000_000_000; i++)
           summe += diffValue;

       System.out.println(summe);
    }
}
(Wobei das eine Exaktheit ist, die in der Praxis nicht auffällt. Da gab es doch Leute, die über Jahre kleine Pfennig Beträge abgezweigt haben und so Millionen veruntreut haben und es ist nur durch Zufall aufgefallen ... Und bei 1 Milliarde Operationen sind 17,5 Cent Abweichung auch nicht wirklich viel...)
 

Kirby.exe

Top Contributor
Dann lass uns auch TicketArt doch noch eine enum machen und nutzen:
Java:
public enum TicketArt {
    KINDER_TICKET,
    ERWACHSENEN_TICKET
}
Ich muss gestehe, dass ich noch nicht so viel mit enums zu tun hatte xD Soweit ich enums verstanden habe ist es eine "Sammlung" von Strings ? Jedoch wozu sie genau dienen weiß ich nicht XD
 
K

kneitzel

Gast
Nein. Enums sind keine Sammlung von Strings oder so sondern sind ein Klassentyp. (JLS 8.9 - "An enum declaration specifies a new enum type, a special kind of class type. ")

Also die Enum von oben könnte man evtl. etwas wie das hier ansehen:
Code:
public class TicketArt {
  public static final KINDER_TICKET = new TicketArt();
  public static final ERWACHSENEN_TICKET = new TicketArt();
  private TicketArt() {}
}

Das stimmt so nicht ganz, denn Enums haben noch paar Funktionalitäten, die nicht abgebildet wurden. Du hast hier also nicht wie bei C oder C++ eine Durchnummerierung und ein Enum ist da dann einfach nur ein int oder so. Enums sind in Java ein spezieller Typ von Klasse.

Das ist dann auch wichtig, denn man kann in Enums auch einen Konstruktor definieren, Instanzvariablen definieren u.s.w.

Daher lohnt sich auf jeden Fall ein genauerer Blick auf Enums :)
 

Kirby.exe

Top Contributor
Nein. Enums sind keine Sammlung von Strings oder so sondern sind ein Klassentyp. (JLS 8.9 - "An enum declaration specifies a new enum type, a special kind of class type. ")

Also die Enum von oben könnte man evtl. etwas wie das hier ansehen:
Code:
public class TicketArt {
  public static final KINDER_TICKET = new TicketArt();
  public static final ERWACHSENEN_TICKET = new TicketArt();
  private TicketArt() {}
}

Das stimmt so nicht ganz, denn Enums haben noch paar Funktionalitäten, die nicht abgebildet wurden. Du hast hier also nicht wie bei C oder C++ eine Durchnummerierung und ein Enum ist da dann einfach nur ein int oder so. Enums sind in Java ein spezieller Typ von Klasse.

Das ist dann auch wichtig, denn man kann in Enums auch einen Konstruktor definieren, Instanzvariablen definieren u.s.w.

Daher lohnt sich auf jeden Fall ein genauerer Blick auf Enums :)
Huuch das klingt sehr Hilfreich xD Na dann werde ich da mal einen Blick drauf werfen :)
 

temi

Top Contributor
Ich würde trotzdem gerne noch einmal auf den ursprünglichen Code eingehen, um auf ein paar Sachen hinzuweisen.
Java:
// Auszug aus Ticketautomat
public class Ticketautomat {

    // diese int-Variablen sind an dieser Stelle mit 0 initialisiert worden
    private int preis;
    private int bisherGezahlt;
    private int gesamtsumme;
    private int ticketpreis;
    public int kindertickets;
    public int erwachseneTickets;
    public int neuerName; // neuer Name und Variablentyp int ???
    private String linie;
    private String name;

    public Ticketautomat() {
        preis = ticketpreis; // Hier wird der Inhalt von ticketpreis (= 0) an preis zugewiesen
        preis = 540; // und anschließend sofort mit 540 überschrieben

        if(erwachseneTickets==1) { // das ist nie true, weil erwachsenenTickets = 0
            kindertickets = 0;
        }
       
        if (kindertickets == 1) { // hier genau dasselbe
            erwachseneTickets = 0;
        }

    public void ErwachseneTickets(int erwachsene) {
        preis = preis; // hier weist du preis sich selbst zu, recht sinnlos das ganze
    }
       
    // Rest egal


Gibt es eigentlich Vorgaben für den Ticketautomaten oder könnt ihr euch ausdenken was ihr euch darunter so vorstellt?
 

Garfild2015

Aktives Mitglied
Also ich habe mich heute morgen mal drangesetzt und deine Klasse komplett überarbeitet :) Ich hatte zwar nicht alle Zeit der Welt aber das ungefähre Design ist jetzt zumindest OOP orientiert ;) Die Formatierung der Ausgabe habe ich nicht bearbeitet, jedoch solltest du das hinbekommen ;) Hier sind die Klasse:

Java:
import java.util.ArrayList;

public class Ticketautomat {
   
    private double ticketpreisErwachsen;
    private double ticketpreisKind;
    private double bisherGezahlt;
    private double gesamtsumme;
    private ArrayList<Ticket> bestellung;
   
   
    public Ticketautomat(double ticketpreisErwachsen, double ticketpreisKind) {
        this.ticketpreisErwachsen = ticketpreisErwachsen;
        this.ticketpreisKind = ticketpreisKind;
        bisherGezahlt = 0;
        gesamtsumme = 0;
        bestellung = new ArrayList<>();
    }
   
    public void neuesTicket(String linie, String name, int ticketArt) {
        double preis = 0;
        if(ticketArt == 0) {
            preis += ticketpreisKind;
        }else {
            preis += ticketpreisErwachsen;
        }
        bestellung.add(new Ticket(name, linie, preis));
    }

    public void setzeKinderticketPreis(int neuerPreis){
        ticketpreisKind = neuerPreis;
    }
   
    public void setzeErwachsenenticketPreis(int neuerPreis){
        ticketpreisErwachsen = neuerPreis;
    }

    public double zeigeGesamteBestellung(){
        return gesamtsumme;
    }

    public double zeigeBisherGezahltenBetrag(){
        return bisherGezahlt;
    }

    public void geldEinwerfen(double betrag){
        if(betrag==0.10 || betrag ==0.20|| betrag==0.50|| betrag == 5.0|| betrag == 10.0|| betrag == 20.0 || betrag==50.0||betrag==100.0){
            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 geldAuszahlen(){
        if (gesamtsumme > 0){
            System.out.println("Geldrückgabe: "+ bisherGezahlt);
            gesamtsumme=0;
        }
    }

    public void ticketDrucken() {
        if(bisherGezahlt >= gesamtsumme && !bestellung.isEmpty()){
            for(int i = 0; i < bestellung.size(); i++) {
                    System.out.println("######################################");
                    System.out.println("#_______________Ticket_______________#");
                    System.out.println("# Datum:07.03.2020 Uhrzeit: 13:00Uhr #");
                    System.out.println("# Name: "+ bestellung.get(i).getName() + "             #");
                    System.out.println("# Von: Gladbeck Nach: "+ bestellung.get(i).getLine()+"       #");
                    System.out.println("# Ticketpreis: "+ bestellung.get(i).getTicketpreis() + "Euro     #");                        
                    System.out.println("######################################\n\n");
       
                    gesamtsumme -= bisherGezahlt;
                    geldAuszahlen();
       
            }
        } else if (bisherGezahlt < gesamtsumme)  {
            System.out.println("Es fehlt noch"+ (gesamtsumme-bisherGezahlt)+ "Euro!\n");
        }
    }
}
Java:
public class Ticket {
   
    private String name;
    private String linie;
    private double ticketpreis;
   
    public Ticket(String name, String linie, double ticketpreis) {
        this.name = name;
        this.linie = linie;
        this.ticketpreis = ticketpreis;
    }
   
    public String getName() {
        return name;
    }
   
    public String getLine() {
        return linie;
    }
   
    public double getTicketpreis() {
        return ticketpreis;
    }
   
    public String toString() {
        return "Name: " + name + "\nLinie: " + linie + "\nTicketpreis: " + ticketpreis;
    }
}
Java:
public class TicketTestKlasse {

    public static void main(String[] args) {
        Ticketautomat test = new Ticketautomat(1.40, 2.10);
        test.neuesTicket("Hamburg", "Max Müller", 1);
        test.neuesTicket("Hamburg", "Lino Müller", 0);
        test.neuesTicket("Hamburg", "Christine Müller", 1);
        test.ticketDrucken();

    }
}
Wow
erstmal Danke für die Mühe.
Ich hätte da noch einige Fragen.
Ich hoffe das stört sie nicht,
Wie kann man jetzt für manche Städte die Preise Festlegen?
Kann man das Datum und die Uhrzeit auch an den Tag anpassen?
Ist der Kinder preis jetzt immer die Hälfte von dem Erwachsenenpreis?
Kann man auf dem Ticket noch anzeigen ob es ein Kinder oder Erwachsenen Ticket ist ?


Ich hoffe ich bedränge sie nicht mit meinen Fragen, nur ohne Informatik Unterricht bin ich total aufgeschmissen.
 

Kirby.exe

Top Contributor
Also die Preise oder sonstigen Daten werden nicht von der Datenstruktur festgelegt ;) Ich kann mich morgen mal dran setzen und dir anhand eines Beispiels alles erläutern :)
 

temi

Top Contributor
Hier mal eine rudimentäre Version, bei der die Preise für die einzelnen Linien festgelegt werden können:
Java:
public class Automat {

    private final static int NOTFOUND = -1;

    private final String location;
    private final List<Line> lines = new ArrayList<>();

    public Automat(final String location) {
        this.location = location;
    }

    public void addLine(final Line line) {
        this.lines.add(line);
    }

    public void showLines() {
        System.out.println("Ausgangsort: " + location);
        System.out.println("Sie haben folgende Zielorte zur Auswahl:");
        System.out.println("----------------------------------------");

        for (Line line : lines) {
            System.out.println(line.getDestination());
        }
    }

    public int getPrice(final String destination, final int age) {
        for (Line line : lines) {
            if (line.getDestination().equals(destination)) {
                return line.getPrice(age);
            }
        }

        return NOTFOUND;
    }
}
Java:
public class Line {

    private static final int NOTFOUND = -1;

    private final String destination;
    private final List<Price> prices = new ArrayList<>();

    public Line(final String destination) {
        this.destination = destination;
    }

    public void addPrice(final Price price) {
        prices.add(price);
        prices.sort(Comparator.comparing(Price::getMaxAgeAge));
    }

    public String getDestination() {
        return destination;
    }

    public int getPrice(final int age) {
        for(Price price : prices) {
            if (price.isValid(age)) {
                return price.getPrice();
            }
        }

        return NOTFOUND;
    }
}
Java:
public class Price {

    private final int price;
    private final int maxAge;

    public Price(final int price) {
        this(price, Integer.MAX_VALUE);
    }

    public Price(final int price, final int maxAge) {
        this.price = price;
        this.maxAge = maxAge;
    }

    public boolean isValid(final int age) {
        return age <= maxAge;
    }

    public int getPrice() {
        return price;
    }

    public int getMaxAgeAge() {
        return maxAge;
    }
}
Java:
public class Main {

    public static void main(String[] args) {

        Automat automat = new Automat("Wuppertal");

        Line line = new Line("Sprockhövel");
        line.addPrice(new Price(500));
        line.addPrice(new Price(300, 16));
        line.addPrice(new Price(200, 8));
        automat.addLine(line);

        line = new Line("Düsseldorf");
        line.addPrice(new Price(650));
        line.addPrice(new Price(350, 16));
        automat.addLine(line);

        automat.showLines();

        System.out.println();

        System.out.print("Ticket nach Sprockhövel für eine(n) Vierjährige(n) kostet: ");
        System.out.println(automat.getPrice("Sprockhövel", 4));

        System.out.print("Ticket nach Sprockhövel für eine(n) 32-jährige(n) kostet: ");
        System.out.println(automat.getPrice("Sprockhövel", 32));
    }
}
 

White_Fox

Top Contributor
Mein Professor in Automatisierung hätte bei so einer Aufgabe einen Zustandsautomaten erwartet.

Entweder schnöde mit Enumerationen und entsprechenden Funktionsaufrufen, wobei jede Funktion die Enumeration des nächsten Zustands, in den übergegangen werden soll, zurückgibt. So kriegt man das auch in C hin.

Oder, m.M.n. besser:
 

Garfild2015

Aktives Mitglied
Hier mal eine rudimentäre Version, bei der die Preise für die einzelnen Linien festgelegt werden können:
Java:
public class Automat {

    private final static int NOTFOUND = -1;

    private final String location;
    private final List<Line> lines = new ArrayList<>();

    public Automat(final String location) {
        this.location = location;
    }

    public void addLine(final Line line) {
        this.lines.add(line);
    }

    public void showLines() {
        System.out.println("Ausgangsort: " + location);
        System.out.println("Sie haben folgende Zielorte zur Auswahl:");
        System.out.println("----------------------------------------");

        for (Line line : lines) {
            System.out.println(line.getDestination());
        }
    }

    public int getPrice(final String destination, final int age) {
        for (Line line : lines) {
            if (line.getDestination().equals(destination)) {
                return line.getPrice(age);
            }
        }

        return NOTFOUND;
    }
}
Java:
public class Line {

    private static final int NOTFOUND = -1;

    private final String destination;
    private final List<Price> prices = new ArrayList<>();

    public Line(final String destination) {
        this.destination = destination;
    }

    public void addPrice(final Price price) {
        prices.add(price);
        prices.sort(Comparator.comparing(Price::getMaxAgeAge));
    }

    public String getDestination() {
        return destination;
    }

    public int getPrice(final int age) {
        for(Price price : prices) {
            if (price.isValid(age)) {
                return price.getPrice();
            }
        }

        return NOTFOUND;
    }
}
Java:
public class Price {

    private final int price;
    private final int maxAge;

    public Price(final int price) {
        this(price, Integer.MAX_VALUE);
    }

    public Price(final int price, final int maxAge) {
        this.price = price;
        this.maxAge = maxAge;
    }

    public boolean isValid(final int age) {
        return age <= maxAge;
    }

    public int getPrice() {
        return price;
    }

    public int getMaxAgeAge() {
        return maxAge;
    }
}
Java:
public class Main {

    public static void main(String[] args) {

        Automat automat = new Automat("Wuppertal");

        Line line = new Line("Sprockhövel");
        line.addPrice(new Price(500));
        line.addPrice(new Price(300, 16));
        line.addPrice(new Price(200, 8));
        automat.addLine(line);

        line = new Line("Düsseldorf");
        line.addPrice(new Price(650));
        line.addPrice(new Price(350, 16));
        automat.addLine(line);

        automat.showLines();

        System.out.println();

        System.out.print("Ticket nach Sprockhövel für eine(n) Vierjährige(n) kostet: ");
        System.out.println(automat.getPrice("Sprockhövel", 4));

        System.out.print("Ticket nach Sprockhövel für eine(n) 32-jährige(n) kostet: ");
        System.out.println(automat.getPrice("Sprockhövel", 32));
    }
}
Das Programm sucht eine Klasse die " List" heißt.
Ist das die wo man die Preise festlegen kann ?
Und er findet die variable "Comparator" nicht
 

Kirby.exe

Top Contributor
@Garfild2015 List ist in dem Fall eine ArrayList ;) Diese verwaltet lediglich die Objekte "Preis" ;) Um Preise zu ändern muss du die jeweiligen Objekte ansteuern

Comparator ist keine Variable sondern ein Interface ;)
 
Zuletzt bearbeitet:

Garfild2015

Aktives Mitglied
@Garfild2015 List ist in dem Fall eine ArrayList ;) Diese verwaltet lediglich die Objekte "Preis" ;) Um Preise zu ändern muss du die jeweiligen Objekte ansteuern

Comparator ist keine Variable sondern ein Interface ;)
Code:
private final String location;
    private final List<Line> lines = new ArrayList<>();
Was genau muss ich den ändern?
Bluej gibt als Fehlermeldung "cannot find Symbol" -class List

Code:
public void addPrice(final Price price) {
        prices.add(price);
        prices.sort(Comparator.comparing(Price::getMaxAgeAge));
    }
Und hier ist das mit dem "Comparator"
Fehlermeldung: "cannot find Symbol"
 
K

kneitzel

Gast
Wie genau füge ich die beiden Programm (von ihnen und von temi) am besten zusammen?
Der beste Weg: Verstehen, was die Programme machen um dann daraus das zu bauen, was mach braucht. Sollte es irgendwo ein Verständnisproblem geben: schauen, ob man mit Google oder irgend welchen Büchern das noch verstehen kann und wenn nicht, dann einfach nachfragen.

Dadurch das wir irgendwas an Code für Dich schreiben ist Dein Lerneffekt annähernd 0 und das sollte nicht in Deinem Interesse sein. Zumindest ist es nicht in unserem :)
 

Garfild2015

Aktives Mitglied
Ja ist es, du sollst eine seperate Test Klasse erstellen, wo du den Automat als Objekt instanzierst ;) Dort kannst du dann verschiedene Linien hinzufügen und diesen Linien wiederum Preise hinzufügen ;)

Es wurde mir ja eine Testklasse mit prorammiert, aber wenn ich die dort hinschreibe
sagt das Programm das es das nicht findet
Code:
import java.util.ArrayList;
public class Main {

    public static void main(String[] args) {

        Automat automat = new Automat("Wuppertal");

        Line line = new Line("Sprockhövel");
        line.addPrice(new Price(500));
        line.addPrice(new Price(300, 16));
        line.addPrice(new Price(200, 8));
        automat.addLine(line);

        line = new Line("Düsseldorf");
        line.addPrice(new Price(650));
        line.addPrice(new Price(350, 16));
        automat.addLine(line);
        
        line = new Line("München");
        line.addPrice(new Price(850));
        line.addPrice(new Price(550, 16));
        automat.addLine(line);
        
        line = new Line("Berlin");
        line.addPrice(new Price(550));
        line.addPrice(new Price(450, 16));
        automat.addLine(line);

        automat.showLines();

        System.out.println();

        System.out.print("Ticket nach Sprockhövel für eine(n) Vierjährige(n) kostet: ");
        System.out.println(automat.getPrice("Sprockhövel", 4));

        System.out.print("Ticket nach Sprockhövel für eine(n) 32-jährige(n) kostet: ");
        System.out.println(automat.getPrice("Sprockhövel", 32));
    }
}
 

Kirby.exe

Top Contributor
Ich meinte damit ob alle obigen Klassen im selben package sind wie deine Klasse? Sonst müsstest du sie zum Build Path hinzufügen etc
 

temi

Top Contributor
Es wurde mir ja eine Testklasse mit prorammiert, aber wenn ich die dort hinschreibe
sagt das Programm das es das nicht findet
Hat es denn funktioniert bevor du in der Testklasse noch etwas hingeschrieben hast?

Was ist die genaue Fehlermeldung, mit deiner Angabe kann man gar nix anfangen.
Wo genau hätte ich den die anderen Städte hinschreiben sollen?
Das was du etwas weiter oben in der Testklasse geschrieben hast, sieht eigentlich ganz gut aus.

BTW: Es ist wichtig, dass du verstehst, was da passiert, sonst ist das nicht Programmieren sondern Raten. Falls es deine aktuellen Fähigkeiten (Edit: Das meine ich nicht despektierlich, sondern ganz einfach deinen aktuellen Wissenstand) überschreitet, dann lass es und mach mit deiner Lösung weiter, es hat sonst keinen Sinn.
 
Zuletzt bearbeitet:

Garfild2015

Aktives Mitglied
Hat es denn funktioniert bevor du in der Testklasse noch etwas hingeschrieben hast?

Was ist die genaue Fehlermeldung, mit deiner Angabe kann man gar nix anfangen.

Das was du etwas weiter oben in der Testklasse geschrieben hast, sieht eigentlich ganz gut aus.

BTW: Es ist wichtig, dass du verstehst, was da passiert, sonst ist das nicht Programmieren sondern Raten. Falls es deine aktuellen Fähigkeiten (Edit: Das meine ich nicht despektierlich, sondern ganz einfach deinen aktuellen Wissenstand) überschreitet, dann lass es und mach mit deiner Lösung weiter, es hat sonst keinen Sinn.
Alles gut,
Ich werde glaube ich erstmal mit meinem weiter arbeiten.
Da hätte ich gleich eine Frage.
Ich wollte den gesammtpreis in eine Methode ausrechnen lassen, aber das funktioniert irgendwie nicht.
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;
        
        
        erwachsenentickets= 0;
        kindertickets = 0;
        bisherGezahlt = 0;
        gesamtsumme = 0;
        linie = "Gelsenkirchen";

        name = "Person";
    }

    public void KinderTickets(int neueKindertickets){
        kindertickets=neueKindertickets;
        streckenpreis= (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)){
            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;   
        }
        else{
            streckenpreis=340;}

    }

    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 kompletteSumme(){
        gesamtsumme = (streckenpreis*kindertickets/2)+streckenpreis*erwachsenentickets;
        return gesamtsumme;

    }

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

        }

    }
}
 

Garfild2015

Aktives Mitglied
Code:
 public  int kompletteSumme(){
        gesamtsumme = (streckenpreis*kindertickets/2)+streckenpreis*erwachsenentickets;
        return gesamtsumme;

    }
    hier
 

Ähnliche Java Themen

Neue Themen


Oben