MINT lernen

Probe-Klausur

Probe-Klausur zur Objektorientierung: 90 Minuten, 60 Punkte, drei Anforderungsbereiche – mit Auswertung in Notenpunkten.

Punkte0 / 60
Notenpunkte—
Bearbeitet0 / 0
Bearbeitungszeit90 Minuten
AFB I

Wissen und Reproduzieren

18 Punkte
A1
Medien in der Stadtbibliothek
AFB I 6 Punkte

Die Stadtbibliothek verwaltet ihre Bücher und Filme mit der Klasse Medium. Die Leihfrist darf zwischen 7 und 28 Tagen liegen.

Medium
  • - titel: Zeichenkette
  • - leihfrist: Ganzzahl
  • - ausgeliehen: Wahrheitswert
  • c Medium(titel: Zeichenkette, leihfrist: Ganzzahl)
  • + getTitel(): Zeichenkette
  • + istAusgeliehen(): Wahrheitswert
  • + ausleihen()
  • + zurueckgeben()
  • + setLeihfrist(tage: Ganzzahl)
a) Ordnen Sie jedem Element der Klassenkarte seine Rolle zu. 4 P
b) Nennen Sie die Anzahl der Anfragen in der Klassenkarte. 1 P
c) Welcher Java-Methodenkopf gehört zu + setLeihfrist(tage: Ganzzahl)? 1 P
Lösung anzeigen (nach Auswerten freigeschaltet)

Erwartungshorizont: a) - leihfrist: privates Attribut (Minus); c Medium(titel: Zeichenkette, leihfrist: Ganzzahl): Konstruktor (vorangestelltes c); istAusgeliehen(): Anfrage, weil sie einen Wahrheitswert liefert; zurueckgeben(): Auftrag, weil sie den Zustand ändert und keinen Rückgabetyp hat (je 1 P). b) Anfragen sind getTitel() und istAusgeliehen(), also 2; der Konstruktor zählt nicht dazu (1 P). c) Plus → public, kein Rückgabetyp im Diagramm → void, Ganzzahl → int (1 P).

A2
Zwei Kaffeeautomaten
AFB I 6 Punkte

Im Lehrerzimmer stehen zwei Kaffeeautomaten. Für einen Becher werden 150 ml Wasser gebraucht.

public class Kaffeeautomat {
    private int wasser;   // in ml
    private int becher;

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

    public void bruehen() {
        if (wasser >= 150) {
            wasser = wasser - 150;
            becher = becher + 1;
        }
    }

    public int getWasser() {
        return wasser;
    }
}
Kaffeeautomat k1 = new Kaffeeautomat(1000);
Kaffeeautomat k2 = new Kaffeeautomat(1000);
k1.bruehen();
k1.bruehen();
a) Geben Sie alle Aussagen an, die nach Ausführung des Programmausschnitts zutreffen. (mehrere Antworten richtig) 4 P
b) Stellen Sie den Zustand von k1 als Objektkarte dar — welche Karte ist korrekt? 2 P
Lösung anzeigen (nach Auswerten freigeschaltet)

Erwartungshorizont: a) Zwei new erzeugen zwei Objekte, der Konstruktor läuft also zweimal; bruehen() ändert den Zustand ohne Rückgabe und ist damit ein Auftrag; k2 wurde nicht verändert und hat weiterhin 1000 ml. Kaffeeautomat ist die Klasse, jedes Objekt hat eigene Attributwerte (4 P, Abzug je falscher Markierung). b) Zwei Aufrufe: 1000 − 2 · 150 = 700 ml, 2 Becher. Kopf k1: Kaffeeautomat, darunter nur Werte, keine Typen und keine Methoden (2 P).

A3
Ein Wagen für den Regionalzug
AFB I 6 Punkte

Ein Verkehrsverbund modelliert die Wagen seiner Regionalzüge. Jeder Wagen hat zu Beginn 64 Plätze; die Wagenklasse darf nur 1 oder 2 sein.

