MINT lernen

Methoden

Zwei Textaufgaben mit Hinweisen und Erwartungshorizont zu Parametern, void und return.

Dein Fortschritt:
0 / 0 Aufgaben
1

Einladungen zur Geburtstagsparty

AFB I–II

Aylin plant ihre Geburtstagsparty. Ihr Programm druckt Einladungskarten und berechnet, wie viele Stühle gebraucht werden: für alle Freunde, alle Familienmitglieder und für sie selbst. Ihr Bruder Cem möchte zwei Zeilen am Ende von main ergänzen (Material 2).

Material 1: Einladung.java
public class Einladung {
    public static void karte(String name, int uhr) {
        System.out.println("Hallo " + name + "!");
        System.out.println("Party um " + uhr + " Uhr");
    }

    public static int gaeste(int freunde, int familie) {
        int summe = freunde + familie;
        return summe + 1;
    }

    public static void main(String[] args) {
        karte("Aylin", 16);
        karte("Ben", 17);
        int stuehle = gaeste(6, 3);
        System.out.println("Stühle: " + stuehle);
    }
}
Das Programm ist fehlerfrei.
Material 2: Cems Ergänzung in main
int x = karte("Cem", 18);
System.out.println(summe);
javac meldet zu beiden Zeilen einen Fehler.
  1. Entnimm Material 1 für beide Methoden außer main den Namen, die Parameter mit Typ und den Rückgabetyp.
  2. Gib die Ausgabe des Programms an.
  3. Erkläre am Beispiel von karte und gaeste den Unterschied zwischen einer Methode mit void und einer Methode mit Rückgabewert.
  4. Begründe für beide Zeilen in Material 2, warum javac sie nicht übersetzt.

Hinweise

Hinweis zu Aufgabe a)
Alles steht im Methodenkopf: public static Rückgabetyp name(Typ parameter, …).
Hinweis zu Aufgabe b)
main startet. Jeder Aufruf springt in die Methode, die Argumente werden in die Parameter eingesetzt.
Hinweis zu Aufgabe c)
Was „kommt zurück“ an die Aufrufstelle? Was macht die Methode stattdessen?
Hinweis zu Aufgabe d)
Zeile 1: Was liefert karte zurück? Zeile 2: Wo wurde summe angelegt, und wo ist die Variable bekannt?

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)
NameParameterRückgabetyp
karteString name, int uhrkeiner (void)
gaesteint freunde, int familieint
Erwartungshorizont zu Aufgabe b)
Hallo Aylin!
Party um 16 Uhr
Hallo Ben!
Party um 17 Uhr
Stühle: 10

gaeste(6, 3) rechnet 6 + 3 = 9 und gibt 9 + 1 = 10 zurück.

Erwartungshorizont zu Aufgabe c)

karte hat den Rückgabetyp void: Sie erledigt etwas (gibt zwei Zeilen aus), liefert aber keinen Wert an die Aufrufstelle. Man ruft sie als eigene Anweisung auf: karte("Ben", 17);

gaeste hat den Rückgabetyp int: Mit return gibt sie eine Ganzzahl zurück, die an der Aufrufstelle weiterverwendet wird, z. B. gespeichert in stuehle. gaeste selbst gibt nichts aus.

Erwartungshorizont zu Aufgabe d)

Zeile 1: karte ist void und liefert keinen Wert. Es gibt nichts, was in int x gespeichert werden könnte (incompatible types: void cannot be converted to int).

Zeile 2: summe ist eine lokale Variable der Methode gaeste. Sie existiert nur innerhalb dieser Methode, in main ist sie unbekannt (cannot find symbol). Den Wert bekommt main nur über die Rückgabe.

2

Brötchen-Rabatt am Schulkiosk

AFB II–III

Der Schulkiosk verkauft belegte Brötchen für 1,20 €. Wer mindestens 5 Stück auf einmal kauft, bekommt 20 % Rabatt auf den Gesamtpreis. Die Schülerfirma hat die Preisberechnung in Python geschrieben und rechnet in Cent, damit keine Rundungsfehler entstehen. Nun soll die Kasse auf Java umgestellt werden. Klara findet: „Methoden sind unnötig. Man kann doch alles direkt in main schreiben.“

