states:zut_to_java:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | states:zut_to_java:start [2024/08/31 12:03] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Umsetzung des Zustandsübergangsdiagramms als Java-Programm ====== | ||
+ | {{ : | ||
+ | ===== Musteraufgabe 1: Fortsetzung des Kühlschrank-Projekts ===== | ||
+ | (Quelle: Handreichung [[https:// | ||
+ | Erinnert Ihr Euch an [[: | ||
+ | Ein einfacher Kühlschrank besitzt einen Ein-Aus-Schalter, | ||
+ | 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 '' | ||
+ | Testen Sie Ihre Implementierung, | ||
+ | < | ||
+ | <div style=" | ||
+ | </ | ||
+ | **Lösung: | ||
+ | {{ youtube> | ||
+ | < | ||
+ | <div class=" | ||
+ | <script type=" | ||
+ | Kühlschrank k = new Kühlschrank(); | ||
+ | k.zustandAusgeben(); | ||
+ | k.einausschalten(); | ||
+ | k.zustandAusgeben(); | ||
+ | k.hochschalten(); | ||
+ | k.zustandAusgeben(); | ||
+ | k.herunterschalten(); | ||
+ | k.herunterschalten(); | ||
+ | k.herunterschalten(); | ||
+ | k.zustandAusgeben(); | ||
+ | class Kühlschrank { | ||
+ | |||
+ | int stufe; | ||
+ | | ||
+ | |||
+ | /** | ||
+ | * Im Konstruktor wird der Startzustand gesetzt: | ||
+ | */ | ||
+ | | ||
+ | eingeschaltet = false; | ||
+ | } | ||
+ | |||
+ | void hochschalten() { | ||
+ | if(eingeschaltet) { // if(eingeschaltet){...} bewirkt dasselbe wie if(eingeschaltet == true){...} | ||
+ | | ||
+ | stufe++; | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void herunterschalten() { | ||
+ | if(eingeschaltet) { // if(eingeschaltet){...} bewirkt dasselbe wie if(eingeschaltet == true){...} | ||
+ | | ||
+ | stufe--; | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void einausschalten() { | ||
+ | if(eingeschaltet) { | ||
+ | | ||
+ | } else { | ||
+ | | ||
+ | stufe = 2; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void zustandAusgeben() { | ||
+ | print(" | ||
+ | if(eingeschaltet) { | ||
+ | | ||
+ | } else { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | | ||
+ | **d)** Alle Zustandsübergänge des Kühlschranks sollen nun anstatt mit drei Methoden wie in Teilaufgabe c **mit einer einzigen** Methode '' | ||
+ | Diskutieren Sie, welche Vor- und Nachteile die Realisierung der Zustandsübergänge mit nur einer Methode mit sich bringt. \\ \\ | ||
+ | |||
+ | {{ youtube> | ||
+ | | ||
+ | < | ||
+ | <div class=" | ||
+ | <script type=" | ||
+ | Kühlschrank k = new Kühlschrank(); | ||
+ | |||
+ | k.zustandAusgeben(); | ||
+ | k.zustandWechseln(" | ||
+ | k.zustandAusgeben(); | ||
+ | k.zustandWechseln(" | ||
+ | k.zustandAusgeben(); | ||
+ | k.zustandWechseln(" | ||
+ | k.zustandAusgeben(); | ||
+ | k.zustandWechseln(" | ||
+ | k.zustandAusgeben(); | ||
+ | k.zustandWechseln(" | ||
+ | k.zustandAusgeben(); | ||
+ | |||
+ | |||
+ | |||
+ | class Kühlschrank { | ||
+ | |||
+ | int stufe; | ||
+ | | ||
+ | |||
+ | |||
+ | | ||
+ | | ||
+ | eingeschaltet = false; | ||
+ | |||
+ | } | ||
+ | |||
+ | void zustandAusgeben() { | ||
+ | print(" | ||
+ | if(eingeschaltet) { | ||
+ | | ||
+ | } else { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | /** | ||
+ | * aktion == " | ||
+ | * aktion == " | ||
+ | * aktion == " | ||
+ | */ | ||
+ | void zustandWechseln(String aktion) { | ||
+ | if(aktion == " | ||
+ | | ||
+ | if(stufe == 1 || stufe == 2) { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | } else if(aktion == " | ||
+ | | ||
+ | if(stufe == 2 || stufe == 3) { | ||
+ | | ||
+ | } | ||
+ | | ||
+ | } else if(aktion == " | ||
+ | | ||
+ | eingeschaltet = false; | ||
+ | } else { | ||
+ | eingeschaltet = true; | ||
+ | stufe = 2; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | \\ \\ | ||
+ | **e)** Es ist möglich, den Kühlschrank mit einem einzigen Attribut '' | ||
+ | |||
+ | |||
+ | < | ||
+ | <div class=" | ||
+ | <script type=" | ||
+ | Kühlschrank k = new Kühlschrank(); | ||
+ | |||
+ | k.zustandAusgeben(); | ||
+ | k.zustandWechseln(" | ||
+ | k.zustandAusgeben(); | ||
+ | k.zustandWechseln(" | ||
+ | k.zustandAusgeben(); | ||
+ | k.zustandWechseln(" | ||
+ | k.zustandAusgeben(); | ||
+ | k.zustandWechseln(" | ||
+ | k.zustandAusgeben(); | ||
+ | k.zustandWechseln(" | ||
+ | k.zustandAusgeben(); | ||
+ | |||
+ | |||
+ | |||
+ | class Kühlschrank { | ||
+ | |||
+ | int zustand; | ||
+ | |||
+ | |||
+ | | ||
+ | | ||
+ | zustand = 0; | ||
+ | |||
+ | } | ||
+ | |||
+ | void zustandAusgeben() { | ||
+ | print(" | ||
+ | if(zustand > 0) { | ||
+ | | ||
+ | } else { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | /** | ||
+ | * aktion == " | ||
+ | * aktion == " | ||
+ | * aktion == " | ||
+ | */ | ||
+ | void zustandWechseln(String aktion) { | ||
+ | if(aktion == " | ||
+ | | ||
+ | if(zustand == 1 || zustand == 2) { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | } else if(aktion == " | ||
+ | | ||
+ | if(zustand == 2 || zustand == 3) { | ||
+ | | ||
+ | } | ||
+ | | ||
+ | } else if(aktion == " | ||
+ | | ||
+ | zustand = 0; | ||
+ | } else { | ||
+ | zustand = 2; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | | ||
+ | |||
+ | ===== 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 '' | ||
+ | **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.** | ||
+ | <code myJava> | ||
+ | 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 | ||
+ | </ | ||
+ | \\ \\ | ||
+ | [[.stoppuhr_java: | ||
+ | |||
+ | ===== 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, | ||
+ | **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. " | ||
+ | * 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.)// | ||
+ | {{ : | ||
+ | |||
+ | [[.mikrowelle: | ||
+ | |||
+ | ===== Stoppuhr mit Zeitanzeige und Tastatursteuerung! ===== | ||
+ | |||
+ | {{ youtube> | ||
+ | |||
+ | < | ||
+ | <div class=" | ||
+ | <script type=" | ||
+ | Stoppuhr s = new Stoppuhr(); | ||
+ | |||
+ | class Stoppuhr extends Actor { | ||
+ | |||
+ | int zustand; | ||
+ | |||
+ | int zähler = 0; | ||
+ | int sekunden = 0; | ||
+ | |||
+ | Text ausgabe; | ||
+ | |||
+ | | ||
+ | | ||
+ | super(); | ||
+ | | ||
+ | println(" | ||
+ | | ||
+ | zustand = 1; | ||
+ | ausgabe = new Text(400, 300, 64, "" | ||
+ | ausgabe.setAlignment(Alignment.center); | ||
+ | | ||
+ | zeitausgeben(); | ||
+ | | ||
+ | schreibeZustand(); | ||
+ | } | ||
+ | |||
+ | | ||
+ | if(key == " | ||
+ | | ||
+ | } | ||
+ | if(key == " | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | | ||
+ | if(zustand == 2) { | ||
+ | | ||
+ | | ||
+ | zähler = 0; | ||
+ | sekunden++; | ||
+ | zeitausgeben(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void zeitausgeben() { | ||
+ | ausgabe.setText(sekunden); | ||
+ | | ||
+ | } | ||
+ | |||
+ | void tasteSDrücken() { | ||
+ | if(zustand < 3) { | ||
+ | | ||
+ | } else { | ||
+ | | ||
+ | } | ||
+ | schreibeZustand(); | ||
+ | } | ||
+ | |||
+ | void tasteRDrücken() { | ||
+ | zustand = 1; | ||
+ | sekunden = 0; | ||
+ | zeitausgeben(); | ||
+ | schreibeZustand(); | ||
+ | } | ||
+ | |||
+ | void schreibeZustand() { | ||
+ | if(zustand == 1) { | ||
+ | | ||
+ | } else if(zustand == 2) { | ||
+ | | ||
+ | } else if(zustand == 3) { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ===== 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 [[: | ||
+ | |||
+ | Damit Du möglichst gut zurechtkommst, | ||
+ | |||
+ | - Benenne das Attribut '' | ||
+ | - Ändere die Methode '' | ||
+ | - Ändere die Methode '' | ||
+ | - Teste Dein Programm! | ||
+ | - Schau' Dir das [[: | ||
+ | - Schreibe die Methode '' | ||
+ | - Obwohl auf den blauen Pfeilen auch vom Drücken der Tasten s und r die Rede ist, müssen die Methoden '' | ||
+ | - Teste Dein Programm abermals! | ||
+ | - Erweitere die Methode '' | ||
+ | - Erweitere die Methode '' | ||
+ | - Teste Dein Programm! | ||
+ | - Mach einen Rechtsklick auf den Dateinamen Deines Programms und wähle im Kontextmenü "Als Hausaufgabe markieren" | ||
+ | - Fertig! | ||
+ | |||
+ | [[.zehntelsekundenloesung: |