Die Zahleneingabe
14 BEAFB I–IIEine 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.
- Stellen Sie die Verarbeitung der Eingaben
-120und+05jeweils in einer Tracetabelle dar, die nach jedem Zeichen den Wert des Zustands angibt. (4 BE) - Implementieren Sie eine Klasse
GanzeZahlin einer objektorientierten Programmiersprache. Sie soll den aktuellen Zustand in einem Attribut speichern, eine Methodeuebergangbesitzen, die für ein übergebenes Zeichen genau einen Zustandswechsel ausführt, und eine Methodeakzeptiert, die für ein übergebenes Wort zurückgibt, ob es akzeptiert wird. (7 BE) - 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)
Hinweis zu Aufgabe b)
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)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
| gelesenes Zeichen | — | - | 1 | 2 | 0 |
|---|---|---|---|---|---|
| zustand | z0 | z1 | z3 | z3 | z3 |
| gelesenes Zeichen | — | + | 0 | 5 |
|---|---|---|---|---|
| zustand | z0 | z1 | zF | zF |
-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)
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.
Die Preis-Eingabe
18 BEAFB II–IIIDas 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 0 | Spalte 1 |
|---|---|---|
| 0 | 1 | 5 |
| 1 | 1 | 2 |
| 2 | 3 | 5 |
| 3 | 4 | 5 |
| 4 | 5 | 5 |
| 5 | 5 | 5 |
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- Analysieren Sie, welche der Eingaben
12,50,0,5,,99,7,3,141akzeptiert werden, und beschreiben Sie die akzeptierten Eingaben allgemein. (4 BE) - Zeichnen Sie den Zustandsgraphen, der durch
deltaund die Endzustände festgelegt ist. (4 BE) - Für Stornobuchungen sollen auch negative Preise wie
-2,50eingegeben 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) - 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)
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)
Hinweis zu Aufgabe c)
Hinweis zu Aufgabe d)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
| Eingabe | letzter Zustand | Ergebnis |
|---|---|---|
12,50 | z4 | akzeptiert |
0,5 | z3 | abgelehnt |
,99 | z5 (zF) | abgelehnt |
7 | z1 | akzeptiert |
3,141 | z5 (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)
Der Fehlerzustand z5 darf mit Vermerk weggelassen werden.
Erwartungshorizont zu Aufgabe c)
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,
spalteund Endzustände aus; die Methoden bleiben gleich (siehe Teilaufgabe c) — Vorteil Tabelle. - Lesbarkeit: Die Zahlen in
deltasind ohne Kommentare kaum verständlich; einswitchmit 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
switchkann 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.
