Inhaltsverzeichnis
Umsetzung des Zustandsübergangsdiagramms als Java-Programm
Musteraufgabe 1: Fortsetzung des Kühlschrank-Projekts
(Quelle: Handreichung "Kompetenzorientierte Aufgaben für das Fach Informatik am Gymnasium" des ISB)
Erinnert Ihr Euch an Aufgabe 1 des vorherigen Kapitels?
Ein einfacher Kühlschrank besitzt einen Ein-Aus-Schalter, der jederzeit betätigt werden kann. Im eingeschalteten Zustand kann er auf die Kühlstufen 1, 2 oder 3 eingestellt werden. Dafür gibt es die Tasten ▲ zum Hochschalten und ▼ zum Herunterschalten der Kühlstufe. Nach dem Einschalten befindet sich der Kühlschrank immer auf Kühlstufe 2.
Wir haben bereits das Zustandsübergangsdiagramm gezeichnet, Ihr seht es rechts. Die Aufgabe geht nun weiter:
c) Implementieren Sie den Kühlschrank durch Definition einer geeigneten Klasse, wobei die möglichen Zustände des Kühlschranks durch die Attribute stufe
und eingeschaltet
und die auslösenden Aktionen durch die Methoden hochschalten()
, herunterschalten()
und einausschalten()
realisiert werden sollen.
Testen Sie Ihre Implementierung, indem Sie die Zustandsübergänge nach unterschiedlichen Methodenaufrufen mit dem Zustandsdiagramm vergleichen. Definieren Sie dazu eine Methode zustandAusgeben()
, die den Zustand des Kühlschranks auf dem Bildschirm ausgibt.
Lösung:
d) Alle Zustandsübergänge des Kühlschranks sollen nun anstatt mit drei Methoden wie in Teilaufgabe c mit einer einzigen Methode zustandWechseln(String aktion)
möglich sein, wobei die auslösende Aktion durch den Parameter aktion
(Datentyp: String
) übergeben wird. Implementieren Sie diese Methode.
Diskutieren Sie, welche Vor- und Nachteile die Realisierung der Zustandsübergänge mit nur einer Methode mit sich bringt.
e) Es ist möglich, den Kühlschrank mit einem einzigen Attribut zustand
vollständig zu beschreiben. Diskutieren Sie wie in Teilaufgabe d Vor- und Nachteile dieser Realisierung und passen Sie Ihre Implementierung entsprechend an.
Aufgabe 2: Umsetzung der Stoppuhr als Java-Projekt
Eine Stoppuhr hat die zwei Tasten s und r.
Nach dem Einschalten zeigt die Stoppuhr die Zeit 0 min 0 s, kurz: 00:00. Nach Drücken der Taste „s“ beginnt die Zeitmessung und die Uhr zeigt die abgelaufene Zeit an. Drückt man erneut die Taste „s“, so hält die Zeitmessung an, kann jedoch durch weiteren Druck auf „s“ fortgesetzt werden.
Ein Druck auf die Taste „r“ bewirkt jederzeit, dass die Zeitmessung angehalten und die Uhr auf 00:00 zurückgesetzt wird.
Hier ein mögliches Zustandsübergangsdiagramm:
Schreibe ausgehend von diesem Zustandsübergangsdiagramm die Klasse Stoppuhr. Dabei soll ihr Zustand durch ein Attribut zustand
gespeichert werden, das die Werte 1, 2 oder 3 annehmen kann, die den entsprechenden grün nummerierten Zuständen im Diagramm entsprechen. Für die auslösenden Aktionen soll je eine Methode vorgesehen werden, zusätzlich soll eine Methode zustandAusgeben
programmiert werden, die den Zustand ausgibt.
Bemerkung 1: Die eigentliche Funktion der Uhr (Zeit messen) soll nicht programmiert werden. Damit klar ist, was zu tun ist, hier ein kurzes Testprogramm zusammen mit seiner Ausgabe. Kopiere diese Anweisungen nach Erstellung der Klasse Stoppuhr an den Anfang Deines Programms, dann kannst Du auf einfach Art und Weise testen, ob alles funktioniert.
Stoppuhr s = new Stoppuhr(); s.schreibeZustand(); s.tasteSDrücken(); s.schreibeZustand(); s.tasteSDrücken(); s.schreibeZustand(); s.tasteSDrücken(); s.schreibeZustand(); s.tasteRDrücken(); s.schreibeZustand();
Ausgabe des Programms:
Bereit, 00:00 Uhr läuft Uhr angehalten Uhr läuft Bereit, 00:00
Aufgabe 3: Mikrowellenherd
Ein Mikrowellenherd besitzt eine Tür zum Öffnen und Schließen sowie einen Schalter zum Ein- und Ausschalten. Der Mikrowellenherd lässt sich bei geöffneter Türe nicht einschalten, zudem schaltet er sich sofort automatisch aus, wenn man die Türe im eingeschalteten Zustand öffnet. Zeichne ein Zustandsübergangsdiagramm und eine Zustandsübergangstabelle!
Tipps:
- Jeder Zustand des Mikrowellenherds umfasst sowohl den Zustand der Tür als auch die Information darüber, ob die Mikrowelle ein- oder ausgeschaltet ist. Der erste Zustand ist z.B. „Ausgeschaltet und offen“. Benenne am besten auch die anderen Zustände entsprechend.
- Auf die Pfeile des Zustandsübergangsdiagramms kann man hinter die auslösende Aktion auch noch eine Bedingung (die Voraussetzung für den Übergang ist) sowie eine ausgelöste Aktion schreiben. Letzteres ist bei dieser Aufgabe an einer Stelle sinnvoll.
(Am Beispiel des Buches einer Bibliothek könnte das etwa so aussehen wie im nachfolgenden Bild.)
Stoppuhr mit Zeitanzeige und Tastatursteuerung!
Aufgabe 4: Stoppuhr mit Zehntelsekundenanzeige und Zwischenzeitmessung
Jetzt bist Du dran! Erweitere das Stoppuhr-Programm folgendermaßen:
- Die Stoppuhr soll die verstrichene Zeit in Sekunden und Zehntelsekunden anzeigen. Die Anzeige 16:8 bedeutet also z.B. 16 s und 8 Zehntelsekunden.
- Die Stoppuhr soll über eine Funktion zur Zwischenzeitanzeige verfügen, die mit der Taste z bedient wird. Details dazu kannst Du dem um die Taste z erweiterten Zustandsübergangsdiagramm entnehmen.
Damit Du möglichst gut zurechtkommst, lege in Deiner Entwicklungsumgebung am besten einen neuen Workspace an und kopiere das obige Programm als Grundlage hinein. Bitte verwende nicht Deine eigene Lösung, da ich meine Lösung schon so optimiert habe, dass die Erweiterung möglichst einfach möglich ist. Gehe am besten wie folgt vor:
- Benenne das Attribut
sekunden
um inzehntelsekunden
. Das geht am einfachsten, indem Du den Cursor draufsetzt und die Taste F2 drückst („Rename“). - Ändere die Methode
act
so ab, dass die Variablezehntelsekunden
nicht jede Sekunde, sondern jede Zehntelsekunde um eins erhöht wird.
Tipp: Du musst nur eine einzige Zahl ändern! - Ändere die Methode
zeitausgeben
so ab, dass sie beispielsweise 123 Zehntelsekunden ausgibt als 12:3 (d.h. 12 Sekunden, 3 Zehntelsekunden).
Tipp: die 12 erhältst Du, indem Du die Zehntelsekunden ganzzahlig durch 10 teilst, die 3 ist der Rest beim Teilen von 123 durch 10 ( % - Operator!). - Teste Dein Programm!
- Schau' Dir das um die Taste z erweiterte Zustandsübergangsdiagramm genau an: Die blauen Teile müssen im Programm ergänzt werden.
- Schreibe die Methode
tasteZDrücken
und erweitere die MethodeonKeyDown
so, dass beim Drücken der Taste z die MethodetasteZDrücken
aufgerufen wird. - Obwohl auf den blauen Pfeilen auch vom Drücken der Tasten s und r die Rede ist, müssen die Methoden
tasteSDrücken
undtasteRDrücken
nicht mehr angepasst werden (glücklicher Zufall!). Überlege, warum das in diesem Fall so ist! - Teste Dein Programm abermals!
- Erweitere die Methode
schreibeZustand
so, dass im Zustand 4 ausgegeben wird: „Zwischenzeitanzeige!“. - Erweitere die Methode
TasteZDrücken
so, dass sie am Ende die MethodeschreibeZustand
aufruft. - Teste Dein Programm!
- Mach einen Rechtsklick auf den Dateinamen Deines Programms und wähle im Kontextmenü „Als Hausaufgabe markieren“.
- Fertig!