Modellieren eines Buchungssystems für Busfahrkarten

Hallo ihr Lieben,
ich befinde mich zur Zeit tief im Stress wegen meines Studiums und muss die folgende Modellierung in Java lösen. Bisher hatte ich wirklich nie Probleme, wenn es um Modellierungen geht, aber bei der folgenden Aufgabe fehlt mir der Input einfach. Nichts läuft wie es soll. Kann mir wer beim Start helfen oder Input geben oder zumindest zeigen , wie ich die Platzhalter( siehe Aufgabe) implementieren soll. Über jegliche Hilfe oder Lösungsvorschläge wäre ich dankbar.

Aufgabe:

In dieser Aufgabe soll ein Buchungssystem für Busfahrkarten implementiert werden. Ein Omnibus,
kurz Bus, ist ein großes Verkehrsmittel, welches unter anderem auch im öffentlichen Personennahverkehr
der Beförderung zahlreicher Personen dient. Hierbei kann ein Omnibus über seine
eindeutige Busnummer identifiziert werden. Eine Fahrkarte ist ein Ausweis, der gegen Entrichtung
eines bestimmten Geldbetrages zur Benutzung eines öffentlichen Verkehrsmittels berechtigt. Ein
Busbahnhof ist eine größere Haltestellenanlage, die als Verknüpfungspunkt verschiedener Buslinien
dient. Hierbei kann jeder Busbahnhof über eine eindeutige Zeichenkette identifiziert werden. Eine
Buslinie ist die Verbindung zweier Busbahnhöfe, die regelmäßig durch Omnibusse bedient wird.

B.1 Platzhalter

Beachten Sie, dass bei der Beschreibung der Eingabe- und Ausgabeformate die Wörter zwischen
spitzen Klammen (< und >) für Platzhalter stehen, welche bei der konkreten Ein- und Ausgabe
durch Werte ersetzt werden. Diese eigentlichen Werte enthalten bei der Ein- und Ausgabe keine
spitzen Klammern.

<Busnummer > Eine natürliche Zahl aus dem offenen Intervall ¹0 1000º, welche bei der Ausgabe
immer mit führenden Nullen auf drei Stellen aufgeführt wird.

<Kundennummer > Eine natürliche Zahl exklusive 0, welche für den ersten Kunde bei 1 beginnt
und für jeden weiteren Kunden um 1 hochgezählt wird.

<Vorname > und <Nachname > Teile des Namens eines Kunden, welche jeweils durch eine
beliebige Zeichenkette ohne Zeilenumbruch und ohne Semikolon angegeben werden.

<Preis > Die Kosten für ein Busticket, welche durch eine positive reelle Zahl mit einem zweistelligen
Nachkommateil, getrennt durch einen Punkt, angegeben werden.

<Rechnungsnummer > Eine natürliche Zahl exklusive 0, welche für die erste Rechnung bei 1
beginnt und für jeden weitere Rechnung um 1 hochgezählt wird.

<Start > und <Ziel > Bezeichner für den Start- und Zielbusbahnhof einer Buslinie in Form
einer Zeichenkette ohne Zeilenumbruch und ohne Semikolon.

<Währung > Kann entweder EUR, USD oder JPY sein.

[.....] aufgabe würde hier noch weiter gehen, aber das sollte ich dann schaffen, aber bei dem Anfang bin ich am Verzweifeln. Bitte helft mir. Wäre sehr dankbar. Danke im Voraus.
 
Ich weiß nicht genau, was du von uns erwartest. In dem gezeigten Aufgabenteil nur die Basisklassen definieren mit entsprechenden Namen, Feldern und Relationen. Diese Basisklassen sind für den gezeigten Text: Bus, Fahrkarte, Kunde und Verbindung. Für die Felder musst du dir entsprechende Datentypen überlegen. So ist Preis natürlich ein double. Für die Nummern kommen Ganzzahlige Datentypen in Frage. Währung könnte ggf. auch ein Enum sein.
 
