Übung - Autowaschanlage der Tankstelle "OSSE"

Aus Informatik
Wechseln zu: Navigation, Suche

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.

  1. Stellen Sie zu dem gegebenen Problem ein (geeignetes) Pflichtenheft auf. Suchen Sie sich dafür notwendige und sinnvolle Eigenschaften für die Klasse Auto
  2. Modellieren Sie eine geeignete Klasse Auto.
  3. Modellieren Sie eine geeignete Klasse Warteschlange. (Verwenden Sie zum Verwalten der gewünschten Anzahl an Autos eine geeignete Datenstruktur.)
  4. Testen Sie ihren Entwurf mit Hilfe des Java-Editors.
  5. Modellieren und Implementieren Sie eine Klasse WarteschlangeGUI, die für das gegebene Problem ein Java-Programm als Lösung anbietet.


Pflichtenheft

  1. Zu einem Auto werden Kfz-Kennzeichen, Autotyp und das gewünschte Waschprogramm erfasst.
  2. Autos werden entweder mit dem Waschprogramm oder mit allen Daten erfasst.
  3. Autos können sich in die Warteschlange einreihen.
  4. Autos können sich (von vorderster Stelle) aus der Schlange entfernen (, um in die Anlage einzufahren).
  5. Die Warteschlange wird ohne Werte erzeugt und umfasst maximal 10 Autos.


Fachklasse Auto

Nach den Festlegungen des Pflichtenheftes ist folgende Klasse Auto möglich:

KlasseAutoOSSE.png


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).

KlasseWarteschlangeOSSE.png

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:

GUIWaschanlageOSSE.png


Die zugehörige Klasse WarteschlangeGUI könnte dann folgendermaßen aussehen:

KlasseWarteschlangeGUIOSSE.png

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