Material: Python-Funktion der Schülerfirma
def preis(anzahl, einzelpreis):
    gesamt = anzahl * einzelpreis
    if anzahl >= 5:
        gesamt = gesamt * 80 // 100
    return gesamt
Alle Beträge in Cent; // ist die Ganzzahldivision.
  1. Implementiere die Funktion als Java-Methode preis mit passenden Parameter- und Rückgabetypen.
  2. Untersuche mit deiner Methode die Preise für 1 bis 7 Brötchen. Was fällt dir beim Vergleich von 4 und 5 Brötchen auf?
  3. Entwirf eine Methode reichtGeld, die für ein Guthaben, eine Anzahl und einen Einzelpreis zurückgibt, ob das Geld reicht. Sie soll die Rabattregel nicht noch einmal enthalten. Gib zwei Beispielaufrufe mit Ergebnis an.
  4. Diskutiere Klaras Aussage.

Hinweise

Hinweis zu Aufgabe a)
Alle Werte sind ganze Cent-Beträge. In Java rechnet / bei zwei int schon ganzzahlig. Vergiss public static nicht.
Hinweis zu Aufgabe b)
Lege eine kleine Tabelle an: Anzahl, Preis ohne Rabatt, Preis mit Rabatt. Eine for-Schleife in main kann die Aufrufe für dich erledigen.
Hinweis zu Aufgabe c)
Rückgabetyp boolean. Statt die Rabattregel zu kopieren, rufst du preis auf.„Entwerfen“ heißt: Methodenkopf und Ablauf selbst planen – nicht nur abschreiben.
Hinweis zu Aufgabe d)
Kriterien: Funktioniert es ohne Methoden? Was passiert, wenn der Kiosk die Rabattregel ändert und der Preis an mehreren Stellen gebraucht wird? Lesbarkeit, Testbarkeit, Aufwand bei sehr kleinen Programmen.

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)
public static int preis(int anzahl, int einzelpreis) {
    int gesamt = anzahl * einzelpreis;
    if (anzahl >= 5) {
        gesamt = gesamt * 80 / 100;
    }
    return gesamt;
}

Wichtig: Typen vor den Parametern, Rückgabetyp int, Bedingung in Klammern, // wird zu /. Die Methode steht in einer Klasse neben main.

Erwartungshorizont zu Aufgabe b)
Anzahl1234567
preis(n, 120)120240360480480576672

4 und 5 Brötchen kosten beide 480 Cent = 4,80 €: 5 · 120 = 600, davon 80 % sind 480. Das fünfte Brötchen ist also gratis. Wer 4 kaufen will, sollte besser 5 nehmen. Bei mehr Brötchen steigt der Preis wieder um je 96 Cent.

Erwartungshorizont zu Aufgabe c)
public static boolean reichtGeld(int guthaben, int anzahl, int einzelpreis) {
    return preis(anzahl, einzelpreis) <= guthaben;
}

Beispiele: reichtGeld(500, 5, 120) liefert true (480 ≤ 500), reichtGeld(400, 4, 120) liefert false (480 > 400). Eine Lösung mit if/else und zwei return ist gleichwertig. Die Rabattregel steht nur in preis.

Erwartungshorizont zu Aufgabe d)

Pro Klara: Technisch geht es auch ohne Methoden. Bei einem sehr kurzen Programm, das den Preis nur einmal berechnet, bringt eine Methode kaum Vorteile.

Contra: Die Kasse braucht den Preis an mehreren Stellen (Anzeige, reichtGeld, Bon). Ohne Methode stünde die Rabattregel mehrfach im Code. Ändert der Kiosk sie (z. B. Rabatt ab 6 Stück), muss man jede Stelle finden – vergisst man eine, rechnet die Kasse falsch. Eine Methode mit sprechendem Namen macht main kürzer und lesbarer und lässt sich einzeln testen, wie in b).

Ergebnis: Klaras Aussage stimmt nur für Mini-Programme. Sobald Code mehrfach gebraucht wird, sind Methoden sinnvoll. Jedes begründete Ergebnis mit Pro und Contra ist vollständig.