Wagen
  • - nummer: Ganzzahl
  • - klasse: Ganzzahl
  • - plaetze: Ganzzahl
  • c Wagen(nummer: Ganzzahl, klasse: Ganzzahl)
  • + getPlaetze(): Ganzzahl
  • + setKlasse(k: Ganzzahl)

Bestimmen Sie jeweils die Implementierung, die zur Klassenkarte und zur Beschreibung passt.

a) Attribut plaetze 1 P
b) Konstruktor 2 P
c) Methode getPlaetze 1 P
d) Methode setKlasse 2 P
Lösung anzeigen (nach Auswerten freigeschaltet)

Erwartungshorizont: a) Minus → private, Ganzzahl → int, Java-Reihenfolge Typ vor Name (1 P). b) Konstruktor ohne Rückgabetyp, mit genau den zwei Parametern aus der Klassenkarte; this. ist nötig, weil die Parameter wie die Attribute heißen; plaetze wird fest mit 64 belegt (2 P). c) Getter ohne Parameter mit return (1 P). d) Gültig ist 1 oder 2; mit && wäre die Bedingung nie erfüllt, k = klasse überschreibt nur den Parameter, ohne Prüfung wäre auch Klasse 3 möglich (2 P).

AFB II

Zusammenhänge herstellen

27 Punkte
A4
Datenvolumen im Handyvertrag
AFB II 7 Punkte

Ein Mobilfunkanbieter verwaltet das Datenvolumen seiner Verträge in Megabyte (MB).

public class Handyvertrag {
    private String tarif;
    private int volumen;     // gebuchtes Volumen in MB
    private int verbraucht;  // verbrauchtes Volumen in MB

    public Handyvertrag(String tarif, int volumen) {
        this.tarif = tarif;
        this.volumen = volumen;
        verbraucht = 0;
    }

    public void surfen(int mb) {
        if (verbraucht + mb <= volumen) {
            verbraucht = verbraucht + mb;
        } else {
            verbraucht = volumen;
        }
    }

    public void buchen(int mb) {
        if (mb > 0) {
            volumen = volumen + mb;
        }
    }

    public int getRest() {
        return volumen - verbraucht;
    }
}
Handyvertrag v = new Handyvertrag("Basis", 3000);
v.surfen(1200);
v.surfen(2500);
v.buchen(1000);
v.surfen(400);
int r = v.getRest();

Ermitteln Sie die Werte, die bei der Ausführung des Programmausschnitts entstehen.

a) Wert von verbraucht nach v.surfen(2500) 2 P
MB
b) Wert von volumen nach v.buchen(1000) 1 P
MB
c) Wert von r am Ende 2 P
MB
d) In einer älteren Version bestand der Rumpf von surfen nur aus verbraucht = verbraucht + mb;. Welchen Wert hätte r dann am Ende? 2 P
MB
Lösung anzeigen (nach Auswerten freigeschaltet)

Erwartungshorizont: a) Nach surfen(1200) ist verbraucht = 1200. Bei surfen(2500) gilt 1200 + 2500 = 3700 > 3000, also greift der else-Zweig: verbraucht = 3000 (2 P). b) 1000 > 0, also volumen = 4000 (1 P). c) 3000 + 400 = 3400 ≤ 4000, also verbraucht = 3400 und r = 4000 − 3400 = 600 (2 P). d) Ohne Prüfung: 1200 + 2500 + 400 = 4100 verbraucht, r = 4000 − 4100 = −100. Ein negativer Rest ist kein gültiger Zustand — genau das verhindert die Prüfung in surfen (2 P).

A5
Songs in der Playlist
AFB II 7 Punkte

Eine Musik-App speichert jeden Titel einer Playlist als Objekt der Klasse Song. Der Konstruktor setzt titel und dauer (in Sekunden), die Getter liefern die Werte, und setDauer übernimmt nur positive Werte:

