Übung - Autowaschanlage der Tankstelle "OSSE"
Inhaltsverzeichnis
Aufgabenstellung
Vor einer Autowaschanlage der Tankstelle "OSSE" gibt es regelmäßig eine Schlange an Autos, die gewaschen werden sollen. Die bekannte Firma ProfiSoft soll nun ein Programm entwickeln, welches diese Warteschlange verwaltet. Aus Erfahrungsgründen (und aus Platzgründen) sind nie mehr als 10 Autos in dieser Schlange. Natürlich soll sich ein neu hinzukommendes Auto am Ende der Schlange anstellen (solange noch Platz ist), außerdem sollen alle wartende Autos aufrücken, wenn das an erster Stelle stehende Auto in die Anlage einfahren darf.
- Stellen Sie zu dem gegebenen Problem ein (geeignetes) Pflichtenheft auf. Suchen Sie sich dafür notwendige und sinnvolle Eigenschaften für die Klasse Auto
- Modellieren Sie eine geeignete Klasse Auto.
- Modellieren Sie eine geeignete Klasse Warteschlange. (Verwenden Sie zum Verwalten der gewünschten Anzahl an Autos eine geeignete Datenstruktur.)
- Testen Sie ihren Entwurf mit Hilfe des Java-Editors.
- Modellieren und Implementieren Sie eine Klasse WarteschlangeGUI, die für das gegebene Problem ein Java-Programm als Lösung anbietet.
Pflichtenheft
- Zu einem Auto werden Kfz-Kennzeichen, Autotyp und das gewünschte Waschprogramm erfasst.
- Autos werden entweder mit dem Waschprogramm oder mit allen Daten erfasst.
- Autos können sich in die Warteschlange einreihen.
- Autos können sich (von vorderster Stelle) aus der Schlange entfernen (, um in die Anlage einzufahren).
- Die Warteschlange wird ohne Werte erzeugt und umfasst maximal 10 Autos.
Fachklasse Auto
Nach den Festlegungen des Pflichtenheftes ist folgende Klasse Auto möglich:
Fachklasse Warteschlange
Die Warteschlange kann nun ebenfalls in einer Klasse erfasst werden. Zu Beachten ist, dass die späteren Objekte Auto unabhängig von dem Objekt Warteschlange existieren, d. h. die Warteschlange darf lediglich mit den Autoobjekten arbeiten, für diese aber keine Aufträge erledigen (siehe dazu auch weiter unten).
Als Attribute enthält die Klasse ein Feld Auto[], in dem ELF Autos gespeichert werden können. Dies ist zwar nicht unbedingt notwendig, ermöglicht aber an der Position 0 das in der Waschanlage stehende Auto zu speichern. Zudem wird in AnzahlAutos die Anzahl der in der Warteschlange stehenden Autos gespeichert, 0 bedeutet, dass ein Auto gerade gewaschen wird. Ist überhaupt kein Auto zu erfassen, hat AnzahlAutos den Wert -1.
Die Methode neuesAuto reiht ein neues (vorher erzeugtes) Objekt Auto in die Warteschlange ein.
Die Methode erstesAuto fährt das an erster Stelle stehende Auto in die Waschanlage. Gelingt dies, wird zusätzlich der Wert true zurückgegeben, ansonsten false (z. B. wenn kein Auto in der Schlange steht).
GUI-Klasse WarteschlangeGUI
Um die Schnittstelle zwischen Benutzer und den Klassen Warteschlange und Auto zu realisieren, benötigen wir eine GUI-Klasse. Diese enthält vor allem eine GUI zur Eingabe und Ausgabe der relevanten Daten und könnte das folgende Aussehen haben:
Die zugehörige Klasse WarteschlangeGUI könnte dann folgendermaßen aussehen:
Das Attribut myWarteschlange realisiert unsere gewünschte Warteschlange. Die Methoden BtnNext_ActionPerformed und BtnNew_ActionPerformed implementieren das Einfahren des nächsten Autos in die Waschanlage bzw. das Anstellen eines Autos in die Warteschlange. Die Methode ausgebenDerDaten realisiert die Ausgabe der aktuellen Situation.
Implementierung
Klasse Auto
Der Quellcode für die einzelnen Methoden der Klasse Auto wird vom Java-Editor automatisch erzeugt, eine "händische" Ergänzung ist nicht notwendig.
Klasse Warteschlange
Auch der Quelltext der Klasse Warteschlange wird (zum Teil) vom Java-Editor erzeugt. Da diese Klasse allerdings die einzelnen Autos verwalten soll, müssen hier einige Codezeilen ergänzt werden:
public class Warteschlange {
// Anfang Attribute
// Autos enthält die wartenden Autos an den Stellen 1..10
// in Autos[0] wird das derzeit in der Waschanlage stehende Auto erfasst
private Auto[] autos = new Auto[11];
// Anzahl der Autos wird gespeichert
// Anzahl = 0 ==> kein Auto in Schlange, aber eines in der Waschanlage
// Anzahl = 1 ==> kein Auto in Schlange und Waschanlage
private int anzahlAutos = -1;
// Ende Attribute
// Konstruktor
public Warteschlange() {
}
// Anfang Methoden
// hinzufügen eines neuen Autos am Ende der Schlange
// Test, ob noch freie Plätze vorhanden NICHT hier
public void neuesAuto(Auto aAuto) {
autos[anzahlAutos+1] = aAuto;
anzahlAutos++;
}
// erstes Auto der Schlange wird abgerufen
// restliche Autos rücken auf
public boolean erstesAuto() {
if (anzahlAutos > 0) {
// nächstes Auto wird in die Waschanlage gefahren
for (int i=0;i<10;i++) {
autos[i]= autos[i+1];
}
anzahlAutos--;
return true;
} else {
// kein Auto in der Warteschlange
return false;
}
}
// Ausgabe der Anzahl der Autos
public int getAnzahlAutos() {
return anzahlAutos;
}
public Auto getAuto(int position) {
return autos[position];
}
// Ende Methoden
}
Klasse WarteschlangeGUI
Ein großer Teil des Quelltextes dieser Klasse wird automatisch erzeugt. Einige wichtige Zeilen sind jedoch zu ergänzen.
Zum Einen ist ein Objekt myWarteschlange zu initialisieren:
private Warteschlange myWarteschlange = new Warteschlange();
Damit wird beim Programmstart eine leere Warteschlange erzeugt.
Ein Auto kann in die Waschanlage gerufen werden, wenn sich noch eines in der Warteschlange befindet. Für den Fall, dass dies nicht der Fall ist, wird eine Fehlermeldung ausgegeben:
// erstes Auto in die Waschanlage rufen
public void BtnNext_ActionPerformed(ActionEvent evt) {
// Auto aufrufen
if (myWarteschlange.erstesAuto()) {
// aktuelle Daten anzeigen
ausgebenDerDaten();
} else {
// Fehlermeldung ausgeben
JOptionPane.showMessageDialog(null, "Kein Auto in der Warteschlange!");
}
}
Um ein Auto an die Warteschlange anhängen zu können, muss dieses erst einmal erzeugt werden. Je nachdem, ob lediglich das Waschprogramm oder alle Daten eingegeben wurden, wird ein Objekt mit den gewünschten Daten erzeugt. Anschließend wird das neue Objekt Auto in die Warteschlange eingereiht.
// neues Auto am Ende der Warteschlange anhängen
public void BtnNew_ActionPerformed(ActionEvent evt) {
Auto newAuto;
// Werte einlesen
String kfzKennzeichen = tfKfzKennzeichen.getText();
String autoTyp = tfTyp.getText();
String programm = tfProgramm.getText();
// neues Auto anlegen
// ... falls Daten eingegeben wurden und Plätze in der Schlange frei sind
if ((programm != "") && (myWarteschlange.getAnzahlAutos() < 10)) {
if ((kfzKennzeichen == "") || (autoTyp == "")) {
// es wird nur das Waschprogramm erfasst
newAuto = new Auto(programm);
} else {
// es werden alle Daten erfasst
newAuto = new Auto(kfzKennzeichen, autoTyp, programm);
}
// Auto an die Schlange anstellen
myWarteschlange.neuesAuto(newAuto);
// aktuelle Daten anzeigen
ausgebenDerDaten();
} else {
// Fehlermeldung ausgeben
JOptionPane.showMessageDialog(null, "Die Warteschlange ist voll!!!");
}
}
Die aktuellen Daten der Waschanlage und der Warteschlange müssen noch in der GUI ausgegeben werden.
// Ausgabe der Daten für die Waschanlage und die Warteschlange
public void ausgebenDerDaten() {
String ausgabeText;
// Auto in der Waschanlage
ausgabeText = myWarteschlange.getAuto(0).getKfzKennzeichen();
ausgabeText = ausgabeText + " " + myWarteschlange.getAuto(0).getTyp();
ausgabeText = ausgabeText + " " +
myWarteschlange.getAuto(0).getWaschprogramm();
tfWaschanlage.setText(ausgabeText);
// Autos in Warteschlange
taWarteschlange.setText("");
for (int i = 1; i <= myWarteschlange.getAnzahlAutos(); i++) {
ausgabeText = myWarteschlange.getAuto(i).getKfzKennzeichen();
ausgabeText = ausgabeText + " " + myWarteschlange.getAuto(i).getTyp();
ausgabeText = ausgabeText + " " +
myWarteschlange.getAuto(i).getWaschprogramm();
taWarteschlange.append(ausgabeText + "\n");
}
}