MINT lernen

Abituraufgaben: Parameter und Rückgabewerte

Zwei Abituraufgaben zu Operationen, Parametern und Rückgabewerten — mit Hinweisen und Erwartungshorizont.

Dein Fortschritt:
0 / 0 Aufgaben
1

Das Parkhaus

AFB I–II

Ein 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.

  1. Implementieren Sie die Operation gebuehr in Java.
  2. Wenden Sie Ihre Operation auf die Parkdauern 20, 130 und 500 Minuten an und notieren Sie jeweils den Rückgabewert.
  3. Begründen Sie die Wahl des Rückgabetyps und des Parametertyps sowie die Entscheidung, das Ergebnis mit return zurückzugeben, statt es in der Operation auszugeben.

Hinweise

Hinweis zu Aufgabe a)
Notiere zuerst den Kopf: Was kommt hinein, was kommt heraus — mit welchen Typen? Dann die drei Fälle: kostenlos, normal, gedeckelt.
Hinweis zu Aufgabe b)
Ziehe die freien 30 Minuten zuerst ab und vergleiche das Ergebnis mit dem Höchstsatz.
Hinweis zu Aufgabe c)
Welche Werte kann die Parkdauer annehmen, welche der Betrag? Was möchte der Kassenautomat mit dem Ergebnis noch tun?

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)
Java
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.

2

Die Fitnessuhr

AFB II–III

Eine 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:

Java
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");
}
  1. Analysieren Sie den Aufruf bericht(30) (Werte der Parameter beider Operationen, Ausgabe) sowie die Aufrufe kalorien(45, 70.0, 8.0) und kalorien(45, 70, 8.0), mit denen eine 70 kg schwere Person 45 Minuten Laufen erfassen wollte.
  2. 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 dabei kalorien.
  3. Bewerten Sie den Entwurf der Operation bericht im Hinblick auf Wiederverwendbarkeit und machen Sie einen begründeten Verbesserungsvorschlag.

Hinweise

Hinweis zu Aufgabe a)
Die Argumente werden der Reihe nach kopiert. Prüfe bei den beiden Aufrufen auch die Typen — und ob das Ergebnis zufällig trotzdem stimmt.
Hinweis zu Aufgabe b)
Kopf zuerst: Welche drei Parameter mit welchen Typen, welcher Rückgabetyp? Im Rumpf zweimal kalorien aufrufen.
Hinweis zu Aufgabe c)
Welche Werte sind in 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)
Java
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.