public void setDauer(int dauer) {
    if (dauer > 0) {
        this.dauer = dauer;
    }
}
Song a = new Song("Nachtzug", 210);
Song b = new Song("Nachtzug", 210);
Song c = a;
c.setDauer(180);
b.setDauer(-30);
boolean x1 = (a == b);
boolean x2 = (a == c);
boolean x3 = a.getTitel().equals(b.getTitel());
int d = a.getDauer() + b.getDauer();
a) Analysieren Sie den Programmausschnitt. Welche Aussagen treffen zu? (mehrere Antworten richtig) 3 P
b) Welchen Wert hat d? 2 P
s
c) Wie viele Song-Objekte existieren nach dem Programmausschnitt? 2 P
Lösung anzeigen (nach Auswerten freigeschaltet)

Erwartungshorizont: a) c = a kopiert nur die Referenz: c ist ein Alias, c.setDauer(180) ändert also auch a. a == b vergleicht Referenzen zweier verschiedener Objekte und ist false; a == c ist true. equals vergleicht den Inhalt der Titel, also true. setDauer(-30) wird abgelehnt, b behält 210 (3 P, Abzug je falscher Markierung). b) d = 180 + 210 = 390 (2 P). c) Nur zwei new, also zwei Objekte; c ist kein drittes (2 P).

A6
Frostnächte an der Wetterstation
AFB II 7 Punkte

Eine Wetterstation speichert für jede volle Stunde eines Tages höchstens einen Messwert. Die Klasse Messwert hat den Konstruktor Messwert(int stunde, double temperatur) sowie die Getter getStunde() und getTemperatur().

public class Wetterstation {
    private Messwert[] werte;

    public Wetterstation() {
        werte = new Messwert[24];
    }

    public void speichern(Messwert m) {
        werte[m.getStunde()] = m;
    }

    public int anzahlFrost() {
        int n = 0;
        for (int i = 0; i < werte.length; i++) {
            if (werte[i] != null && werte[i].getTemperatur() < 0) {
                n++;
            }
        }
        return n;
    }
}
Wetterstation s = new Wetterstation();
s.speichern(new Messwert(0, -2.5));
s.speichern(new Messwert(6, -0.5));
s.speichern(new Messwert(12, 4.0));
s.speichern(new Messwert(18, 1.5));
s.speichern(new Messwert(6, 0.5));

Untersuchen Sie die Klasse Wetterstation und den Programmausschnitt.

a) Wie viele Messwert-Objekte existieren direkt nach new Wetterstation()? 1 P
b) Welchen Wert liefert s.anzahlFrost() am Ende? 2 P
c) Wie viele Plätze der Reihung werte enthalten am Ende null? 2 P
d) In einer Version fehlt in der Bedingung werte[i] != null &&. Begründen Sie, was dann beim Aufruf von s.anzahlFrost() geschieht. 2 P
Lösung anzeigen (nach Auswerten freigeschaltet)

Erwartungshorizont: a) new Messwert[24] legt nur 24 leere Plätze an — 0 Objekte (1 P). b) Der zweite Messwert für Stunde 6 (0,5 °C) überschreibt den ersten (−0,5 °C). Unter 0 °C liegt nur noch Stunde 0 mit −2,5 °C, also 1 (2 P). c) Belegt sind die Plätze 0, 6, 12 und 18, also 24 − 4 = 20 leere Plätze (2 P). d) Schon bei i = 1 steht null in der Reihung; ein Methodenaufruf an null führt zur NullPointerException. Mit && wird der zweite Teil bei null gar nicht mehr ausgewertet (2 P).

A7
Aufträge in der Kfz-Werkstatt
AFB II 6 Punkte

Eine Kfz-Werkstatt erfasst Reparaturaufträge. Jeder Auftrag betrifft genau ein Fahrzeug; ein Fahrzeug kann im Lauf der Zeit viele Aufträge haben. Die Kosten sind Arbeitsstunden mal Stundensatz plus 25 € Pauschale.

