Kapitel 7: Zustandsdiagramme

Die Stoppuhr hat eine Taste S (Start/Stop) und eine Taste R (Reset).

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

Zustandsdiagramm der Stoppuhr

Umsetzung in einem Java-Programm

In der Variable zustand speichern wir, in welchem Zustand sich das Programm gerade befindet (siehe grüne Zahlen im Zustandsdiagramm).

import sge.*;
 
public class Stoppuhr implements TimerListener, TastaturListener {
 
    private Textfeld textfeld;
    private int minuten;
    private int sekunden;
 
    // 1: Bereit; 2: Zeitmessung; 3: Zeit angehalten
    private int zustand;
 
    public Stoppuhr() {
 
        textfeld = new Textfeld(50, 50, "Aus");
 
        // Das timer-Objekt sorgt dafür, dass die Methode timerSignalVerarbeiten()
        // 1-mal je Sekunde aufgerufen wird:
        Timer timer = new Timer(this, 1000);
        timer.start();
 
        // Wir sagen dem Fenster, dass es bei jedem Tastendruck
        // unsere Methode tasteGedrueckt aufrufen soll:
        Fenster.getInstance().addTastaturListener(this);
 
        minuten = 0;
        sekunden = 0;
 
        zustand = 1;
 
    }
 
 
    @Override
    public void timerSignalVerarbeiten() {
        if (zustand == 2) {
            sekunden++;
            if (sekunden == 60) {
                sekunden = 0;
                minuten++;
            }
 
        }
 
        ausgabe();
 
    }
 
    private void ausgabe(){
        textfeld.setText("" + minuten + ":" + sekunden + "    Zustand: " + zustand);
    }
 
    @Override
    public void tasteGedrueckt(char zeichen, int keyCode) {
 
        if(zeichen == 'r'){
            reset();
        }
 
        if(zeichen == 's'){
            if(zustand == 1 || zustand == 3){
                start();
            } else if(zustand == 2){
                stop();
            }
        }
 
        ausgabe();
 
    }
 
    private void start(){
        zustand = 2;
    }
 
    private void stop(){
        zustand = 3;
    }
 
    private void reset(){
        zustand = 1;
        sekunden = 0;
        minuten = 0;
    }
 
}

Zum Starten benötigen wir noch eine kleine Starterklasse:

public class StoppuhrStarter {
 
    public static void main(String[] args) {
        Stoppuhr stoppuhr = new Stoppuhr();
    }
 
}

Aufgabe: Taster zur Anzeige der Zwischenzeit

Die Stoppuhr erhält eine weitere Taste Z („Zwischenzeit“), mit der man die Anzeige anhalten kann, während die Uhr im Hintergrund weiterläuft. Erweitere sowohl das Zustandsdiagramm (mit Bleistift) als auch das Programm entsprechend!

Lösung:

Hier die ergänzte Stoppuhr-Klasse:

import sge.*;
 
public class Stoppuhr implements TimerListener, TastaturListener {
 
    private Textfeld textfeld;
    private int minuten;
    private int sekunden;
 
    // 1: Bereit; 2: Zeitmessung; 3: Zeit angehalten
    private int zustand;
 
    public Stoppuhr() {
 
        textfeld = new Textfeld(50, 50, "Aus");
 
        // Das timer-Objekt sorgt dafür, dass die Methode timerSignalVerarbeiten()
        // 1-mal je Sekunde aufgerufen wird:
        Timer timer = new Timer(this, 1000);
        timer.start();
 
        // Wir sagen dem Fenster, dass es bei jedem Tastendruck
        // unsere Methode tasteGedrueckt aufrufen soll:
        Fenster.getInstance().addTastaturListener(this);
 
        minuten = 0;
        sekunden = 0;
 
        zustand = 1;
 
    }
 
 
    @Override
    public void timerSignalVerarbeiten() {
        if (zustand == 2 || zustand == 4) {
            sekunden++;
            if (sekunden == 60) {
                sekunden = 0;
                minuten++;
            }
 
        }
 
        if(zustand != 4) {
            ausgabe();
        }
 
    }
 
