fiebig.schule

03 Automaten in Java

🟪 Codeanalyse

👾 Codebeispiel

Gegeben ist die folgende Methode, die einen einfachen DEA mit Zustandsmenge Q = { q 0 , q 1 , q 2 } Q = \{ q_0, q_1, q_2 \} über dem Alphabet A = { x , y } A = \{ x, y \} implementiert.

EinfacherDEA.java
    public boolean pruefeWort(String wort) {
        int aktuellerZustand = 0;
        int akzeptierenderZustand = 2;
 
        for (int i = 0; i < wort.length(); i++) {
            char c = wort.charAt(i);
            if (aktuellerZustand == 0) {
                if (c == 'x')
                    aktuellerZustand = 1;
                else if (c == 'y')
                    aktuellerZustand = 0;
                else
                    aktuellerZustand = -1;
            } else if (aktuellerZustand == 1) {
                if (c == 'x')
                    aktuellerZustand = 1;
                else if (c == 'y')
                    aktuellerZustand = 2;
                else
                    aktuellerZustand = -1;
            } else if (aktuellerZustand == 2) {
                if (c == 'x')
                    aktuellerZustand = 1;
                else if (c == 'y')
                    aktuellerZustand = 0;
                else
                    aktuellerZustand = -1;
            }
            else 
                break;
        }
 
        if (aktuellerZustand == akzeptierenderZustand)
            return true;
        else
            return false;
    }

🌱 Aufgaben | Erkundung des Codebeispiels

  1. 👤 Führe die Methode in einer Entwicklungsumgebung deiner Wahl für verschiedenen Eingaben aus.
  2. 👤 Notiere einen das Zustandsübergangsdiagramm des Automaten und die vom Automaten akzeptierte Sprache L L .
  3. 👤 Notiere die zwei String-Methoden, die in der Methode verwendet werden.

🤨 Achtung: Verwechslungsgefahr

  • Die Methode int length() (mit Klammern!) ist eine Methode der Klasse String und gibt die Anzahl der Zeichen eines Strings zurück.
  • Mit length(ohne Klammern!) wird die Länge eines Arrays abgefragt. Dies ist ein öffentliches Attribut und keine Methode.
  • Mit der Methode size() kann in manchen Java-Klassen wie etwa ArrayList die Anzahl der von der Datenstruktur verwalteten Objekte abgefragt werden.

☝️ Hinweise

  • Das Schlüselwort break sorgt dafür, dass die Schleife verlassen wird. Das tritt ein, sobald die Zustandsabfolge in einen ungültigen Zustand ( 1 -1 ) wechselt.
  • Bestehen die if- und else-Zweige einer Verzweigung lediglich aus einer Anweisung, können die geschweiften Klammern weggelassen werden.
  • Statt Zeile 33-36 kann man auch die Kurzschribweise return aktuellerZustand == akzeptierenderZustand verwenden.

🟦 Fallunterscheidungen mit Mehrfachverzweigungen

🌱 Aufgaben | Erweiterung mit Switch-Case

  1. 👤 Bearbeite die Übungsaufgaben zu Switch-Case.
  2. 👤 Erweitere die bisherige DEA-Implementierung um Switch-Case-Anweisungen zur Unterscheidung des aktuellen Zustands.
  3. 👤 Erweitere die Implementierung nun um Switch-Case-Anweisungen zur Unterscheidung des aktuellen Eingabezeichens.

🏃‍♀️ Extras

  • Man könnte sich überlegen, die Zustände mit Hilfe von Enums zu realisieren; für unsere Fälle reichen durchnummierete Zustände in einer Ganzzahlvariable gespeichert vollkommen aus.
  • Implementiere mit Hilfe der Klasse Stack einen einfachen Kellerautomaten!