MINT lernen

Abituraufgaben: Implementieren

Zahlen in der Tabellenkalkulation, Preise an der Kiosk-Kasse — hier werden die Automaten zu Java-Klassen.

Dein Fortschritt:
0 / 0 Aufgaben
1

Die Zahleneingabe

14 BEAFB I–II

Eine Tabellenkalkulation prüft Eingaben in Zellen, die nur ganze Zahlen enthalten dürfen: optional ein Vorzeichen + oder -, danach mindestens eine Ziffer, ohne führende Nullen. Die Zahl 0 selbst ist erlaubt, -0 und +0 nicht. Die Abbildung zeigt den zugehörigen DEA.

DEA für ganze Zahlen
z0z1z2z3+, −01–91–90–9
Nicht eingezeichnete Übergänge führen in den Fehlerzustand zF.
  1. Stellen Sie die Verarbeitung der Eingaben -120 und +05 jeweils in einer Tracetabelle dar, die nach jedem Zeichen den Wert des Zustands angibt. (4 BE)
  2. Implementieren Sie eine Klasse GanzeZahl in einer objektorientierten Programmiersprache. Sie soll den aktuellen Zustand in einem Attribut speichern, eine Methode uebergang besitzen, die für ein übergebenes Zeichen genau einen Zustandswechsel ausführt, und eine Methode akzeptiert, die für ein übergebenes Wort zurückgibt, ob es akzeptiert wird. (7 BE)
  3. Erklären Sie, warum z1 kein Endzustand ist und warum im Zustand z2 jedes weitere Zeichen in den Fehlerzustand führt. (3 BE)

Hinweise

Hinweis zu Aufgabe a)
Eine Spalte je gelesenem Zeichen, die erste Spalte ist der Startzustand. Ist zF erreicht, bleibt der Automat dort.
Hinweis zu Aufgabe b)
Kodieren Sie die Zustände als Zahlen (z. B. zF = 4). Nutzen Sie switch über den Zustand; eine Ziffer erkennt man an c >= '0' && c <= '9'. Vergessen Sie nicht, den Startzustand in akzeptiert zu setzen.
Hinweis zu Aufgabe c)
Welche Eingabe endet in z1? Welche Eingaben beginnen mit 0 und haben weitere Zeichen?

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)
gelesenes Zeichen—-120
zustandz0z1z3z3z3
gelesenes Zeichen—+05
zustandz0z1zFzF

-120 endet im Endzustand z3 und wird akzeptiert; +05 gerät mit der führenden 0 nach zF und wird abgelehnt.

Erwartungshorizont zu Aufgabe b)
Java · Klasse GanzeZahl
public class GanzeZahl {
    private int zustand;   // 0 = z0, 1 = z1, 2 = z2, 3 = z3, 4 = zF

    public void uebergang(char c) {
        boolean ziffer = c >= '0' && c <= '9';
        switch (zustand) {
            case 0:
                if (c == '+' || c == '-') { zustand = 1; }
                else if (c == '0') { zustand = 2; }
                else if (ziffer) { zustand = 3; }
                else { zustand = 4; }
                break;
            case 1:
                if (ziffer && c != '0') { zustand = 3; }
                else { zustand = 4; }
                break;
            case 3:
                if (ziffer) { zustand = 3; }
                else { zustand = 4; }
                break;
            default:              // z2 und zF: jedes weitere Zeichen ist ein Fehler
                zustand = 4;
        }
    }

    public boolean akzeptiert(String wort) {
        zustand = 0;
        for (int i = 0; i < wort.length(); i++) {
            uebergang(wort.charAt(i));
        }
        return zustand == 2 || zustand == 3;
    }
}

Bewertet werden: Zustandskodierung, vollständige Fallunterscheidung einschließlich zF, Zurücksetzen des Zustands, Schleife über alle Zeichen, Prüfung auf Endzustand. Gleichwertige Lösungen (z. B. mit if-Kaskade oder Konstanten) sind zulässig.

Erwartungshorizont zu Aufgabe c)

In z1 wurde nur ein Vorzeichen gelesen. Eine Eingabe wie - ist keine Zahl — z1 darf daher kein Endzustand sein.

z2 bedeutet „die Eingabe ist genau 0“. Jede weitere Ziffer wäre eine führende Null (z. B. 07), jedes andere Zeichen ist ohnehin ungültig. Keine Fortsetzung kann mehr zu einer gültigen Zahl führen, deshalb geht es nach zF.

2

Die Preis-Eingabe

18 BEAFB II–III

Das Kassensystem eines Schulkiosks prüft eingegebene Preise mit einem Automaten, dessen Übergangstabelle als zweidimensionales Feld delta gespeichert ist. Die Zustände sind durch die Zahlen 0 bis 5 kodiert, Startzustand ist 0. Die Hilfsmethode spalte(c) liefert 0 für eine Ziffer, 1 für ein Komma und −1 für jedes andere Zeichen.