public class Auftrag {
    private Fahrzeug fahrzeug;
    private int stunden;

    public Auftrag(Fahrzeug fahrzeug, int stunden) {
        this.fahrzeug = fahrzeug;
        this.stunden = stunden;
    }

    public Fahrzeug getFahrzeug() {
        return fahrzeug;
    }

    public int kosten(int stundensatz) {
        return stunden * stundensatz + 25;
    }
}

Die Klasse Fahrzeug hat den Konstruktor Fahrzeug(String kennzeichen, int kilometer) und die Getter getKennzeichen() und getKilometer().

a) Erstellen Sie die Assoziation zwischen Auftrag und Fahrzeug im Klassendiagramm. Welche Darstellung ist korrekt? 2 P
b) Welcher Aufruf liefert das Kennzeichen des Fahrzeugs zu einem Auftrag au? 2 P
c) Für ein Fahrzeug wird Auftrag au = new Auftrag(f, 3); angelegt. Berechnen Sie den Wert von au.kosten(68). 2 P
€
Lösung anzeigen (nach Auswerten freigeschaltet)

Erwartungshorizont: a) Die Kardinalität steht an dem Ende, dessen Anzahl sie angibt: viele Aufträge (n) zu genau einem Fahrzeug (1). Im Grundkurs ist die Assoziation eine einfache beschriftete Linie, ohne Pfeil und Raute (2 P). b) Das Attribut fahrzeug ist privat; au.getFahrzeug() liefert das Fahrzeug-Objekt, an dem getKennzeichen() aufgerufen wird (2 P). c) 3 · 68 + 25 = 204 + 25 = 229 € (2 P).

AFB III

Verallgemeinern und beurteilen

15 Punkte
A8
Bestellungen der Pizzeria
AFB III 8 Punkte

Ein Praktikant hat für eine Pizzeria die Klasse Bestellung geschrieben. Eine Bestellung bezieht sich auf eine Pizza; die Klasse Pizza hat die Anfrage getPreis(). Der Code übersetzt, arbeitet aber nicht wie gewünscht.

public class Bestellung {
    public double preis;                          // (1)
    private String status;
    private Pizza pizza;

    public void Bestellung(Pizza pizza) {         // (2)
        pizza = pizza;                            // (3)
        status = "offen";
    }

    public void liefern() {
        if (status == "offen") {                  // (4)
            status = "geliefert";
        }
    }

    public double getPreis() {
        return pizza.getPreis();                  // (5)
    }
}
a) Überprüfen Sie die markierten Zeilen. Welche Zeilen enthalten einen Fehler oder verstoßen gegen die Konventionen? (mehrere Antworten richtig) 4 P
b) Im Hauptprogramm steht Bestellung b = new Bestellung(); und danach double p = b.getPreis();. Erklären Sie, was geschieht. 2 P
c) Beurteilen Sie Vorschläge, wie mit dem Attribut preis aus Zeile (1) verfahren werden soll. Welcher Vorschlag ist am besten? 2 P
Lösung anzeigen (nach Auswerten freigeschaltet)

Erwartungshorizont: a) (1) öffentliches Attribut verletzt die Datenkapselung; (2) mit void ist das kein Konstruktor, sondern eine gewöhnliche Methode; (3) ohne this. weist sich der Parameter selbst zu, das Attribut bleibt null; (4) Zeichenketten werden mit equals verglichen, nicht mit ==. Zeile (5) ist korrekte Delegation, sofern pizza gesetzt ist (4 P, Abzug je falscher Markierung). b) Weil kein Konstruktor definiert ist, nutzt Java den parameterlosen Standardkonstruktor; pizza bleibt null, der Aufruf pizza.getPreis() bricht mit einer NullPointerException ab (2 P). c) Der Preis steckt bereits in der Pizza. Ein zusätzliches Attribut speichert dieselbe Information doppelt und kann veralten; ein Setter ohne Prüfung oder ein öffentliches Attribut würde die Kapselung weiter schwächen (2 P).

