MINT lernen

Verzweigungen und Schleifen

Zwei Textaufgaben mit Hinweisen und Erwartungshorizont zu if, while und for in Java.

Dein Fortschritt:
0 / 0 Aufgaben
1

Eintritt ins Freibad

AFB I–II

Das Freibad möchte seine Kasse mit einem Java-Programm betreiben. Kinder unter 6 Jahren zahlen nichts, Kinder und Jugendliche bis einschließlich 17 Jahre zahlen 2,50 €, alle anderen 4,00 €. Wer einen Ferienpass hat, bekommt 1,00 € Rabatt – aber nur, wenn überhaupt etwas zu zahlen ist.

Material: Ausschnitt aus der Kasse
int alter = 15;
boolean ferienpass = true;
double preis;
if (alter < 6) {
    preis = 0.0;
} else if (alter <= 17) {
    preis = 2.5;
} else {
    preis = 4.0;
}
if (ferienpass && preis > 0) {
    preis = preis - 1.0;
}
System.out.println("Eintritt: " + preis + " Euro");
Die Werte von alter und ferienpass werden an der Kasse eingegeben.
  1. Beschreibe den Ablauf des Programms für die angegebenen Werte und gib die Ausgabe an.
  2. Erstelle eine Tabelle mit den Ausgaben für die Alter 5, 6, 17 und 18, jeweils mit und ohne Ferienpass.
  3. Mittwochs ist Schülertag. Ein Mitschüler schreibt dafür if (tag == "Mittwoch"). Begründe, warum Texte in Java anders verglichen werden sollten, und gib die richtige Bedingung an.

Hinweise

Hinweis zu Aufgabe a)
Prüfe die Bedingungen der Reihe nach. Sobald eine Bedingung einer if-else if-Kette zutrifft, werden die übrigen übersprungen. Das zweite if steht für sich allein.
Hinweis zu Aufgabe b)
Die Grenzen sind die spannenden Fälle: Ist 6 „kleiner als 6“? Ist 17 „kleiner oder gleich 17“?
Hinweis zu Aufgabe c)
Ein String ist ein Objekt. Was vergleicht == bei Objekten – den Inhalt oder etwas anderes?

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)

alter < 6 ist falsch (15 ist nicht kleiner als 6). alter <= 17 ist wahr, also wird preis = 2.5 gesetzt; der else-Zweig wird übersprungen. Danach ist ferienpass && preis > 0 wahr (beide Teile wahr), der Preis sinkt auf 1.5. Ausgabe: Eintritt: 1.5 Euro

Erwartungshorizont zu Aufgabe b)
Altermit Ferienpassohne Ferienpass
5Eintritt: 0.0 EuroEintritt: 0.0 Euro
6Eintritt: 1.5 EuroEintritt: 2.5 Euro
17Eintritt: 1.5 EuroEintritt: 2.5 Euro
18Eintritt: 3.0 EuroEintritt: 4.0 Euro

Bei 5 Jahren verhindert preis > 0 einen negativen Preis.

Erwartungshorizont zu Aufgabe c)

Ein String ist ein Objekt. == prüft bei Objekten nur, ob beide Variablen auf dasselbe Objekt verweisen, nicht ob die Texte gleich sind. Wird der Wochentag z. B. eingegeben, entsteht ein neues String-Objekt; == kann dann false liefern, obwohl dort „Mittwoch“ steht. Den Inhalt vergleicht die Methode equals:

if (tag.equals("Mittwoch")) {
2

Noahs Sparschwein

AFB II–III

Noah hat 12 € im Sparschwein und legt jede Woche 7 € dazu. Er will wissen, nach wie vielen Wochen er mindestens 100 € beisammen hat. In Python hat er das schon gelöst (Material 1). Sein Freund Tim hat in Java eine Version mit for-Schleife geschrieben (Material 2).

Material 1: Noahs Python-Programm
guthaben = 12
wochen = 0
while guthaben < 100:
    guthaben = guthaben + 7
    wochen = wochen + 1
print(wochen, "Wochen,", guthaben, "Euro")
Ausgabe: 13 Wochen, 103 Euro
Material 2: Tims Java-Ausschnitt
int guthaben = 12;
for (int w = 0; w <= 13; w++) {
    guthaben = guthaben + 7;
}
System.out.println(guthaben + " Euro");
Tim hat die 13 Wochen aus Noahs Ausgabe übernommen.
  1. Implementiere Noahs Programm aus Material 1 als vollständiges Java-Programm mit einer while-Schleife. Die Ausgabe soll gleich bleiben.
  2. Stelle den Ablauf deines Programms als Tracetabelle dar (Werte von wochen, guthaben und der Bedingung). Es genügen die ersten drei und die letzten zwei Zeilen.
  3. Vergleiche Tims for-Schleife mit deiner while-Schleife: Anzahl der Durchläufe, Ergebnis und Eignung für Noahs Frage.
  4. Noahs Oma legt in jeder vierten Woche zusätzlich 5 € dazu. Erweitere dein Programm entsprechend und gib die neue Ausgabe an.

Hinweise

Hinweis zu Aufgabe a)
Grundgerüst mit Klasse und main, Typen vor die Variablen, Bedingung in runde Klammern, Rumpf in geschweifte Klammern. Die Ausgabe setzt du mit + zusammen.
Hinweis zu Aufgabe b)
Eine Zeile pro Prüfung der Bedingung. Die letzte Zeile ist die, in der die Bedingung falsch ist.
Hinweis zu Aufgabe c)
Zähle, welche Werte w annimmt. Was müsste Tim tun, wenn Noah 150 € sparen will?
Hinweis zu Aufgabe d)
„Jede vierte Woche“: Der Rest von wochen bei Division durch 4 ist 0. Erhöhe den Wochenzähler, bevor du prüfst.

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)
public class Sparschwein {
    public static void main(String[] args) {
        int guthaben = 12;
        int wochen = 0;
        while (guthaben < 100) {
            guthaben = guthaben + 7;
            wochen++;
        }
        System.out.println(wochen + " Wochen, " + guthaben + " Euro");
    }
}

Ausgabe: 13 Wochen, 103 Euro

Erwartungshorizont zu Aufgabe b)
wochenguthabenguthaben < 100
012wahr
119wahr
226wahr
………
1296wahr
13103falsch → Ende
Erwartungshorizont zu Aufgabe c)

Durchläufe: w läuft von 0 bis einschließlich 13, das sind 14 Durchläufe (wegen <=). Die while-Schleife läuft 13-mal.

Ergebnis: Tim erhält 12 + 14 · 7 = 110 Euro statt 103 Euro – eine Woche zu viel. Mit w < 13 stimmte es.

Eignung: Eine for-Schleife passt, wenn die Anzahl der Durchläufe vorher feststeht. Noah kennt sie aber gerade nicht – sie ist die gesuchte Antwort. Tim musste sie aus Noahs Ergebnis abschreiben. Die while-Schleife läuft, „solange“ das Ziel nicht erreicht ist, und findet die Wochenzahl selbst. Für Noahs Frage ist sie daher besser geeignet.

Erwartungshorizont zu Aufgabe d)
while (guthaben < 100) {
    wochen++;
    guthaben = guthaben + 7;
    if (wochen % 4 == 0) {
        guthaben = guthaben + 5;
    }
}
System.out.println(wochen + " Wochen, " + guthaben + " Euro");

Ausgabe: 12 Wochen, 111 Euro (in den Wochen 4, 8 und 12 kommen je 5 € dazu: 12 + 12 · 7 + 3 · 5 = 111).