Zeile (Zustand)Spalte 0Spalte 1
015
112
235
345
455
555
Pseudocode · Methode akzeptiert
akzeptiert(wort):
    zustand ← 0
    für jedes Zeichen c von wort, von links nach rechts:
        s ← spalte(c)
        falls s = −1: gib falsch zurück
        zustand ← delta[zustand][s]
    gib (zustand = 1 oder zustand = 4) zurück
  1. Analysieren Sie, welche der Eingaben 12,50, 0,5, ,99, 7, 3,141 akzeptiert werden, und beschreiben Sie die akzeptierten Eingaben allgemein. (4 BE)
  2. Zeichnen Sie den Zustandsgraphen, der durch delta und die Endzustände festgelegt ist. (4 BE)
  3. Für Stornobuchungen sollen auch negative Preise wie -2,50 eingegeben werden können; das Minuszeichen darf nur ganz am Anfang stehen. Erweitern Sie das Verfahren entsprechend und geben Sie eine vollständige Klasse in einer objektorientierten Programmiersprache an. (6 BE)
  4. Ein Mitschüler meint: „Die Tabellenversion ist immer besser als eine Version, die die Übergänge mit Fallunterscheidungen (z. B. switch) programmiert.“ Bewerten Sie diese Aussage anhand geeigneter Kriterien. (4 BE)

Hinweise

Hinweis zu Aufgabe a)
Übersetzen Sie jedes Zeichen mit spalte in 0 oder 1 und lesen Sie in delta Schritt für Schritt ab. Die Endzustände stehen in der letzten Zeile des Pseudocodes.
Hinweis zu Aufgabe b)
Zeile = aktueller Zustand, Spalte 0 = Ziffer, Spalte 1 = Komma, Eintrag = Folgezustand. Endzustände: 1 und 4.
Hinweis zu Aufgabe c)
Das Minus braucht eine eigene Spalte und einen neuen Zustand „Minus gelesen“, der kein Endzustand ist. Hängen Sie ihn als Zeile 6 an, dann bleiben alle alten Nummern gültig.
Hinweis zu Aufgabe d)
Mögliche Kriterien: Änderbarkeit, Lesbarkeit, Fehleranfälligkeit, Umgang mit Zeichenklassen, Größe des Automaten.

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)
Eingabeletzter ZustandErgebnis
12,50z4akzeptiert
0,5z3abgelehnt
,99z5 (zF)abgelehnt
7z1akzeptiert
3,141z5 (zF)abgelehnt

Akzeptiert werden Eingaben aus mindestens einer Ziffer, optional gefolgt von einem Komma und genau zwei Ziffern (Cent), z. B. 7 oder 12,50. Zustand 5 ist der Fehlerzustand; Zeichen außerhalb von Ziffern und Komma beenden die Prüfung sofort mit „falsch“.

Erwartungshorizont zu Aufgabe b)
Lösung: Zustandsgraph der Preis-Eingabe
z0z1z2z3z4ZifferZifferKommaZifferZiffer
Nicht eingezeichnete Übergänge führen in den Fehlerzustand z5.

Der Fehlerzustand z5 darf mit Vermerk weggelassen werden.

Erwartungshorizont zu Aufgabe c)
Java · Klasse PreisMinus
public class PreisMinus {
    private int zustand;
    //                          Ziffer Komma Minus
    private int[][] delta = { {1, 5, 6},     // z0
                              {1, 2, 5},     // z1
                              {3, 5, 5},     // z2
                              {4, 5, 5},     // z3
                              {5, 5, 5},     // z4
                              {5, 5, 5},     // z5 = zF
                              {1, 5, 5} };   // z6: Minus gelesen

    private int spalte(char c) {
        if (c >= '0' && c <= '9') { return 0; }
        if (c == ',') { return 1; }
        if (c == '-') { return 2; }
        return -1;
    }

    public boolean akzeptiert(String wort) {
        zustand = 0;
        for (int i = 0; i < wort.length(); i++) {
            int s = spalte(wort.charAt(i));
            if (s == -1) { return false; }
            zustand = delta[zustand][s];
        }
        return zustand == 1 || zustand == 4;
    }
}

Neu gegenüber dem Pseudocode sind nur die dritte Spalte (Minus), die Zeile 6 und der Fall '-' in spalte; akzeptiert entspricht dem Pseudocode. Zustand 6 bedeutet „Minus gelesen“; nur eine Ziffer führt weiter nach 1. Ein Minus an anderer Stelle führt nach 5 (zF).

Erwartungshorizont zu Aufgabe d)
  • Änderbarkeit: Für einen anderen Automaten tauscht man nur Tabelle, spalte und Endzustände aus; die Methoden bleiben gleich (siehe Teilaufgabe c) — Vorteil Tabelle.
  • Lesbarkeit: Die Zahlen in delta sind ohne Kommentare kaum verständlich; ein switch mit sprechenden Bedingungen ist für kleine Automaten leichter nachzuvollziehen.
  • Fehleranfälligkeit: Ein einzelner falscher Tabelleneintrag fällt schwer auf; dafür erzwingt die Tabelle Vollständigkeit (jedes Feld braucht einen Wert).
  • Zeichenklassen: Die Tabelle braucht eine Übersetzung in Spalten, der switch kann Bedingungen wie „Ziffer außer 0“ direkt formulieren.

Urteil: „Immer besser“ ist zu pauschal. Bei großen oder häufig geänderten Automaten ist die Tabelle überlegen, bei kleinen Automaten mit wenigen Sonderfällen ist ein switch oft verständlicher.