A9
Anmeldung zur Klassenfahrt
AFB III 7 Punkte

Für eine Klassenfahrt sollen sich Teilnehmende anmelden können, bis die Höchstzahl erreicht ist. Die Klasse Teilnehmer ist fertig: Teilnehmer(String name, int bezahlt) mit dem Getter getBezahlt() für den bereits bezahlten Betrag in Euro.

a) Entwerfen Sie die Klasse Klassenfahrt. Welche Klassenkarte eignet sich? 2 P

Umgesetzt wird der Entwurf mit den Attributen private Teilnehmer[] teilnehmer; und private int anzahl;; der Konstruktor legt teilnehmer = new Teilnehmer[max]; an und setzt anzahl = 0;.

b) Implementieren Sie die Methode anmelden: Sie trägt t ein und liefert true, solange noch Platz ist, sonst false. Welche Implementierung ist korrekt? 3 P

Die Klasse erhält zusätzlich folgende Methode:

public int offenerBetrag(int preis) {
    int summe = 0;
    for (int i = 0; i < anzahl; i++) {
        summe = summe + preis - teilnehmer[i].getBezahlt();
    }
    return summe;
}
c) Für new Klassenfahrt(4) melden sich nacheinander Mia (120 € bezahlt), Tom (0 €), Ali (200 €), Lea (50 €) und Ben (80 €) an. Wenden Sie offenerBetrag(200) auf diese Situation an. 2 P
€
Lösung anzeigen (nach Auswerten freigeschaltet)

Erwartungshorizont: a) Die Klassenfahrt kennt viele Teilnehmer-Objekte, also eine Reihung vom Typ Teilnehmer; anzahl merkt sich den nächsten freien Platz. Notation: Attribute privat, Name vor Typ, Konstruktor mit c und ohne Rückgabetyp, anmelden als Anfrage mit Wahrheitswert (2 P). b) Nur bei anzahl < teilnehmer.length ist noch ein Platz frei; mit <= gäbe es beim fünften Versuch einen Zugriff außerhalb der Reihung. Ohne anzahl++ würde jede Anmeldung Platz 0 überschreiben, die Schleife füllt alle Plätze mit demselben Teilnehmer (3 P). c) Ben wird abgelehnt (Reihung voll). Offen: (200 − 120) + (200 − 0) + (200 − 200) + (200 − 50) = 80 + 200 + 0 + 150 = 430 € (2 P).

Ergebnis

Erreicht
0 / 60
Prozent
0 %
Notenpunkte
—
AufgabeThemaPunkte

Punkteverteilung

AufgabeThemaAFBPunkte
A1Medien in der StadtbibliothekAFB I6
A2Zwei KaffeeautomatenAFB I6
A3Ein Wagen für den RegionalzugAFB I6
A4Datenvolumen im HandyvertragAFB II7
A5Songs in der PlaylistAFB II7
A6Frostnächte an der WetterstationAFB II7
A7Aufträge in der Kfz-WerkstattAFB II6
A8Bestellungen der PizzeriaAFB III8
A9Anmeldung zur KlassenfahrtAFB III7
Summe (AFB I: 18 P · AFB II: 27 P · AFB III: 15 P)60

Notenpunkte

PunkteNotenpunkteBeurteilung
57 – 60 P15sehr gut
54 – 56 P14sehr gut
51 – 53 P13sehr gut
48 – 50 P12gut
45 – 47 P11gut
42 – 44 P10gut
39 – 41 P09befriedigend
36 – 38 P08befriedigend
33 – 35 P07befriedigend
30 – 32 P06ausreichend
27 – 29 P05ausreichend
24 – 26 P04ausreichend
20 – 23 P03mangelhaft
17 – 19 P02mangelhaft
12 – 16 P01mangelhaft
0 – 11 P00ungenügend