MINT lernen

Verzweigungen und Schleifen

Wie kann ein einziges Semikolon an der falschen Stelle aus zehn Runden eine einzige machen?

Dein Fortschritt:
0 / 0 Aufgaben
1

Übungsaufgaben

Zehn Übungen zum Klicken, Ziehen und Knobeln — von AFB I bis AFB III. Jede Übung gibt dir sofort Rückmeldung; wenn du hängst, helfen dir die gestuften Tipps.

A1
Wann warnt das Handy?
AFB I

Eine App prüft den Zustand deines Handys. Welche Bedingungen sind wahr?

int akku = 15;
boolean ladekabel = false;
String modus = "Spiel";
Mehrere Antworten sind richtig. Markiere alle zutreffenden und klicke dann auf „Prüfen“.
Die Randwerte sind die Falle: 15 ist nicht größer als 15, und akku <= 15 ist wahr — verneint also falsch. && braucht beide Seiten wahr; weil ladekabel false ist, wird ladekabel && … sofort falsch. equals vergleicht Texte Zeichen für Zeichen, auch die Groß-/Kleinschreibung: „spiel“ ≠ „Spiel“.
Ansatz: Setze die Werte ein und werte jede Bedingung Stück für Stück aus: Zuerst die Vergleiche, dann !, dann &&.
Weiter: !ladekabel bedeutet „nicht ladekabel“ — also true, weil ladekabel false ist.
A2
Von Python nach Java
AFB I

Welche Java-Zeile entspricht der Python-Zeile?

Ansatz: Achte auf die logischen Wörter and, or, not — in Java werden daraus Zeichen.
Weiter: Bei den for-Schleifen verrät die Schrittweite (i++ oder i += 5), welche Zeile passt.
A3
Welche Struktur passt?
AFB I

Ein Spiel soll so lange nach dem Passwort fragen, bis es richtig eingegeben wurde. Finde mit dem Entscheidungsbaum die passende Struktur.