Zuletzt bearbeitet:
Das ist mir schon klar und den Enum hab ich auch, aber was ist zum Bsp mit Eingaben für die Platzhalter gemeint ? Soll ich die Eingaben per setter Machen oder per Konsoleneingabe ?

Und bei der Umsetzung der methoden ist mir einfach nicht klar, wie ich :
- zum einen einen Int mit Nullen vorne auffülle
- und wie ich es schaffe, dass die rechnungsnummer bzw kundennummer bei 1 startet und dann bei jedem Aufruf automatisch um 1 erhöht wird

da bräuchte ich input
 
Das ist mir schon klar und den Enum hab ich auch, aber was ist zum Bsp mit Eingaben für die Platzhalter gemeint ? Soll ich die Eingaben per setter Machen oder per Konsoleneingabe ?

Und bei der Umsetzung der methoden ist mir einfach nicht klar, wie ich :
- zum einen einen Int mit Nullen vorne auffülle
- und wie ich es schaffe, dass die rechnungsnummer bzw kundennummer bei 1 startet und dann bei jedem Aufruf automatisch um 1 erhöht wird

da bräuchte ich input
Du sollst keinen int mit nullen füllen sondern die Ausgabe so formatieren, dass die int Variable mit voranstehenden Nullen angezeigt wird.

Zu 2: du kannst zum Beispiel eine statische int Variable jedesmal im Konstruktor inkrementieren und zur Kundennummer dazuaddieren. Gibt aber bestimmt bessere Lösungen.
 
Zu 2: du kannst zum Beispiel eine statische int Variable jedesmal im Konstruktor inkrementieren und zur Kundennummer dazuaddieren. Gibt aber bestimmt bessere Lösungen.
Würde ich für den Fall nicht sagen. Du könntest noch eine Art Kundenmanager bauen, der die Nummer über die Verwaltungsliste (size?) herausfindet. Aber es ist nicht unbedingt besser und vor allem sehe ich keinen Grund in der Aufgabe dafür.


PS.:
Und bei der Umsetzung der methoden ist mir einfach nicht klar, wie ich :
Siehst du, auf konkrete Fragen bekommst du konkrete Anworten. Keep it going.
 
Kann mir bitte wer sagen, wieso das einfach nicht klappen will mit den Nullen ?
Java:
public class Bus {
    private int busNumber;

    public int getBusNumber() {
        if (busNumber < 10) {
            String s = String.format("00%d", busNumber);
            busNumber = Integer.parseInt(s);
            return busNumber;
        }
        if (busNumber < 100) {
            String s = String.format("0%d", busNumber);
            busNumber = Integer.parseInt(s);
            return busNumber;
        }
        if (busNumber > 100) {
            return busNumber;

        }
        return busNumber;
    }

    public void setBusnumber(int number) {
        if (number > 0 && number < 1000) {
            this.busNumber = number;
        }
    }

    public static void main(String[] args) {
        Bus bus = new Bus();
        bus.setBusnumber(20);
        System.out.println(bus.getBusNumber());
    }
}
 
Also Hintergund ist ja dass beim Setzen der Busnummer sie im Intervall von 1 bis 999 liegen muss und beim Ausgeben muss die Busnummer immer auf 3 Stellen aufgefüllt werden. Also eine Zahl kleiner als 10 braucht 2 nuller etc
Kann mir bitte wer sagen, wieso das einfach nicht klappen will mit den Nullen ?
Java:
public class Bus {
    private int busNumber;

    public int getBusNumber() {
        if (busNumber < 10) {
            String s = String.format("00%d", busNumber);
            busNumber = Integer.parseInt(s);
            return busNumber;
        }
        if (busNumber < 100) {
            String s = String.format("0%d", busNumber);
            busNumber = Integer.parseInt(s);
            return busNumber;
        }
        if (busNumber > 100) {
            return busNumber;

        }
        return busNumber;
    }

    public void setBusnumber(int number) {
        if (number > 0 && number < 1000) {
            this.busNumber = number;
        }
    }

