MINT lernen

Übungen: Objektkarten und -diagramme

Eine Objektkarte ist ein Foto: Nach jedem Methodenaufruf kann das nächste Bild schon ganz anders aussehen.

Dein Fortschritt:
0 / 0 Aufgaben
1

Übungsaufgaben

Zehn Übungen zum Klicken, Ziehen und Knobeln — von AFB I bis AFB III. Jede Übung gibt dir sofort Rückmeldung; wenn du hängst, helfen dir die gestuften Tipps.

A1
Eine Bestellung in der Pizzeria
AFB I

Die Kasse einer Pizzeria zeigt diese Objektkarte. Welche Aussagen stimmen?

b7: Bestellung
  • tischNr = 4
  • pizzen = 3
  • betrag = 27
  • kunde = "Nguyen"
  • bezahlt = false
Mehrere Antworten sind richtig. Markiere alle zutreffenden und klicke dann auf „Prüfen“.
Eine Objektkarte zeigt nur Attributwerte — Methoden stehen in der Klassenkarte. false ist ein ganz normaler Wert: Das Objekt existiert vollständig, es ist eben noch nicht bezahlt. Und eine zweite Bestellung mit gleichen Werten bekäme eine eigene Karte mit eigenem Namen, z. B. b8: Gleiche Werte bedeuten nicht dasselbe Objekt.
Ansatz: Was steht im Kopf der Karte, was darunter? Und was fehlt im Vergleich zur Klassenkarte?
Weiter: Ein Wert wie false oder 0 ist ein vollwertiger Zustand — kein Zeichen für ein „unfertiges“ Objekt.
A2
Klassenkarte, Objektkarte — oder falsch?
AFB I

Eine Rezept-App hat die Klasse Rezept. Wohin gehören die Zeilen? Zwei davon sind so notiert, dass sie in keine Karte passen.

Ziehe jede Karte in den passenden Korb — oder wähle sie mit Enter aus und drücke dann die Ziffer des Korbs (0 legt sie zurück).
1Klassenkarte
2Objektkarte
3fehlerhaft notiert
In der Klassenkarte stehen Sichtbarkeit, Name und Datentyp; in der Objektkarte stehen Name und Wert. Die beiden Fehler mischen genau das: - portionen = 4 hat ein Minus, das in eine Objektkarte nicht gehört, und name = Pfannkuchen fehlen die Anführungszeichen — ohne sie sähe Pfannkuchen wie der Name eines anderen Objekts aus.
Ansatz: Doppelpunkt mit Datentyp → Klassenkarte. Gleichheitszeichen mit Wert → Objektkarte.
Weiter: Prüfe die Objektkarten-Zeilen genau: Sichtbarkeitszeichen gibt es dort nicht, und Zeichenketten stehen immer in Anführungszeichen.
A3
Fachbegriffe im Gewächshaus
AFB I

In einem Schul-Gewächshaus wird jede Pflanze als Objekt der Klasse Pflanze erfasst. Setze die Begriffe ein — ein Wort bleibt übrig.

Wort anklicken, dann Lücke anklicken (oder umgekehrt) — mit Tab und Enter geht es genauso. Ein Klick auf eine gefüllte Lücke legt das Wort zurück.

Der Kopf „p2: Pflanze“ einer Objektkarte wird geschrieben. Darunter stehen die aktuellen von p2. Weil sich diese Werte ändern können, ist jede Objektkarte nur eine . Zeichnet man die Karten aller Pflanzen im Gewächshaus zusammen, entsteht ein . Die Werte auf einer Karte ändern sich durch den Aufruf eines , zum Beispiel giessen(200).

„Klassendiagramm“ bleibt übrig. Das Klassendiagramm zeigt den Bauplan (Attribute mit Datentypen, Methoden); das Objektdiagramm zeigt konkrete Objekte mit ihren Werten. Wer die beiden verwechselt, zeichnet in Klausuren oft Datentypen statt Werten in die Objektkarten.
Ansatz: Überlege, welche Begriffe zum Bauplan gehören und welche zu konkreten Pflanzen.
Weiter: Anfragen liefern nur Werte; welche Art von Methode ändert den Zustand?
A4
Stimmt's? — Zwei Kühlschränke
AFB II

In einer WG stehen zwei Kühlschränke. Am Anfang haben beide die Werte temperatur = 6, tuerOffen = false und fuellung = 12 (Anzahl Lebensmittel). oeffnen und schliessen setzen tuerOffen, einraeumen und entnehmen erhöhen bzw. verringern fuellung um n. Dann passiert nacheinander: k1.oeffnen(), k1.einraeumen(5), k2.entnehmen(3), k1.getTemperatur(), k1.schliessen().

Kuehlschrank
  • - temperatur: Ganzzahl
  • - tuerOffen: Wahrheitswert
  • - fuellung: Ganzzahl
  • + oeffnen()
  • + schliessen()
  • + einraeumen(n: Ganzzahl)
  • + entnehmen(n: Ganzzahl)
  • + getTemperatur(): Ganzzahl
Fünf Aussagen nacheinander. Eine falsche Einschätzung reicht — dann startest du die Serie mit „Neue Runde“ neu.
Aussage 1 von 5

Merksatz: Ein Methodenaufruf ändert nur die Karte des Objekts, vor dessen Punkt er steht — und nur Aufträge ändern überhaupt etwas. Die Objektkarte am Ende ist die Momentaufnahme nach dem letzten Aufruf.
Ansatz: Zeichne die zwei Objektkarten auf und aktualisiere sie nach jedem Aufruf.
Weiter: Achte auf den Namen vor dem Punkt: Nur dieses Objekt ändert sich. Anfragen wie getTemperatur() ändern gar nichts.
A5
Getränkeautomat: Einnahmen
AFB II

Ein Getränkeautomat startet mit der Objektkarte unten (Beträge in Cent). einwerfen(c) erhöht guthaben um c. kaufen() gibt nur dann ein Getränk aus, wenn guthaben mindestens preis beträgt: Dann sinkt vorrat um 1, guthaben sinkt um preis, und einnahmen steigt um preis. Sonst passiert nichts. rueckgabe() setzt guthaben auf 0.

g1: Getraenkeautomat
  • vorrat = 8
  • preis = 150
  • guthaben = 0
  • einnahmen = 0

Aufrufe: einwerfen(100), kaufen(), einwerfen(100), kaufen(), einwerfen(200), kaufen(), kaufen(), rueckgabe(). Welchen Wert hat einnahmen am Ende?

Rechne selbst und trage das Ergebnis ein — Enter prüft direkt.
Nur der zweite und der dritte Kauf klappen: Guthaben 100 → Kauf scheitert; 200 → Kauf (Rest 50); 250 → Kauf (Rest 100); 100 → Kauf scheitert. Also 2 · 150 = 300 Cent. Häufiger Fehler: 600, weil jeder kaufen()-Aufruf gezählt wird — die Bedingung verhindert aber zwei Käufe. Ein anderer Fehler ist 400 (alles Eingeworfene): Das Restguthaben von 100 Cent wird zurückgegeben und ist keine Einnahme.
Ansatz: Führe eine kleine Tabelle mit den Spalten guthaben, vorrat und einnahmen und trage nach jedem Aufruf die neuen Werte ein.
Weiter: Vor jedem kaufen(): Ist guthaben mindestens 150? Nur dann ändern sich die drei Werte.
A6
Momentaufnahmen in der Werkstatt
AFB II

Eine Kfz-Werkstatt verwaltet jeden Reparaturauftrag als Objekt. Die fünf Karten zeigen dasselbe Objekt a1 (kennzeichen = "H-KL 42") zu verschiedenen Zeitpunkten. Bring sie in die Reihenfolge, in der sie entstanden sind.

Auftrag
  • - kennzeichen: Zeichenkette
  • - status: Zeichenkette
  • - kosten: Ganzzahl
  • - bezahlt: Wahrheitswert
  • c Auftrag(kennzeichen: Zeichenkette)
  • + arbeitBeginnen()
  • + teilEinbauen(preis: Ganzzahl)
  • + fertigmelden()
  • + abholenUndBezahlen()
Ziehe die Karten in die richtige Reihenfolge — mit der Tastatur: ↑/↓ verschiebt, Shift+↑/↓ wechselt nur den Fokus.
1status = "angenommen", kosten = 0, bezahlt = false
2status = "in Arbeit", kosten = 85, bezahlt = false
3status = "in Arbeit", kosten = 145, bezahlt = false
4status = "fertig", kosten = 145, bezahlt = false
5status = "abgeholt", kosten = 145, bezahlt = true
Die beiden „in Arbeit“-Karten verrutschen am häufigsten. Entscheidend ist, dass teilEinbauen die Kosten nur erhöhen kann — also kommt 85 vor 145. Jede Karte ist eine Momentaufnahme; die Reihenfolge ergibt sich allein daraus, welche Aufträge welche Werte verändern können.
Ansatz: Welche Karte zeigt den Zustand direkt nach dem Konstruktor? Welche den Zustand ganz am Ende?
Weiter: Kosten kommen nur durch teilEinbauen hinzu und werden nie kleiner. Zwischen „in Arbeit“ und „fertig“ entscheidet der Status, innerhalb von „in Arbeit“ die Kosten.
A7
Aus Reihungen werden Objektkarten
AFB IIMix

Ein Adressbuch speicherte seine Kontakte bisher wie in Kapitel 2 in drei Reihungen:

String[] namen    = {"Kim", "Ole", "Kim", "Ada", "Ben"};
String[] telefone = {"0176 11", "0511 42", "0151 90", "0176 11", "0511 42"};
int[] jahrgaenge  = {2007, 2008, 2008, 2008, 2007};

Jetzt wird jeder Kontakt ein Objekt der Klasse Kontakt. Welche Objektkarte fasst die Werte welches Index zusammen?

Ansatz: Zähle bei den Reihungen die Indizes ab 0. Welche Spalte (Index) enthält „Ada“?
Weiter: Bei den beiden Kims entscheidet die Telefonnummer; bei den gleichen Telefonnummern der Name.
A8
Zwei Schulbusse im Objektdiagramm
AFB III

Zwei Schulbusse werden erzeugt: b1 mit kapazitaet = 50, b2 mit kapazitaet = 30; beide starten mit fahrgaeste = 0 und haltestelle = 1. einsteigen(n) lässt höchstens so viele einsteigen, bis der Bus voll ist — wer keinen Platz findet, bleibt stehen. aussteigen(n) verringert fahrgaeste um n, weiterfahren() erhöht haltestelle um 1.

Bus
  • - fahrgaeste: Ganzzahl
  • - kapazitaet: Ganzzahl
  • - haltestelle: Ganzzahl
  • c Bus(kapazitaet: Ganzzahl)
  • + einsteigen(n: Ganzzahl)
  • + aussteigen(n: Ganzzahl)
  • + weiterfahren()

Aufrufe: b1.einsteigen(32), b2.einsteigen(32), b1.weiterfahren(), b1.aussteigen(10), b1.einsteigen(35), b2.weiterfahren(), b2.aussteigen(12), b2.weiterfahren().

Rechne die Kette Schritt für Schritt: Erst wenn ein Schritt stimmt, wird der nächste freigeschaltet. Enter prüft.
  1. Wert von fahrgaeste bei b2 direkt nach dem zweiten Aufruf Fahrgäste
  2. Wert von fahrgaeste bei b1 am Ende Fahrgäste
  3. Wie viele Fahrgäste sitzen am Ende in beiden Bussen zusammen? Fahrgäste
  4. Transfer: Wie viele Personen mussten insgesamt an Haltestellen stehen bleiben? Personen
b2 ist nach 30 Plätzen voll (2 bleiben stehen). b1: 32 → 22 → 22 + 35 = 57 wäre zu viel, also 50 (7 bleiben stehen). Am Ende 50 + 18 = 68 Fahrgäste und 2 + 7 = 9 Zurückgebliebene. Typischer Fehler: die Kapazität zu ignorieren (dann 57 und 32) oder Aufrufe eines Busses auf der Karte des anderen einzutragen.
Ansatz: Zeichne zwei Objektkarten b1 und b2 und aktualisiere nach jedem Aufruf nur die Karte des Busses vor dem Punkt.
Weiter: Bei jedem einsteigen: Passt die Summe noch unter die Kapazität? Wenn nicht, wird fahrgaeste gleich der Kapazität, der Rest bleibt stehen.
A9
Fehlersuche in der Objektkarte
AFB III

