MINT üben

Automaten implementieren

Dreißig Übungen zu switch, int[][] delta und Tracetabellen — vom Zuordnen bis zur Fehlersuche im Code.

Dein Fortschritt:
0 / 0 Aufgaben
1

Übungsaufgaben

Dreißig Übungen zum Klicken, Zuordnen, Nachverfolgen und Knobeln — von AFB I bis AFB III. Jede Übung gibt sofort Rückmeldung; wenn Sie nicht weiterkommen, helfen die gestuften Tipps.

A1
Was macht welche Zeile?
AFB I

Jede Java-Zeile einer Automaten-Klasse setzt einen Teil des Modells um. Ordnen Sie jedem Code-Baustein seine Aufgabe im Automaten zu.

Ansatz: Suchen Sie zuerst die beiden Zeilen mit return: Eine davon steht in spalte, die andere am Ende von akzeptiert.
Weiter: Das Feld delta ist die Übergangstabelle: Zeile = Zustand, Spalte = Zeichen, Eintrag = Folgezustand.
A2
Codelücken: durch 3 teilbar
AFB I

Ein DEA über Σ = {0, 1} akzeptiert genau die Binärzahlen, die durch 3 teilbar sind. Zustand zr bedeutet: Die bisher gelesene Zahl lässt beim Teilen durch 3 den Rest r. Zeichen außerhalb von Σ führen in den nicht eingetragenen Fehlerzustand zF.

Übergangstabelle DurchDrei
Zustand01
z0z0z1
z1z2z0
z2z1z2

Geben Sie für jede Lücke der Java-Klasse den passenden Eintrag an.

Wählen Sie in jedem Menü den passenden Eintrag und prüfen Sie dann alle auf einmal.
Java · Klasse DurchDrei
public class DurchDrei {
    private int zustand;        // 0 = z0, 1 = z1, 2 = z2, 3 = zF

    public void uebergang(char c) {
        switch (zustand) {
            case 0:
                if (c == '0') { zustand = 0; }
                else if (c == '1') { zustand = ; }
                else { zustand = 3; }
                break;
            case 1:
                if (c == '0') { zustand = ; }
                else if (c == '1') { zustand = ; }
                else { zustand = 3; }
                break;
            case 2:
                if (c == '0') { zustand = ; }
                else if (c == '1') { zustand = 2; }
                else { zustand = 3; }
                break;
            default:
                zustand = ;
        }
    }

    public boolean akzeptiert(String wort) {
        zustand = 0;
        for (int i = 0; i < wort.length(); i++) {
            uebergang(wort.charAt(i));
        }
        return ;
    }
}
Aus der Tabelle: z0 –1→ z1, z1 –0→ z2, z1 –1→ z0, z2 –0→ z1. Typischer Fehler ist die Endzustandsprüfung zustand != 3: Sie akzeptiert jede gültige Binärzahl, nicht nur die durch 3 teilbaren. Endzustand ist allein z0 (Rest 0) — deshalb wird auch das leere Wort akzeptiert. Im default-Zweig bleibt zF zF: kein Weg zurück.
Ansatz: Lesen Sie jede Lücke als Tabellenfeld: Zeile = case, Spalte = das Zeichen im if.
Weiter: Endzustand ist nur der Zustand mit Doppelunterstrich in der Tabelle: z0, also Rest 0.
A3
Wie oft läuft uebergang?
AFB II

Ein DEA über {0, 1} erlaubt keine zwei Einsen hintereinander: z0 (Start, letztes Zeichen keine 1) und z1 (letztes Zeichen eine 1) sind Endzustände, eine zweite 1 in Folge führt aus z1 nach zF = 2, ebenso jedes Zeichen außerhalb von {0, 1}. Die Methode akzeptiert bricht ab, sobald der Fehlerzustand erreicht ist:

Java · Rumpf von akzeptiert
zustand = 0;
int n = wort.length();
for (int i = 0; i < n; i++) {
  uebergang(wort.charAt(i));
  if (zustand == 2) {
    return false;
  }
}
return true;

Eine Kollegin behauptet, die Wörter 110101, 1010100 und 0x01 lösten zusammen genau 11 Aufrufe von uebergang aus. Bestätigen Sie die Zahl, indem Sie für jedes Wort einzeln zählen.

Aufrufe
Aufrufe
Aufrufe
Aufrufe
Zählen Sie nicht einfach die Zeichen: Verfolgen Sie den Zustand und prüfen Sie nach jedem Aufruf, ob die Abbruchbedingung schon zutrifft.
Die Abfrage steht hinter dem Aufruf von uebergang: Das Zeichen, das zF auslöst, wird noch verarbeitet und zählt mit. Danach folgt kein weiteres Zeichen.