    public static void main(String[] args) {
        Bus bus = new Bus();
        bus.setBusnumber(20);
        System.out.println(bus.getBusNumber());
    }
}
 
Glaubt mir ich hatte das auch schon und es klappt trotzdem einfach nicht. Die Zahl wird ausgegeben aber eben ohne das Auffüllen und ich check einfach nicht wieso. Hat es was mit dem Parsen zu tun ?
Java:
public class Bus {
    private int busNumber;

    public int getBusNumber() {
        String s = String.format("%03d", busNumber);
        return Integer.parseInt(s);
    }

    public void setBusnumber(int number) {
        if (number > 0 && number < 1000) {
            this.busNumber = number;
        }
    }

    public static void main(String[] args) {
        Bus bus = new Bus();
        bus.setBusnumber(20);
        System.out.println(bus.getBusNumber());
    }
}
Ausgabe 20
 
Diese Bemerkung hat geholfen. Ich musste eine zweite Variable als String machen. Jetzt klappts, aber ich weiß nicht ob das so Sinn der Sache war, aber naja. Danke
 
Kleines Beispiel, damit es vielleicht klarer wird

Java:
public class Bus {
    private int nummer;
    
    public void setNummer(int nummer) {
        if (nummer > 0 && nummer < 1000) {
            this.nummer = nummer;
        }
    }
    
    @Override
    public String toString() {
        return String.format("%03d", nummer);
    }

     public static void main(String []args){
        Bus bus = new Bus();
        bus.setNummer(20);
        
        System.out.println("Heute fährt der Bus " + bus);
     }
}
 
Danke danke. Ich hatte es zwar schon bzw ich glaube jetzt mein Grundgerüst mit allen Platzhaltern aus der Aufgabe implementiert zu haben, aber ich bin mir überhaupt net sicher, ob das was ich tue richtig ist,
Euch allen trotzdem ein herzlichstes Danke und falls was sein sollte, hoff ich natürlich, dass ihr mir wieder so liebevoll weiterhelfen könnt.
 
ich weiß nicht ob ich einen Post aufmachen sollte oder, ob ich es hier erfrage, aber ich probier mein Glück einfach mal hier. Und zwar ist jetzt mein Problem, dass ich zwar die Grundgerüstbausteine soweit habe, aber ich nicht weiß welche Datenstruktur ich zum Speichern der Buchungen für die Buslinien benötige. Ich darf für die Aufgabe mir selbst etwas bauen oder eben das Collection Framework von Java benutzen (Collection, List, Hashmaps, SortedList etc), aber welche wäre davon am sinnvollsten?

hier erst mal die Aufgabe :

"Nach dem Start nimmt Ihr Programm über die Konsole mittels Terminal . readLine () Eingaben
entgegen, welche im Folgenden näher spezifiziert werden. Nach Abarbeitung einer Eingabe
wartet Ihr Programm auf weitere Eingaben, bis das Programm irgendwann durch die Eingabe der
Zeichenfolge quit beendet wird.

Achten Sie darauf, dass durch die Ausführung der folgenden Befehle die gegebene Spezifikationen
nicht verletzt werden und geben Sie in diesen Fällen immer eine aussagekräftige Fehlermeldung aus.
Wenn die Benutzereingabe nicht dem vorgegebenen Format entspricht, ist auch eine Fehlermeldung
auszugeben. Nach der Ausgabe einer Fehlermeldung soll das Programm wie erwartet fortfahren
und wieder auf die nächste Eingabe warten. Jede Fehlermeldung muss mit Error, beginnen und
darf keine Zeilenumbrüche enthalten. Den weiteren Text der Fehlermeldung dürfen Sie frei wählen,
er sollte jedoch sinnvoll sein.

B.2.1 Der add-Befehl
Dieser Befehl fügt dem Buchungssystem eine neue buchbare Buslinie hinzu.
Eingabeformat add <Busnummer >;< Start >;< Ziel >;< Preis >;<Währung >
Ausgabeformat Im Erfolgsfall wird OK ausgegeben.

