MINT üben

Objektorientierte Modellierung

Zehn Grundaufgaben quer durch das Kapitel: Klassenkarten lesen, Zustände verfolgen, Getter und Setter schreiben, Zeichenketten auswerten.

Dein Fortschritt:
0 / 0 Aufgaben
1

Aufgabenblock — AFB I

Zehn Standardaufgaben quer durch das ganze Kapitel — bunt gemischt statt nach Unterkapiteln sortiert: Klassenkarten und Objektkarten lesen, Zustände nach Methodenaufrufen angeben, einfache Klassen notieren, Referenzen, Reihungen und Zeichenketten-Methoden. Das sind die sicheren Punkte in jeder Klausur zur Objektorientierung.

A1
Klassenkarte lesen: Song
AFB I

Eine Playlist-App verwendet die folgende Klasse. Entnehmen Sie der Klassenkarte, wie viele Parameter der Konstruktor hat und wie viele der Methoden Anfragen bzw. Aufträge sind.

Song
  • - titel: Zeichenkette
  • - interpret: Zeichenkette
  • - dauerSek: Ganzzahl
  • - favorit: Wahrheitswert
  • c Song(titel: Zeichenkette, interpret: Zeichenkette, dauerSek: Ganzzahl)
  • + getTitel(): Zeichenkette
  • + getDauerSek(): Ganzzahl
  • + istFavorit(): Wahrheitswert
  • + markieren()
  • + setDauerSek(dauerSek: Ganzzahl)
Ansatz: Parameter stehen im Konstruktor in der Klammer, jeweils als name: Typ, durch Kommas getrennt.
Unterscheidung: Eine Anfrage liefert einen Wert zurück — in der Karte steht dann hinter der Klammer ein Rückgabetyp. Ein Auftrag ändert den Zustand und hat keinen Rückgabetyp.
Kontrolle: Der Konstruktor ist weder Anfrage noch Auftrag. Zähle also nur die fünf Zeilen mit +.
Vollständige Lösung

Der Konstruktor c Song(titel, interpret, dauerSek) hat 3 Parameter. favorit wird nicht übergeben, sondern im Konstruktor auf false gesetzt.

Anfragen (3): getTitel(): Zeichenkette, getDauerSek(): Ganzzahl, istFavorit(): Wahrheitswert — sie haben einen Rückgabetyp.
Aufträge (2): markieren() und setDauerSek(dauerSek: Ganzzahl) — kein Rückgabetyp, sie ändern den Zustand.

Beachte: Für interpret gibt es keinen Getter. Das Attribut ist privat und damit von außen weder lesbar noch änderbar — ob das so gewollt ist, müsste man im Entwurf klären.

A2
Zustand nach Methodenaufrufen: Kaffeeautomat
AFB I

Die Methode kaffeeZubereiten() verbraucht 14 g Bohnen und erhöht becher um 1 — aber nur, wenn noch mindestens 14 g vorhanden sind. auffuellen(gramm) erhöht den Bohnenvorrat.

Kaffeeautomat k = new Kaffeeautomat(40);
k.kaffeeZubereiten();
k.kaffeeZubereiten();
k.kaffeeZubereiten();
k.auffuellen(30);
k.kaffeeZubereiten();

Geben Sie die Attributwerte des Objekts k nach allen Aufrufen an.

g
Ansatz: Lege eine kleine Tabelle an: Zeile für Zeile den Wert von bohnenGramm und becher fortschreiben.
Stolperstelle: Nach zwei Kaffees sind noch 12 g übrig. Was passiert beim dritten Aufruf, wenn die Bedingung bohnenGramm >= 14 nicht erfüllt ist?
Vollständige Lösung

Die Methode im Quelltext:

public class Kaffeeautomat {
    private int bohnenGramm;
    private int becher;

    public Kaffeeautomat(int bohnenGramm) {
        this.bohnenGramm = bohnenGramm;
        becher = 0;
    }

    public void kaffeeZubereiten() {
        if (bohnenGramm >= 14) {
            bohnenGramm = bohnenGramm - 14;
            becher = becher + 1;
        }
    }

    public void auffuellen(int gramm) {
        bohnenGramm = bohnenGramm + gramm;
    }

    public int getBohnenGramm() {
        return bohnenGramm;
    }

    public int getBecher() {
        return becher;
    }
}

Ablauf: 40 g / 0 → 26 g / 1 → 12 g / 2 → dritter Aufruf: 12 < 14, nichts passiert → auffüllen: 42 g / 2 → 28 g / 3.

k: Kaffeeautomat
  • bohnenGramm = 28
  • becher = 3

Typischer Fehler: 4 Becher und 14 g — dann wurde die Bedingung im dritten Aufruf übersehen.

k: Kaffeeautomat
  • bohnenGramm = 40
  • becher = 0
Objektkarte direkt nach dem Konstruktor
A3
Zeichenketten-Methoden: Haltestellenanzeige
AFB I

Die Anzeige im Schulbus speichert den Namen der nächsten Haltestelle: String h = "Am Rathausplatz";

Nennen Sie die Rückgaben von h.length() und h.indexOf("platz"). Nennen Sie außerdem die Rückgaben von h.substring(3, 10) und h.charAt(h.length() - 1).

Ansatz: Schreibe die Zeichen mit ihrem Index darunter. Der Index beginnt bei 0, und das Leerzeichen zählt mit.
Regeln: indexOf liefert den Index des ersten Zeichens des gefundenen Teilstrings. substring(a, b) liefert die Zeichen von Index a bis ausschließlich b.
Kontrolle: Das letzte Zeichen hat immer den Index length() − 1, nie length().
Vollständige Lösung

Indizes: A0 m1 ␣2 R3 a4 t5 h6 a7 u8 s9 p10 l11 a12 t13 z14

h.length() → 15 (Indizes 0 bis 14).
h.indexOf("platz") → 10 („p“ steht an Index 10).
h.substring(3, 10) → "Rathaus" (Index 3 bis 9; Index 10 gehört nicht mehr dazu).
h.charAt(h.length() - 1) → das Zeichen 'z' (Index 14). h.charAt(h.length()) würde dagegen einen Laufzeitfehler auslösen.