Wissen und Reproduzieren
18 PunkteDie Stadtbibliothek verwaltet ihre Bücher und Filme mit der Klasse Medium. Die Leihfrist darf zwischen 7 und 28 Tagen liegen.
- - titel: Zeichenkette
- - leihfrist: Ganzzahl
- - ausgeliehen: Wahrheitswert
- c Medium(titel: Zeichenkette, leihfrist: Ganzzahl)
- + getTitel(): Zeichenkette
- + istAusgeliehen(): Wahrheitswert
- + ausleihen()
- + zurueckgeben()
- + setLeihfrist(tage: Ganzzahl)
+ setLeihfrist(tage: Ganzzahl)? 1 PLö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).
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();
k1 als Objektkarte dar — welche Karte ist korrekt? 2 PLö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).
Ein Verkehrsverbund modelliert die Wagen seiner Regionalzüge. Jeder Wagen hat zu Beginn 64 Plätze; die Wagenklasse darf nur 1 oder 2 sein.
- - 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.
plaetze 1 PgetPlaetze 1 PsetKlasse 2 PLö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).
Zusammenhänge herstellen
27 PunkteEin 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.
verbraucht nach v.surfen(2500) 2 Pvolumen nach v.buchen(1000) 1 Pr am Ende 2 Psurfen nur aus verbraucht = verbraucht + mb;. Welchen Wert hätte r dann am Ende? 2 PLö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).
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();
d? 2 PSong-Objekte existieren nach dem Programmausschnitt? 2 PLö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).
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.
Messwert-Objekte existieren direkt nach new Wetterstation()? 1 Ps.anzahlFrost() am Ende? 2 Pwerte enthalten am Ende null? 2 Pwerte[i] != null &&. Begründen Sie, was dann beim Aufruf von s.anzahlFrost() geschieht. 2 PLö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).
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().
Auftrag und Fahrzeug im Klassendiagramm. Welche Darstellung ist korrekt? 2 Pau? 2 PAuftrag au = new Auftrag(f, 3); angelegt. Berechnen Sie den Wert von au.kosten(68). 2 PLö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).
Verallgemeinern und beurteilen
15 PunkteEin 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)
}
}
Bestellung b = new Bestellung(); und danach double p = b.getPreis();. Erklären Sie, was geschieht. 2 Ppreis aus Zeile (1) verfahren werden soll. Welcher Vorschlag ist am besten? 2 PLö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).
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.
Klassenfahrt. Welche Klassenkarte eignet sich? 2 PUmgesetzt 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;.
anmelden: Sie trägt t ein und liefert true, solange noch Platz ist, sonst false. Welche Implementierung ist korrekt? 3 PDie 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;
}
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 PLö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
| Aufgabe | Thema | Punkte |
|---|
Punkteverteilung
| Aufgabe | Thema | AFB | Punkte |
|---|---|---|---|
| A1 | Medien in der Stadtbibliothek | AFB I | 6 |
| A2 | Zwei Kaffeeautomaten | AFB I | 6 |
| A3 | Ein Wagen für den Regionalzug | AFB I | 6 |
| A4 | Datenvolumen im Handyvertrag | AFB II | 7 |
| A5 | Songs in der Playlist | AFB II | 7 |
| A6 | Frostnächte an der Wetterstation | AFB II | 7 |
| A7 | Aufträge in der Kfz-Werkstatt | AFB II | 6 |
| A8 | Bestellungen der Pizzeria | AFB III | 8 |
| A9 | Anmeldung zur Klassenfahrt | AFB III | 7 |
| Summe (AFB I: 18 P · AFB II: 27 P · AFB III: 15 P) | 60 | ||
Notenpunkte
| Punkte | Notenpunkte | Beurteilung |
|---|---|---|
| 57 – 60 P | 15 | sehr gut |
| 54 – 56 P | 14 | sehr gut |
| 51 – 53 P | 13 | sehr gut |
| 48 – 50 P | 12 | gut |
| 45 – 47 P | 11 | gut |
| 42 – 44 P | 10 | gut |
| 39 – 41 P | 09 | befriedigend |
| 36 – 38 P | 08 | befriedigend |
| 33 – 35 P | 07 | befriedigend |
| 30 – 32 P | 06 | ausreichend |
| 27 – 29 P | 05 | ausreichend |
| 24 – 26 P | 04 | ausreichend |
| 20 – 23 P | 03 | mangelhaft |
| 17 – 19 P | 02 | mangelhaft |
| 12 – 16 P | 01 | mangelhaft |
| 0 – 11 P | 00 | ungenügend |
