Das Parkhaus
AFB I–IIEin Parkhaus am Stadtrand berechnet seine Gebühren minutengenau: Die ersten 30 Minuten sind kostenlos. Danach kostet jede weitere Minute 0,04 €. Mehr als 15 € (Tageshöchstsatz) werden nie berechnet. Die Parkdauer wird in ganzen Minuten gemessen. Der Kassenautomat soll die Gebühr mit einer Operation gebuehr berechnen, die die Parkdauer als Parameter erhält und den Betrag in Euro zurückgibt.
- Implementieren Sie die Operation
gebuehrin Java. - Wenden Sie Ihre Operation auf die Parkdauern 20, 130 und 500 Minuten an und notieren Sie jeweils den Rückgabewert.
- Begründen Sie die Wahl des Rückgabetyps und des Parametertyps sowie die Entscheidung, das Ergebnis mit
returnzurückzugeben, statt es in der Operation auszugeben.
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
double gebuehr(int minuten) { if (minuten <= 30) { return 0; } double betrag = (minuten - 30) * 0.04; if (betrag > 15) { return 15; } return betrag; }
Gleichwertig ist eine Lösung mit einer lokalen Variable und nur einem return am Ende. return 0; ist erlaubt, weil der int-Wert automatisch zu double erweitert wird.
Erwartungshorizont zu Aufgabe b)
gebuehr(20): 20 ≤ 30 → 0.0 €. gebuehr(130): (130 − 30) · 0.04 = 4.0 €. gebuehr(500): (500 − 30) · 0.04 = 18.8 > 15 → 15.0 €.
Erwartungshorizont zu Aufgabe c)
Die Parkdauer wird in ganzen Minuten gemessen, daher ist int als Parametertyp passend. Der Betrag hat Cent-Anteile (z. B. 4,36 €), deshalb ist der Rückgabetyp double. Mit return steht der Wert dem Aufrufer zur Verfügung: Der Automat kann ihn anzeigen, mit dem eingeworfenen Geld vergleichen, Wechselgeld berechnen oder auf einen Beleg drucken. Eine reine Ausgabe in der Operation würde den Wert nur anzeigen — weiterrechnen könnte das Programm damit nicht, und die Operation wäre an eine bestimmte Art der Anzeige gebunden.
Die Fitnessuhr
AFB II–IIIEine Fitnessuhr schätzt den Energieverbrauch beim Sport. Die Formel lautet: Körpermasse in kg mal Dauer in Minuten mal Sportfaktor, geteilt durch 60 (Faktor 8.0 für Laufen, 6.0 für Radfahren). Die Entwickler haben folgenden Java-Code geschrieben:
double kalorien(double gewicht, int minuten, double faktor) { return gewicht * minuten * faktor / 60; } void bericht(int minuten) { double k = kalorien(70, minuten, 8.0); System.out.println("Verbrauch: " + k + " kcal"); }
- Analysieren Sie den Aufruf
bericht(30)(Werte der Parameter beider Operationen, Ausgabe) sowie die Aufrufekalorien(45, 70.0, 8.0)undkalorien(45, 70, 8.0), mit denen eine 70 kg schwere Person 45 Minuten Laufen erfassen wollte. - Erweitern Sie den Code um eine Operation
kalorienWoche, die für eine Person mit gegebener Körpermasse die Gesamtminuten Laufen und die Gesamtminuten Radfahren einer Woche erhält und den gesamten Verbrauch zurückgibt. Nutzen Sie dabeikalorien. - Bewerten Sie den Entwurf der Operation
berichtim Hinblick auf Wiederverwendbarkeit und machen Sie einen begründeten Verbesserungsvorschlag.
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
kalorien aufrufen.Hinweis zu Aufgabe c)
bericht fest eingebaut? Was könnte ein anderer Programmteil mit dem berechneten Verbrauch anfangen wollen?Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
bericht(30): Parameter minuten = 30. Aufruf kalorien(70, 30, 8.0): gewicht = 70.0 (int → double automatisch), minuten = 30, faktor = 8.0. Rückgabe 70.0 · 30 · 8.0 / 60 = 280.0, ausgegeben wird „Verbrauch: 280.0 kcal“.
kalorien(45, 70.0, 8.0) wird nicht übersetzt: Das zweite Argument 70.0 ist ein double und passt nicht in den int-Parameter minuten. kalorien(45, 70, 8.0) wird übersetzt, vertauscht aber Gewicht und Dauer (gewicht = 45.0, minuten = 70). Das Ergebnis 420.0 ist trotzdem richtig, weil die Formel beide Werte nur multipliziert. Der Fehler bleibt also unentdeckt — ändert man später die Formel (z. B. Grundumsatz abhängig vom Gewicht), wird er wirksam.
Erwartungshorizont zu Aufgabe b)
double kalorienWoche(double gewicht, int minLauf, int minRad) { double lauf = kalorien(gewicht, minLauf, 8.0); double rad = kalorien(gewicht, minRad, 6.0); return lauf + rad; }
Beispiel: kalorienWoche(60, 90, 120) = 60 · 90 · 8 / 60 + 60 · 120 · 6 / 60 = 720.0 + 720.0 = 1440.0.
Erwartungshorizont zu Aufgabe c)
bericht ist schlecht wiederverwendbar: Gewicht (70) und Sportfaktor (8.0) sind fest eingebaut, die Operation gilt also nur für eine Person und nur fürs Laufen. Außerdem gibt sie das Ergebnis nur aus: Kein anderer Programmteil kann den Wert weiterverwenden, etwa für eine Wochensumme oder ein Diagramm. Positiv ist, dass die Berechnung selbst in kalorien ausgelagert ist. Vorschlag: Gewicht und Faktor als Parameter übergeben und Berechnung und Ausgabe trennen — z. B. void bericht(double gewicht, int minuten, double faktor), die nur noch kalorien(gewicht, minuten, faktor) ausgibt, während alle Rechnungen mit dem Rückgabewert von kalorien arbeiten.