    private void ausgabe(){
        textfeld.setText("" + minuten + ":" + sekunden + "    Zustand: " + zustand);
    }
 
    @Override
    public void tasteGedrueckt(char zeichen, int keyCode) {
 
        if(zeichen == 'r'){
            reset();
        }
 
        if(zeichen == 's'){
            if(zustand == 1 || zustand == 3){
                start();
            } else if(zustand == 2){
                stop();
            }
        }
 
        if(zeichen == 'z'){
            if(zustand == 2){
                zwischenzeit();
            } else if(zustand == 4){
                start();
            }
        }
 
 
        ausgabe();
 
    }
 
    private void start(){
        zustand = 2;
    }
 
    private void stop(){
        zustand = 3;
    }
 
    private void reset(){
        zustand = 1;
        sekunden = 0;
        minuten = 0;
    }
 
    private void zwischenzeit(){
        zustand = 4;
    }
 
}

Aufgaben

Aufgabe 1: Aggregatszustände von Wasser

Wasser kann drei Aggregatszustände annehen. Zeichne ein Zustandsdiagramm!
Lösung:

Aufgabe 2: Blog

Ein Blog kennt zwei Arten von Benutzern: Redakteure und Administratoren. Redakteure können Artikel erstellen und erstellte Artikel überarbeiten. Ist ein Artikel fertig, können sie ihn zur Veröffentlichung einreichen. Administratoren können eingereichte Artikel veröffentlichen oder die Veröffentlichung ablehnen.
Erstelle ein Zustandsdiagramm!
Lösung:

Aufgabe 3: Die Operatoren = und ==

Erkläre den Unterschied zwischen den Operatoren = und ==
Lösung:
Der Operator = (Wertzuweisungsoper) dient dazu, Variablen Werte zuzuweisen, z.B.

  int a = 10;
  a = a * 20;

In der ersten Anweisung wird der Variablen a der Wert 10 zugewiesen. Bei der zweiten Anweisung wird zunächst der Term rechts vom Operator = ausgewertet. Seit Wert beträgt 200. Danach wird dieser Wert der Variablen a zugewiesen, so dass sie am Ende den Wert 200 enthält.

Der Operator == (Vergleichsoperator) dient dem Vergleich zweier Terme und liefert als Ergebnis eine Wahrheitswert (also true oder false). Beispiel:

  if(b == 10){
    System.out.println("b enthält den Wert 10.");
  } else {
    System.out.println("b enthält nicht den Wert 10.");
  }

Aufgabe 4: Logische Operatoren

Java kennt die logischen Operatoren && (und), || (oder) und ! (nicht). Erkläre, was die folgende Anweisung bewirkt:

if(!(alter >= 16 && geschlecht == ‘ m‘) || alter > 30){
	versicherungsbeitrag = 150;
} else {
	versicherungsbeitrag = 100;
}


Lösung:
Die Anweisung bewirkt, dass Männer im Alter von 16 bis 29 Jahren einen Versicherungsbeitrag von 150 € zahlen müssen, alle anderen Menschen nur 100 €.

Aufgabe 5: Seltsamer Automat 1

Eine Maschine besitzt zwei Tasten a und b, mit denen man Wörter eingeben kann, sowie eine Lampe, die rot, blau, gelb oder grün leuchtet. Unten siehst Du das Zustandsdiagramm der Maschine.
Erkläre, bei welchen Wörtern die Lampe grün leuchtet!


Lösung:
Die Lampe leuchtet bei genau den Wörtern grün, die mit „aba“ enden.

Aufgabe 5: Seltsamer Automat 2

Zeichne das Zustandsdiagramm einer Maschine wie bei Aufgabe 5, deren Licht genau dann grün leuchtet, wenn das Wort mit einer geraden Anzahl von a‘s endet.
Lösung:

Drucken/exportieren
QR-Code
QR-Code schule:klassen:2017:10b:kap7 (erstellt für aktuelle Seite)