B.2.2 Der remove-Befehl
Mit dem Befehl ist es möglich, Buslinien aus den Buchungssystem zu entfernen. Gestrichene
Buslinien mit einer Busnummer können jedoch zu einem späteren Zeitpunkt mittels add-Befehl
dem System wieder hinzugefügt werden.
Eingabeformat remove <Busnummer >
Ausgabeformat Im Erfolgsfall wird OK ausgegeben. "

Die ganze Geschichte mit den Eingaben und Fehlerbehandlung sollte mir klar sein, aber wie ihr seht muss ich für den add Befehl mehrere verschiedene Elemente einfügen und irgendwo speichern. Die Frage ist aber wo? (es gibt auch nen Befehl der später alle Buslinien in jeweils einer Zeile sortiert nach der Busnummer ausgeben muss). Ist das irgendwie realisierbar? In meinem Kopf sind die ganze Zeit Arrays oder Listen, aber ich bin mir relativ unsicher, daher bitte ich mal wieder um eure Hilfe. Also die Idee ist, dass ich der add Methode die oben genannten Parameter mitgebe und es so gespeichert wird, dass es im Buchungssystem ist und es in einer Zeile in der Konsole ausgebbar ist.
Danke
 
ich weiß nicht ob ich einen Post aufmachen sollte oder, ob ich es hier erfrage, aber ich probier mein Glück einfach mal hier.
Solange es noch die gleiche Aufgabe ist, ist das schon in Ordnung hier.

aber ich nicht weiß welche Datenstruktur ich zum Speichern der Buchungen für die Buslinien benötige. Ich darf für die Aufgabe mir selbst etwas bauen oder eben das Collection Framework von Java benutzen (Collection, List, Hashmaps, SortedList etc), aber welche wäre davon am sinnvollsten?
Jede Collection eignet sich perse dafür. Die Frage ist was genau damit dann noch passiert. ArrayList ist erstmal nicht verkehrt.

aber wie ihr seht muss ich für den add Befehl mehrere verschiedene Elemente einfügen und irgendwo speichern. Die Frage ist aber wo?
Alles, was du dem add Befehl mitgibst, sind Attribute der Bus Klasse. Du hast also ein Verwaltungssystem, dieses enthält alle Buchungen, Busse, Kunden und Verbindungen. Ich nenne das Buchungssystem einfach mal FlixbusManager.

Java:
class FlixbusManager {
  private List<Bus> busse = new ArrayList<>();
  private List<Ticket> tickets = new ArrayList<>();
  private List<Verbindung> verbindungen = new ArrayList<>();
  private List<Kunde> kunden = new ArrayList();

  public void starteSitzung() {
     // [...] Eingabeschleife, die den add Befehl findet
    // param sei hier der hintere Teil ab Busnummer
    // Bus hat einen Konstruktur, der diesen hinteren Teil parsen und seine Attribute befüllen kann
   // bei schlechten Werten wird eine IllegalArgumentException geworfen
    try {
      busse.add(new Bus(param));
      System.out.println("OK");
    } catch (IllegalArgumentException e) {
      System.out.println("ERROR " + e.getMessage());
    }
  }
}
(es gibt auch nen Befehl der später alle Buslinien in jeweils einer Zeile sortiert nach der Busnummer ausgeben muss). Ist das irgendwie realisierbar?
ArrayList ist eine List und besitzt daher die sort Methode.

Java:
busse.sort(Comparator.comparingInt(Bus::getNummer));
busse.sort(Comparator.naturalOrder()); // falls Bus das Comparable Interface implementiert
 
Zuletzt bearbeitet:
Sorry fürs späte antworten, aber ich sitze erst jetzt wieder vor dem Pc. Danke erstmal für die Hilfe, aber eine Frage, hat es einen Grund wieso du ein Mal von Liste in deinem Code sprichst und dann von der ArrayList?
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben