Einladungen zur Geburtstagsparty
AFB I–IIAylin 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).
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);
}
}
int x = karte("Cem", 18);
System.out.println(summe);
javac meldet zu beiden Zeilen einen Fehler.- Entnimm Material 1 für beide Methoden außer
mainden Namen, die Parameter mit Typ und den Rückgabetyp. - Gib die Ausgabe des Programms an.
- Erkläre am Beispiel von
karteundgaesteden Unterschied zwischen einer Methode mitvoidund einer Methode mit Rückgabewert. - Begründe für beide Zeilen in Material 2, warum
javacsie nicht übersetzt.
Hinweise
Hinweis zu Aufgabe a)
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)
Hinweis zu Aufgabe d)
karte zurück? Zeile 2: Wo wurde summe angelegt, und wo ist die Variable bekannt?Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
| Name | Parameter | Rückgabetyp |
|---|---|---|
karte | String name, int uhr | keiner (void) |
gaeste | int freunde, int familie | int |
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.
Brötchen-Rabatt am Schulkiosk
AFB II–IIIDer 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.“
def preis(anzahl, einzelpreis):
gesamt = anzahl * einzelpreis
if anzahl >= 5:
gesamt = gesamt * 80 // 100
return gesamt
// ist die Ganzzahldivision.- Implementiere die Funktion als Java-Methode
preismit passenden Parameter- und Rückgabetypen. - 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?
- 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. - Diskutiere Klaras Aussage.
Hinweise
Hinweis zu Aufgabe a)
/ bei zwei int schon ganzzahlig. Vergiss public static nicht.Hinweis zu Aufgabe b)
for-Schleife in main kann die Aufrufe für dich erledigen.Hinweis zu Aufgabe c)
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)
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)
| Anzahl | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
preis(n, 120) | 120 | 240 | 360 | 480 | 480 | 576 | 672 |
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.