Beantworte die Fragen des Entscheidungsbaums mit Ja oder Nein und schau, wo du herauskommst.
    Niemand weiß vorher, wie viele Versuche jemand braucht — deshalb ist das ein Fall für while (!eingabe.equals(passwort)). Faustregel: Ist die Anzahl der Wiederholungen bekannt (10 Runden, 7 Tage), nimm for; hängt sie von etwas ab, das erst beim Ausführen passiert, nimm while.
    Ansatz: Wird die Frage nach dem Passwort einmal oder mehrmals gestellt?
    Weiter: Kann das Programm vorher wissen, wie oft sich jemand vertippt?
    A4
    Eintrittspreis im Kino
    AFB II

    Kinder unter 6 Jahren sind frei. Am Kinotag (Dienstag) zahlen alle anderen 5 €. Sonst zahlen Jugendliche unter 18 Jahren 7 € und Erwachsene 10 €. Ergänze — zwei Bausteine bleiben übrig.

    Wort anklicken, dann Lücke anklicken (oder umgekehrt) — mit Tab und Enter geht es genauso. Ein Klick auf eine gefüllte Lücke legt das Wort zurück.

    (alter < 6) {
        preis = 0;
    } (tag.("Dienstag")) {
        preis = 5;
    } else if (alter 18) {
        preis = 7;
    } {
        preis = 10;
    }

    elif ist Python, in Java heißt es else if. == bleibt übrig, weil Texte mit equals verglichen werden: == prüft bei Strings nur, ob es dasselbe Objekt ist — das kann bei einem eingelesenen „Dienstag“ falsch sein, obwohl die Buchstaben gleich sind. Die Reihenfolge der Zweige ist wichtig: Java nimmt den ersten passenden. Stünde die Dienstags-Prüfung vor alter < 6, müssten Kleinkinder dienstags zahlen.
    Ansatz: Eine Kette beginnt mit if, hat beliebig viele else if und endet mit else ohne Bedingung.
    Weiter: Mit welcher Methode vergleicht man in Java zwei Texte?
    A5
    Das Sparschwein
    AFB II

    Mo legt jede Woche 15 € ins Sparschwein, bis mindestens 100 € drin sind.

    int gespart = 0;
    int wochen = 0;
    while (gespart < 100) {
        gespart += 15;
        wochen++;
    }
    System.out.println(wochen);

    Welche Zahl wird ausgegeben?

    Rechne selbst und trage das Ergebnis ein — Enter prüft direkt.
    Nach 6 Wochen sind es 90 € — 90 < 100 ist noch wahr, also läuft die Schleife ein siebtes Mal: 105 €. Jetzt ist die Bedingung falsch, die Schleife endet, ausgegeben wird 7. Wer 100 / 15 ≈ 6,67 rechnet und abrundet, landet bei 6 — die Schleife prüft aber immer vor dem Durchlauf, ob das Ziel schon erreicht ist.
    Ansatz: Lege eine Tabelle mit den Spalten gespart und wochen an und fülle sie Durchlauf für Durchlauf.
    Weiter: Die Schleife hört erst auf, wenn gespart < 100 falsch ist — also bei 100 € oder mehr.
    A6
    Wie oft läuft die Schleife?
    AFB II

    Sortiere die Schleifenköpfe danach, wie oft der Rumpf ausgeführt wird. Im Rumpf der for-Schleifen wird i nicht verändert.

    Ziehe jede Karte in den passenden Korb — oder wähle sie mit Enter aus und drücke dann die Ziffer des Korbs (0 legt sie zurück).
    1keinmal
    2genau 4-mal
    3endlos
    Keinmal: Ist die Bedingung schon beim Start falsch, läuft der Rumpf nie — auch nicht einmal. 4-mal: 0,1,2,3 · 1,2,3,4 · 3,5,7,9. Endlos: Wenn sich die Zählvariable nie ändert (k bleibt 0, 0 * 2 bleibt 0) oder die Bedingung nie falsch wird: i springt 0, 2, 4, 6 … und ist nie genau 5. Deshalb ist < sicherer als !=.
    Ansatz: Schreibe für jeden Kopf die ersten Werte der Zählvariable auf und prüfe jedes Mal die Bedingung.
    Weiter: Frage dich bei „verdächtigen“ Schleifen: Ändert sich die Variable überhaupt? Und kann die Bedingung jemals falsch werden?
    A7
    Countdown zum Start
    AFB II

    Das Programm soll 10, 9, 8, … 1 untereinander ausgeben und danach „Los!“. Bring die Zeilen in die richtige Reihenfolge.

    Ziehe die Karten in die richtige Reihenfolge — mit der Tastatur: ↑/↓ verschiebt, Shift+↑/↓ wechselt nur den Fokus.
    1int t = 10;
    2while (t > 0) {
    3    System.out.println(t);
    4    t--;
    5}
    6System.out.println("Los!");
    Die heikle Stelle ist die Reihenfolge im Rumpf: Stünde t--; vor der Ausgabe, erschiene 9, 8, … 0. Und „Los!“ muss hinter der schließenden Klammer stehen — sonst würde es zehnmal ausgegeben. Genau das zeigt Java nur über die Klammern, nicht über die Einrückung.
    Ansatz: Was muss vor der Schleife feststehen? Was gehört in den Rumpf, was danach?
    Weiter: Die erste Zahl soll 10 sein. Wird also erst ausgegeben oder erst verkleinert?
    A8
    Sprünge auf dem Spielbrett
    AFB III

    Eine Spielfigur springt in Dreierschritten über ein Brett mit 20 Feldern. Auf geraden Feldern gibt es Punkte, auf ungeraden Feldern ab 11 einen Treffer.

    int summe = 0;
    int treffer = 0;
    for (int i = 1; i <= 20; i += 3) {
        if (i % 2 == 0) {
            summe += i;
        } else if (i > 10) {
            treffer++;
        }
    }
    Rechne die Kette Schritt für Schritt: Erst wenn ein Schritt stimmt, wird der nächste freigeschaltet. Enter prüft.
    1. Wie oft wird der Schleifenrumpf ausgeführt? -mal
    2. Wert von summe nach der Schleife
    3. Wert von treffer nach der Schleife
    4. Transfer: Die Bedingung wird zu i < 19 geändert. Wie oft läuft der Rumpf jetzt? -mal
    i nimmt die Werte 1, 4, 7, 10, 13, 16, 19 an — 7 Durchläufe (22 wäre zu groß). Gerade: 4 + 10 + 16 = 30. Ungerade und größer als 10: 13 und 19, also 2 Treffer — 1 und 7 sind ungerade, aber zu klein. Wichtig: Ein gerades Feld über 10 (16) zählt nicht als Treffer, weil der else if-Zweig nur geprüft wird, wenn der erste falsch war. Mit i < 19 fällt genau der letzte Wert 19 weg.
    Ansatz: Liste alle Werte von i auf: bei 1 beginnen, immer +3, solange i <= 20.
    Weiter: Markiere in deiner Liste die geraden Zahlen. Nur bei den übrigen (ungeraden) wird geprüft, ob i > 10 ist.
    A9
    Bedingungen mit Typen
    AFB IIIMix

    Hier treffen Bedingungen auf die Datentypen aus 1.1.2. Es gilt: int a = 7; double b = 3.5; String s = "7"; Ist die Bedingung wahr, falsch — oder meldet javac einen Fehler?

    Setze pro Zeile genau ein Kreuz. Enter setzt und löscht.
    BedingungwahrfalschFehler
    a / 2 == b
    a / 2.0 == b
    s.equals("7")
    a == s
    a % 2 == 1 && b > 3
    !(a > 5) || b < 3
    if (b = 7)
    a / 2 ist Ganzzahldivision (3), und 3 ≠ 3.5. Mit 2.0 stimmt es. Eine Zahl und einen Text kann man nicht mit == vergleichen („bad operand types for binary operator '=='“) — anders als in Python, wo einfach False herauskäme. b = 7 ist eine Zuweisung, kein Vergleich; ihr Ergebnis ist ein double und keine Bedingung („double cannot be converted to boolean“).
    Ansatz: Prüfe zuerst, ob die Typen links und rechts überhaupt zusammenpassen. Erst dann rechnest du.
    Weiter: Achte auf den Unterschied zwischen = und ==. Und: Was ergibt 7 / 2 bei zwei ints?
    A10
    Trick: Zehn Runden?
    AFB IIITrick

    Ein Trainingsprogramm soll 10 Runden zählen. Genau hinsehen!

    int runden = 0;
    for (int i = 0; i < 10; i++); {
        runden++;
    }
    System.out.println(runden);

    Welche Zahl wird ausgegeben? Trage −1 ein, falls javac einen Fehler meldet.

    Überlege selbst und trage das Ergebnis ein — Enter prüft direkt.
    Ausgegeben wird 1. Das Semikolon direkt hinter dem Schleifenkopf ist eine leere Anweisung — sie ist der ganze Rumpf und läuft zehnmal, ohne etwas zu tun. Der Block { runden++; } ist danach ein ganz normaler Block, der genau einmal ausgeführt wird. javac meldet keinen Fehler, weil beides erlaubt ist. Merke: Hinter for (…), while (…) und if (…) steht nie ein Semikolon.
    Ansatz: Vergleiche Zeile 2 Zeichen für Zeichen mit einem normalen for-Kopf. Was steht da zusätzlich?
    Weiter: Ein Semikolon beendet eine Anweisung — auch eine leere. Was ist dann der Rumpf der Schleife?