In einem Regallager wird eine Kiste mit dem Konstruktor erzeugt (inhalt "Schrauben", gewichtKg 12; fach startet mit 0, zerbrechlich mit false). Danach wird k1.einlagern(3) und anschließend k1.einlagern(5) aufgerufen — einlagern legt die Kiste in das angegebene Fach. Ein Mitschüler hat die Objektkarte nach allen Aufrufen gezeichnet. Drei Zeilen sind falsch.

Kiste
  • - inhalt: Zeichenkette
  • - gewichtKg: Ganzzahl
  • - fach: Ganzzahl
  • - zerbrechlich: Wahrheitswert
  • c Kiste(inhalt: Zeichenkette, gewichtKg: Ganzzahl)
  • + einlagern(fach: Ganzzahl)
  • + getGewichtKg(): Ganzzahl
In diesem Text stecken Fehler. Klicke genau die falschen Zeilen an — die richtigen musst du stehen lassen.
Klausurklassiker ist der Fehler in Zeile 4: Man trägt einen Zwischenstand ein, statt die Karte bis zum letzten Aufruf fortzuschreiben. Eine Objektkarte ist immer die Momentaufnahme zu einem Zeitpunkt. Genauso häufig: Methoden oder Datentypen in die Objektkarte schreiben.
Ansatz: Rechne zuerst selbst: Welche Werte hat k1 nach beiden einlagern-Aufrufen?
Weiter: Vergleiche dann jede Zeile mit deinem Ergebnis und mit den Notationsregeln: Wert-Schreibweise, Anführungszeichen, nur Attribute.
A10
Trickaufgabe: Was ändert sich wirklich?
AFB IIITrick

Ein Zugwagen hat die Objektkarte w1: Wagen mit nummer = 7, plaetze = 60, belegt = 60, klasse = 2. belegen(n) erhöht belegt um n, aber nie über plaetze hinaus. raeumen() setzt belegt auf 0. umwidmen(k) setzt klasse auf k und belegt auf 0. Wie viele Werte auf der Karte ändern sich durch den Aufruf? Jede Zeile startet wieder mit der Ausgangskarte.

Wagen
  • - nummer: Ganzzahl
  • - plaetze: Ganzzahl
  • - belegt: Ganzzahl
  • - klasse: Ganzzahl
  • + belegen(n: Ganzzahl)
  • + raeumen()
  • + umwidmen(neueKlasse: Ganzzahl)
  • + getFreiePlaetze(): Ganzzahl
Wähle für jede Zeile eine Stufe: 0 = kein Wert ändert sich, 1 = ein Wert, 2 = zwei Werte, 3 = drei Werte, 4 = vier Werte. Mit der Tastatur: Tab zur Zeile, ←/→ zwischen den Stufen, Enter setzt.
0 = keine Änderung4 = vier Werte ändern sich
w1.getFreiePlaetze()
w1.belegen(5)
w1.raeumen()
w1.umwidmen(1)
w1.umwidmen(2)
Zwei Fallen: belegen(5) ist zwar ein Auftrag, ändert hier aber nichts, weil der Wagen schon voll ist (60 von 60). Und umwidmen(2) setzt klasse auf 2 — das stand schon da; nur belegt ändert sich. Ein Auftrag darf den Zustand ändern, muss es aber nicht. Die Anfrage getFreiePlaetze() ändert nie etwas.
Ansatz: Trage für jede Zeile die neue Karte auf und vergleiche sie Wert für Wert mit der Ausgangskarte.
Weiter: Ein Wert, der auf denselben Wert gesetzt wird, hat sich nicht geändert. Und „nie über plaetze hinaus“ heißt bei einem vollen Wagen: gar nicht.