Leihräder am Bahnhof
AFB I–IIEin Fahrradverleih am Bahnhof verwaltet seine Leihräder mit einem Programm. Die Klasse Leihrad ist in Material 1 dargestellt. Das Verhalten der Methoden ist wie folgt festgelegt:
Der Konstruktor übernimmt Nummer und Typ; ein neues Rad ist nicht ausgeliehen, hat 0,0 gefahrene Kilometer und 0 Ausleihen. ausleihen() wirkt nur, wenn das Rad gerade nicht ausgeliehen ist: Dann wird es als ausgeliehen markiert und die Zahl der Ausleihen um 1 erhöht. zurueckgeben(km) wirkt nur, wenn das Rad ausgeliehen ist: Dann ist es wieder verfügbar, und die gefahrenen Kilometer werden addiert. In allen anderen Fällen ändern die Methoden nichts.
- - nummer: Ganzzahl
- - typ: Zeichenkette
- - ausgeliehen: Wahrheitswert
- - kilometer: Fließkommazahl
- - anzahlAusleihen: Ganzzahl
- c Leihrad(nummer: Ganzzahl, typ: Zeichenkette)
- + ausleihen()
- + zurueckgeben(km: Fließkommazahl)
- + istAusgeliehen(): Wahrheitswert
- + getKilometer(): Fließkommazahl
Leihrad r1 = new Leihrad(12, "Trekking"); // Zeile 1 Leihrad r2 = new Leihrad(15, "E-Bike"); // Zeile 2 r1.ausleihen(); // Zeile 3 r2.ausleihen(); // Zeile 4 r1.zurueckgeben(14.5); // Zeile 5 r1.ausleihen(); // Zeile 6 r2.zurueckgeben(32.0); // Zeile 7 r2.zurueckgeben(8.0); // Zeile 8 r1.ausleihen(); // Zeile 9
- Zeichnen Sie die Objektkarten von
r1undr2unmittelbar nach Ausführung von Zeile 2. - Stellen Sie den Zustand beider Objekte nach Zeile 6 und nach Zeile 9 jeweils in Objektkarten dar.
- Begründen Sie, warum die Zeilen 8 und 9 den Zustand der Objekte nicht verändern, und warum nach Zeile 2 zwei Objektkarten, aber nur eine Klassenkarte existieren.
Hinweise
Hinweis zu Aufgabe a)
objektname: Klasse, unterstrichen. Darunter alle fünf Attribute mit Werten – auch die, die der Konstruktor nicht als Parameter bekommt. Zeichenketten stehen in Anführungszeichen.„Zeichnen“ heißt hier: die wesentlichen Eigenschaften übersichtlich in der üblichen Objektkarten-Form darstellen.Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
ausgeliehen direkt vor Zeile 8 bzw. Zeile 9 an. Für den zweiten Teil: Was beschreibt eine Klassenkarte, was eine Objektkarte?Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
- nummer = 12
- typ = "Trekking"
- ausgeliehen = false
- kilometer = 0.0
- anzahlAusleihen = 0
- nummer = 15
- typ = "E-Bike"
- ausgeliehen = false
- kilometer = 0.0
- anzahlAusleihen = 0
Erwartet: unterstrichener Kopf mit Objekt- und Klassenname, alle Attribute mit Startwerten, Zeichenketten in Anführungszeichen, keine Methoden in der Objektkarte.
Erwartungshorizont zu Aufgabe b)
Nach Zeile 6:
- nummer = 12
- typ = "Trekking"
- ausgeliehen = true
- kilometer = 14.5
- anzahlAusleihen = 2
- nummer = 15
- typ = "E-Bike"
- ausgeliehen = true
- kilometer = 0.0
- anzahlAusleihen = 1
Nach Zeile 9:
- nummer = 12
- typ = "Trekking"
- ausgeliehen = true
- kilometer = 14.5
- anzahlAusleihen = 2
- nummer = 15
- typ = "E-Bike"
- ausgeliehen = false
- kilometer = 32.0
- anzahlAusleihen = 1
Weg: Zeile 3 und 4 leihen beide Räder aus (je 1 Ausleihe). Zeile 5 gibt r1 mit 14,5 km zurück, Zeile 6 leiht r1 erneut aus (2 Ausleihen). Zeile 7 gibt r2 mit 32,0 km zurück; Zeile 8 und 9 bleiben wirkungslos.
Erwartungshorizont zu Aufgabe c)
Vor Zeile 8 ist r2 bereits zurückgegeben (ausgeliehen = false); zurueckgeben wirkt aber nur bei einem ausgeliehenen Rad, daher werden die 8,0 km nicht addiert. Vor Zeile 9 ist r1 bereits ausgeliehen (seit Zeile 6); ausleihen wirkt nur bei einem verfügbaren Rad, deshalb steigt anzahlAusleihen nicht.
Die Klassenkarte beschreibt den Bauplan (welche Attribute und Methoden jedes Leihrad hat) und existiert daher genau einmal. Mit jedem new entsteht ein eigenes Objekt mit eigenem Zustand; zwei Konstruktoraufrufe erzeugen zwei Objekte, also zwei Objektkarten.
Zahlenschlösser im Escape-Room
AFB II–IIIIn einem Escape-Room müssen Teams mehrere elektronische Zahlenschlösser öffnen. Jedes Schloss wird durch ein Objekt der Klasse Schloss gesteuert (Material 2). Der Konstruktor legt den dreistelligen Code fest; ein neues Schloss ist geschlossen, nicht gesperrt und hat 0 Fehlversuche.
eingeben(versuch) arbeitet so: Ist das Schloss gesperrt, ändert sich nichts und es wird false geliefert. Ist es bereits offen, ändert sich nichts und es wird true geliefert. Andernfalls wird der Versuch mit dem Code verglichen: Stimmt er, wird das Schloss geöffnet und true geliefert. Stimmt er nicht, steigt die Zahl der Fehlversuche um 1; beim dritten Fehlversuch wird das Schloss gesperrt. Dann wird false geliefert. Nur die Spielleitung kann mit zuruecksetzen() ein Schloss wieder in den Ausgangszustand versetzen (geschlossen, nicht gesperrt, 0 Fehlversuche).
- - code: Ganzzahl
- - offen: Wahrheitswert
- - fehlversuche: Ganzzahl
- - gesperrt: Wahrheitswert
- c Schloss(code: Ganzzahl)
- + eingeben(versuch: Ganzzahl): Wahrheitswert
- + zuruecksetzen()
- + istOffen(): Wahrheitswert
Schloss s1 = new Schloss(417); // Zeile 1 Schloss s2 = new Schloss(250); // Zeile 2 Schloss s3 = new Schloss(999); // Zeile 3 s1.eingeben(471); // Zeile 4 s1.eingeben(417); // Zeile 5 s2.eingeben(205); // Zeile 6 s2.eingeben(520); // Zeile 7 s2.eingeben(502); // Zeile 8 s2.eingeben(250); // Zeile 9 s1.eingeben(123); // Zeile 10 s3.eingeben(99); // Zeile 11
- code = 808
- offen = true
- fehlversuche = 2
- gesperrt = false
- code = 315
- offen = true
- fehlversuche = 3
- gesperrt = true
- code = 640
- offen = false
- fehlversuche = 1
- gesperrt = false
- Wenden Sie die Aufruffolge aus Material 2 an: Geben Sie für die Zeilen 4 bis 11 jeweils den Rückgabewert an und zeichnen Sie die Objektkarten von
s1,s2unds3nach Zeile 11. - Analysieren Sie die Objektkarten aus Material 3: Entscheiden Sie jeweils, ob der Zustand durch Aufrufe der Methoden entstanden sein kann. Geben Sie im Fall „möglich“ eine passende Aufruffolge an und begründen Sie im Fall „unmöglich“.
- Vergleichen Sie die Klassenkarte
Schlossmit der Objektkarte vons2nach Zeile 11 hinsichtlich Inhalt, Aussagekraft und Zeitbezug. - Ein Teammitglied schlägt vor, das Attribut
gesperrtzu streichen und stattdessen eine AnfrageistGesperrt(): Wahrheitswertanzubieten, die „fehlversuche ≥ 3“ auswertet. Die Spielleitung wünscht sich außerdem für später, ein gesperrtes Schloss per Knopfdruck zu entsperren, ohne die Fehlversuche für die Auswertung zu löschen. Erörtern Sie den Vorschlag unter Berücksichtigung Ihrer Ergebnisse aus b) und des Wunsches der Spielleitung.
Hinweise
Hinweis zu Aufgabe a)
offen, fehlversuche, gesperrt.„Anwenden“ heißt: das beschriebene Verfahren mit den konkreten Werten Schritt für Schritt durchführen.Hinweis zu Aufgabe b)
zuruecksetzen()?Hinweis zu Aufgabe c)
Hinweis zu Aufgabe d)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
Zeile 4: false (s1: 1 Fehlversuch) · Zeile 5: true (s1 offen) · Zeile 6: false (s2: 1) · Zeile 7: false (s2: 2) · Zeile 8: false (s2: 3, gesperrt) · Zeile 9: false (gesperrt – obwohl der Code stimmt, keine Änderung) · Zeile 10: true (s1 ist schon offen, keine Änderung) · Zeile 11: false (s3: 1).
- code = 417
- offen = true
- fehlversuche = 1
- gesperrt = false
- code = 250
- offen = false
- fehlversuche = 3
- gesperrt = true
- code = 999
- offen = false
- fehlversuche = 1
- gesperrt = false
Typische Fehler: in Zeile 9 true angeben (Sperre übersehen), in Zeile 10 den Fehlversuch zählen (offenes Schloss übersehen).
Erwartungshorizont zu Aufgabe b)
s4 – möglich: z. B. new Schloss(808), zwei falsche Eingaben (etwa 880 und 088), dann eingeben(808). Nach zwei Fehlversuchen ist das Schloss noch nicht gesperrt; das Öffnen setzt die Fehlversuche nicht zurück.
s5 – unmöglich: Offen wird ein Schloss nur durch den richtigen Code, solange es nicht gesperrt ist. Ist es offen, verändern weitere Eingaben nichts, es können also keine Fehlversuche mehr hinzukommen. Ist es dagegen durch den dritten Fehlversuch gesperrt, kann es nicht mehr geöffnet werden; zuruecksetzen() würde alle drei Attribute gleichzeitig zurücksetzen. „offen und gesperrt“ kann daher nie gleichzeitig gelten; der Zustand deutet auf einen Programmfehler oder eine Manipulation hin.
s6 – möglich: new Schloss(640) und eine falsche Eingabe. Auch möglich: drei Fehlversuche, zuruecksetzen(), ein weiterer Fehlversuch.
Erwartungshorizont zu Aufgabe c)
Gemeinsamkeiten: Beide beziehen sich auf dieselbe Klasse und nennen dieselben vier Attribute.
Unterschiede: Die Klassenkarte trägt nur den Klassennamen, die Objektkarte den unterstrichenen Kopf s2: Schloss. Die Klassenkarte nennt Sichtbarkeiten und Datentypen sowie Konstruktor und Methoden, aber keine Werte; die Objektkarte nennt konkrete Werte (z. B. fehlversuche = 3) und keine Methoden. Die Klassenkarte gilt dauerhaft für alle Schlösser (es gibt sie einmal), die Objektkarte ist eine Momentaufnahme eines einzelnen Objekts nach Zeile 11 und veraltet mit dem nächsten verändernden Aufruf (z. B. zuruecksetzen()).
Erwartungshorizont zu Aufgabe d)
Für den Vorschlag: gesperrt ist im jetzigen Modell redundant, weil es immer genau dann wahr ist, wenn fehlversuche 3 erreicht hat. Redundante Attribute können auseinanderlaufen; ohne das Attribut wäre ein Teil der Fehlerbilder wie in b) unmöglich. Die Klasse wird kleiner, nach außen ändert sich nichts, weil istGesperrt() dieselbe Information liefert.
Gegen den Vorschlag: Den Wunsch der Spielleitung – entsperren, ohne die Fehlversuche zu löschen – kann das berechnete Modell nicht erfüllen: Solange fehlversuche 3 beträgt, gilt das Schloss als gesperrt. Mit einem eigenen Attribut ist die Sperre unabhängig von der Statistik steuerbar. Zudem hängt die Korrektheit ohnehin von der Implementierung der Methoden ab: Der Fehlerzustand von s5 entsteht nur durch fehlerhaften Code, nicht durch das Attribut selbst.
Mögliches Ergebnis: Für die aktuellen Anforderungen ist der Vorschlag sinnvoll. Soll der Wunsch der Spielleitung umgesetzt werden, ist das eigene Attribut gesperrt beizubehalten, weil „gesperrt“ dann eine eigenständige Information ist. Erwartet werden Argumente beider Seiten und ein begründetes Ergebnis, das sich auf die Zukunftsanforderung bezieht.
