Bedingungen und Schleifen in Java

Lerne, wie ein Java-Programm Entscheidungen trifft und Aufgaben wiederholt. Formuliere Bedingungen mit Vergleichsoperatoren und logischen Operatoren, wähle mit if, else if-Ketten und switch-Ausdrücken zwischen Ausführungspfaden und wiederhole Anweisungen mit while-, do-while- und for-Schleifen. Verwende dabei break und continue, wo sie helfen. Wende anschließend die gängigen Schleifenmuster zum Zählen, Summieren, Berechnen von Mittelwerten, Bestimmen des größten Werts, Suchen und Ausgeben von Tabellen an und prüfe deine Schleifen, indem du sie Durchlauf für Durchlauf nachvollziehst.

AnfängerEinheit 2 von 11 in Kurs: Java-Programmierung – Klassen, Vererbung, Collections und Streams

Was du lernst

  1. Erstelle aus Vergleichen Bedingungen, die wahr oder falsch sind, und verknüpfe sie mit logischen Operatoren, damit ein Programm genau die Situation prüft, die du meinst.
    • Vergleiche Werte und speichere die Ergebnisse als boolesche Werte
      Verwende die sechs Vergleichsoperatoren für Zahlen und Zeichen, speichere Ergebnisse in boolean-Variablen und vergleiche Strings und Dezimalzahlen korrekt.
    • Verknüpfe Bedingungen mit &&, || und !
      Verknüpfe und negiere Bedingungen mit logischen Operatoren, sage ihre Ergebnisse mithilfe von Wahrheitstabellen voraus und verwende Kurzschlussauswertung und De Morgansche Gesetze, um korrekte, lesbare Prüfungen zu schreiben.
  2. Lass ein Programm abhängig von Bedingungen unterschiedliche Anweisungen ausführen: von einem einzelnen if über else if-Ketten und den bedingten Operator bis hin zu switch.
    • Führe Code mit if und else abhängig von einer Bedingung aus
      Schreibe if- und if-else-Anweisungen mit korrekten Blöcken, vermeide die klassischen Fehler bei Klammern, Semikolons und Gültigkeitsbereichen und verschachtele Entscheidungen oder wähle mit dem bedingten Operator einen Wert aus.
    • Wähle mit else-if-Ketten einen von mehreren Fällen aus
      Verwende else if-Ketten, um genau eines von mehreren Ergebnissen auszuwählen, ordne die Bedingungen richtig und teste die Grenzwerte, damit kein Wert in eine Lücke oder in zwei Fälle fällt.
    • Wähle mit switch anhand eines Werts aus
      Verwende switch-Anweisungen und switch-Ausdrücke, um anhand des Werts einer Variablen auszuwählen: mit Fällen mit Pfeil, mehreren Marken pro Fall, default und yield. Erkenne außerdem Fall-through in der älteren Doppelpunktform.
  3. Schreibe while-, do-while- und for-Schleifen, die genau so oft wie nötig ausgeführt werden und zum richtigen Zeitpunkt enden, und steuere sie mit break und continue.
    • Wiederhole Anweisungen mit while, solange eine Bedingung erfüllt ist
      Schreibe while-Schleifen, die korrekt beginnen, aktualisiert werden und enden, verwende while (true) mit break für Wiederholungen ohne vorab festgelegtes Ende und vollziehe eine Schleife Durchlauf für Durchlauf nach.
    • Führe den Schleifenrumpf mit do-while mindestens einmal aus
      Verwende die do-while-Schleife, wenn der Rumpf vor der ersten Prüfung ausgeführt werden muss, etwa bei Eingabeprüfungen und Menüs, und vermeide ihre Fallstricke bei Gültigkeitsbereichen und Semikolons.
    • Durchlaufe Zahlenbereiche mit for-Schleifen
      Schreibe for-Schleifen, die aufwärts, abwärts und in Schritten zählen, sage ihre Anzahl an Durchläufen voraus, vermeide Off-by-one-Fehler und wähle die passende Schleifenart für eine Aufgabe.
    • Beende Schleifen mit break und überspringe Schleifendurchläufe mit continue
      Beende eine Schleife vorzeitig mit break, überspringe den Rest eines Durchlaufs mit continue, verlasse verschachtelte Schleifen mit einem break mit Sprungmarke und halte Schleifen mit vorzeitigem Abbruch übersichtlich.
  4. Erkenne und kombiniere die gängigen Schleifenmuster: Zählen und Summieren, Bestimmen von Extremwerten, Suchen, Verarbeiten von Ziffern und Verschachteln von Schleifen. Prüfe Schleifen, indem du ihren Ablauf nachvollziehst und sie testest.
    • Zähle Werte und berechne ihre Summe und ihren Mittelwert
      Verwende Zähler und Akkumulatoren bei Eingaben mit Endemarkierung, berechne Mittelwerte und Prozentsätze ohne Fehler durch Ganzzahldivision und schütze dich vor leeren Eingaben und Überlauf.
    • Bestimme Extremwerte, suche nach Werten und verarbeite Ziffern
      Verfolge den bisher größten oder kleinsten Wert, suche mit einem Flag oder einem vorzeitigen Abbruch, prüfe, ob mindestens ein Wert oder alle Werte eine Bedingung erfüllen, und zerlege Zahlen Ziffer für Ziffer.
    • Verschachtele Schleifen, vollziehe ihren Ablauf nach und teste sie
      Schreibe verschachtelte Schleifen für Tabellen und Muster, sage voraus, wie oft der innere Rumpf ausgeführt wird, vollziehe Schleifen mit einer Tabelle nach und teste sie mit Randfällen, um Off-by-one-Fehler und Endlosschleifen zu finden.

Bedingungen und Schleifen in Java einfach erklärt

4 Kapitel

1

Erstelle Bedingungen, die wahr oder falsch sind

Eine Bedingung wandelt eine Frage zu Programmdaten in einen Wert um, der wahr oder falsch ist. Mit Vergleichen kannst du fragen, ob eine Zahl einen Schwellenwert erreicht oder ein Text einem Befehl entspricht; mit logischen Operatoren kannst du diese Prüfungen verknüpfen. Lies die Teile einer Bedingung in der Reihenfolge, in der Java sie auswertet, und prüfe dann das Gesamtergebnis. So kannst du einen Bereich, eine Ausnahme oder eine Schutzbedingung für eine sichere Division ausdrücken, ohne dass ein kleiner Fehler beim Operator die Regel verändert.

1.1 Vergleiche und boolesche Werte

Eine Bedingung hat den Typ boolean: Sie liefert true oder false. Java benötigt dieses ausdrückliche Ergebnis in einer if- oder Schleifenbedingung. Eine ganze Zahl allein ist keine Bedingung, daher lässt sich while (count) nicht kompilieren; count > 0 stellt eine eindeutige Frage, die wahr oder falsch sein kann.

Zahlen und Zeichen vergleichen
OperatorFrage
<Ist der linke Wert kleiner?
<=Ist er kleiner oder gleich?
>Ist er größer?
>=Ist er größer oder gleich?
==Sind die Werte gleich?
!=Sind die Werte verschieden?

Bei int a = 7; und int b = 10; sind a < b und a != b gleich true, während a >= b gleich false ist. Verschiedene Zahlentypen können verglichen werden: 3 == 3.0 ist true, nachdem Java die ganze Zahl erweiternd in einen double-Wert umgewandelt hat.

Bei einem char-Vergleich werden Unicode-Codenummern verwendet. Zum Beispiel ist 'a' < 'b' gleich true. Das gilt auch für 'Z' < 'a': Die Codes sind 90 und 97. Alle ASCII-Großbuchstaben von A bis Z stehen in dieser Ordnung vor den Kleinbuchstaben von a bis z.

Eine nützliche Antwort speichern
int age = 17;
boolean isAdult = age >= 18;
System.out.println(isAdult);

Der Vergleich ergibt false. Dieser Wert wird in isAdult gespeichert und anschließend ausgegeben. Ein aussagekräftiger Name erlaubt es, später im Code direkt if (isAdult) zu schreiben.

Halte Zuweisung und Vergleich auseinander. = speichert einen Wert; == vergleicht Werte. Bei einer ganzen Zahl schlägt if (x = 5) fehl, weil die Zuweisung eine ganze Zahl liefert. Bei einem booleschen Wert wird if (done = true) kompiliert, setzt done auf true und führt den Zweig aus. Um das vorhandene Flag zu prüfen, schreibe if (done).

Text und berechnete Dezimalzahlen vergleichen

Verwende command.equals("quit"), um die Zeichen eines Strings zu vergleichen. Der als „quit“ eingegebene Text stimmt überein, „Quit“ nicht. Verwende equalsIgnoreCase, wenn Groß- und Kleinschreibung keine Rolle spielen sollen, und !command.equals("quit"), um auf unterschiedlichen Text zu prüfen. Der Operator == prüft, ob Strings auf dasselbe Objekt verweisen, und ist daher für den Inhaltsvergleich von Benutzereingaben ungeeignet.

Binäre Gleitkommazahlen können viele Dezimalbrüche nicht exakt speichern. 0.1 + 0.2 ergibt 0.30000000000000004, daher ist 0.1 + 0.2 == 0.3 gleich false. Ein Vergleich mit Toleranz prüft, wie weit die berechneten Werte auseinanderliegen:

double sum = 0.1 + 0.2;
boolean closeEnough = Math.abs(sum - 0.3) < 1e-9;

Hier sorgt Math.abs dafür, dass die Differenz nicht negativ ist; die winzige Differenz liegt unter 1e-9, daher ist closeEnough gleich true. Wähle eine Toleranz, die zur benötigten Genauigkeit der Berechnung passt. Bei exakten Vergleichen von int-Werten tritt das Problem der Gleitkommarundung nicht auf.

Teilbarkeit und Bereiche prüfen

n % 3 == 0 prüft, ob eine ganze Zahl durch 3 teilbar ist. Verwende für ungerade Zahlen n % 2 != 0: Der Test schließt negative ungerade Werte ein, da -7 % 2 gleich -1 ist.

Schreibe jede Seite einer Bereichsprüfung einzeln: 0 < x && x < 10. Java kann 0 < x < 10 nicht als mathematische Verkettung lesen: Der erste Vergleich liefert bereits einen booleschen Wert, der nicht mit 10 verglichen werden kann.

Wichtige Erkenntnisse

  • Eine Bedingung muss einen boolean-Wert liefern.
  • Verwende = für Zuweisungen und == zum Vergleichen von Zahlenwerten.
  • Vergleiche String-Inhalte mit equals oder equalsIgnoreCase.
  • Vergleiche berechnete Dezimalzahlen mit einer passenden Toleranz.
  • Verwende n % 2 != 0 für ungerade ganze Zahlen, auch für negative.

1.2 Verknüpfte Bedingungen und Kurzschlussauswertung

Logische Operatoren verknüpfen vollständige Bedingungen, die wahr oder falsch sind. Lies eine verknüpfte Bedingung als Regel über die Daten und teste dann Werte, die sie erfüllen sollten, und Werte, die sie nicht erfüllen sollten.

Prüfungen verknüpfen und negieren

&& bedeutet und: Beide Teile müssen wahr sein. || bedeutet oder: Mindestens ein Teil muss wahr sein, auch wenn beide wahr sind. ! bedeutet nicht und kehrt einen booleschen Wert um.

| p | q | p && q | p || q | | --- | --- | --- | --- | | true | true | true | true | | true | false | false | true | | false | true | false | true | | false | false | false | false |

Eine angenehme Temperatur von 18 bis einschließlich 24 °C braucht beide Schranken: temp >= 18 && temp <= 24. Außerhalb dieses Intervalls bedeutet temp < 18 || temp > 24. Verknüpfst du die Schranken für den inneren Bereich mit ||, wird jede Zahl akzeptiert: Unter 18 ist die Prüfung der oberen Schranke wahr, und über 24 ist die Prüfung der unteren Schranke wahr.

Jeder Operand muss ein boolescher Ausdruck sein. Schreibe x == 1 || x == 2, denn x == 1 || 2 setzt eine ganze Zahl an eine Stelle, an der ein boolescher Wert erforderlich ist. Bei einer ganzen Zahl ist !x > 5 ungültig; !(x > 5) negiert den gesamten Vergleich.

Nur das Nötige auswerten

Java wertet && und || von links nach rechts aus und verwendet Kurzschlussauswertung, wenn der linke Teil das Ergebnis festlegt. Bei && überspringt eine falsche linke Seite die rechte Seite. Bei || überspringt eine wahre linke Seite die rechte Seite.

int total = 36;
int count = 0;
boolean largeAverage = count != 0 && total / count > 10;

Der erste Vergleich ist falsch, daher wird die Division übersprungen und largeAverage wird zu false. Vertauschst du die Operanden, findet die Division vor der Schutzbedingung statt; die Ganzzahldivision durch null wirft eine ArithmeticException. Setze die Sicherheitsprüfung vor die Berechnung, die sie schützt.

Die Gruppierung sichtbar machen

Von der höchsten zur niedrigsten Rangfolge stehen die relevanten Operatoren so: !, Größenvergleiche (<, <=, >, >=), Gleichheitsvergleiche (==, !=), &&, dann ||. Daher wird a || b && c als a || (b && c) gruppiert. Ist a wahr und sind b und c falsch, ist dieser Ausdruck wahr; (a || b) && c ist falsch. Klammern zeigen, welche Regel du meinst.

De Morgansche Gesetze übertragen eine Negation über eine verknüpfte Bedingung:

  • !(p && q) entspricht !p || !q.
  • !(p || q) entspricht !p && !q.

Negiere jeden Teil und vertausche den verknüpfenden Operator. Auf den Temperaturbereich angewendet, entspricht !(temp >= 18 && temp <= 24) dem Ausdruck temp < 18 || temp > 24.

Eine Regel mit Ausnahme ausdrücken

Ein gregorianisches Schaltjahr ist durch 4 teilbar, mit der Ausnahme, dass ein Jahrhundertjahr durch 400 teilbar sein muss:

boolean leap = (year % 4 == 0 && year % 100 != 0)
        || year % 400 == 0;

Der erste Teil akzeptiert 2024. Er weist 1900 zurück, weil 1900 ein Jahrhundertjahr ist; die abschließende Prüfung akzeptiert 2000, weil es durch 400 teilbar ist. Das Jahr 2026 erfüllt keinen der beiden Teile.

Benannte boolesche Werte machen längere Prüfungen lesbarer, etwa isWeekend || isHoliday. Für zwei boolesche Werte ist ^ das exklusive Oder: Genau ein Operand muss wahr sein, wie bei !=. Die einzelnen Operatoren & und | berechnen ebenfalls das boolesche Und beziehungsweise Oder, werten aber beide Operanden aus; verwende && und || für Bedingungen mit Kurzschlussauswertung.

Wichtige Erkenntnisse

  • && verlangt beide Bedingungen; || verlangt mindestens eine.
  • Eine Schutzbedingung mit Kurzschlussauswertung gehört vor den Ausdruck, den sie schützt.
  • && bindet stärker als ||; Klammern können das Ergebnis ändern.
  • De Morgansche Gesetze negieren beide Teile und vertauschen && mit ||.
  • Jede Seite eines logischen Operators muss ein vollständiger boolescher Ausdruck sein.
  • Die einzelnen Operatoren & und | werten beide Operanden aus.
2

Wähle den Ausführungspfad eines Programms

Eine Entscheidung lenkt die Ausführung auf einen ausgewählten Pfad. Eine einzelne Prüfung kann eine Aktion ermöglichen, zwei Zweige können zwischen zwei Aktionen wählen und eine Kette kann aus mehreren Bereichen ein Ergebnis zuweisen. Hängt die Auswahl von exakten Werten einer Variablen ab, bietet switch eine weitere übersichtliche Form. Um den Pfad nachzuvollziehen, prüfst du, welche Bedingungen erreicht werden, welcher Zweig ausgeführt wird und welche Variablen danach verfügbar bleiben.

2.1 Zweige, Blöcke und Wertauswahl

Ein if führt einen Block aus, wenn seine Bedingung wahr ist. Ein if mit einem else wählt genau einen von zwei Blöcken aus. Nachdem der gewählte Block beendet ist, wird die Ausführung mit der folgenden Anweisung fortgesetzt.

Einen Pfad wählen
int age = 16;
if (age >= 18) {
    System.out.println("Adult ticket");
} else {
    System.out.println("Youth ticket");
}
System.out.println("Next customer");

Die Bedingung ist falsch, daher lautet die Ausgabe „Youth ticket“, gefolgt von „Next customer“. Die letzte Anweisung gehört zu keinem der beiden Zweige. Setze die boolesche Bedingung in runde Klammern und die Anweisungen jedes Zweigs in geschweifte Klammern.

Ohne geschweifte Klammern gehört nur die nächste Anweisung zu einem if. Die Einrückung fasst Code nicht zusammen. In diesem fehlerhaften Beispiel erscheint die zweite Meldung bei jeder Punktzahl:

if (score < 50)
    System.out.println("Not passed");
    System.out.println("Try again");

Geschweifte Klammern um beide Ausgabeanweisungen machen beide von der Bedingung abhängig. Ein anderer Fehler ist ein Semikolon unmittelbar nach der Bedingung: if (x > 10); hat einen leeren Rumpf. Ein darauf folgender Block wird unabhängig ausgeführt, und ein else nach diesem unabhängigen Block hat kein zugehöriges if.

Ein Ergebnis verfügbar halten

Eine innerhalb eines Blocks deklarierte Variable ist nur innerhalb dieses Blocks sichtbar. Deklariere ein Ergebnis vor den Zweigen, wenn späterer Code es benötigt:

String ticket;
if (age >= 18) {
    ticket = "Adult ticket";
} else {
    ticket = "Youth ticket";
}
System.out.println(ticket);

Beide möglichen Pfade weisen ticket einen Wert zu, daher ist die anschließende Ausgabe zulässig. Würde nur der Zweig für den wahren Fall einen Wert zuweisen, würde Java den späteren Lesezugriff ablehnen: Die Variable wäre möglicherweise nicht initialisiert. Würde ticket in jedem Zweig separat deklariert, wäre nach der Entscheidung ebenfalls kein ticket verfügbar.

Eine Entscheidung in eine andere setzen

Ein verschachteltes if führt seine Prüfung nur aus, wenn die Ausführung den umgebenden Zweig erreicht:

if (hasTicket) {
    if (age < 12) {
        System.out.println("Child seat");
    } else {
        System.out.println("Standard seat");
    }
} else {
    System.out.println("Buy a ticket first");
}

Wer kein Ticket hat, erreicht das äußere else; die Altersprüfung wird übersprungen. Schützen beide verschachtelten Prüfungen lediglich dieselbe Aktion und hat keine von ihnen ein else, lassen sie sich zu if (hasTicket && age < 12) zusammenfassen.

Die Regel zum Dangling-Else-Problem ordnet ein else dem nächsten noch nicht zugeordneten if zu. Ohne geschweifte Klammern ändert eine optische Ausrichtung an einem äußeren if nichts an dieser Regel. Folgt auf eine äußere Prüfung, ob x positiv ist, eine innere Prüfung, ob y positiv ist, gehört das nächste else zur Prüfung von y. Soll das else zur äußeren Prüfung gehören, sind geschweifte Klammern um die vollständige innere Entscheidung nötig.

Mit ?: einen Wert wählen

Der bedingte Operator wählt einen von zwei Werten:

int n = 7;
String label = n % 2 == 0 ? "even" : "odd";

Die Bedingung ist falsch, daher liefert der Ausdruck „odd“. Seine Form ist condition ? valueIfTrue : valueIfFalse. Verwende ihn für eine kurze Wertauswahl; verwende ein if, wenn Zweige mehrere Aktionen ausführen. Verschachtelte bedingte Ausdrücke machen den gewählten Pfad schnell schwer nachvollziehbar.

Wichtige Erkenntnisse

  • Geschweifte Klammern fassen alle Anweisungen zusammen, die zu einem Zweig gehören.
  • Ein else gehört zum nächsten noch nicht zugeordneten if.
  • Ein nach einer Entscheidung benötigtes Ergebnis muss im Gültigkeitsbereich liegen und auf jedem Pfad, der zu seiner Verwendung führt, einen Wert erhalten.
  • ?: wählt einen Wert aus zwei Ausdrücken.

2.2 Geordnete Fälle und Grenzwerte

Eine else if-Kette prüft Bedingungen der Reihe nach und wählt die erste wahre Bedingung aus. Sobald dieser Zweig ausgeführt wird, werden die übrigen Bedingungen übersprungen. Ein abschließendes else behandelt die verbleibenden Werte; ohne dieses kann die Kette ohne Aktion bleiben.

Überlappende Schwellenwerte ordnen

Prüfe bei Punktzahlen von 0 bis 100 zuerst die höchste Note:

String grade;
if (score >= 90) {
    grade = "A";
} else if (score >= 80) {
    grade = "B";
} else if (score >= 70) {
    grade = "C";
} else if (score >= 60) {
    grade = "D";
} else {
    grade = "F";
}

Bei 85 schlägt die erste Prüfung fehl und die zweite ist erfolgreich. Das Programm weist „B“ zu, ohne die übrigen Schwellenwerte zu prüfen. Wird score >= 80 erreicht, bedeutet das bereits, dass die Punktzahl unter 90 liegt, sodass eine zusätzliche obere Schranke unnötig ist.

Stünde score >= 60 zuerst, würde jede zum Bestehen ausreichende Punktzahl „D“ erhalten. Gehe vom strengsten zutreffenden Fall zu den allgemeineren über. Diese Reihenfolge ist wichtig, weil mehrere Bedingungen wahr sein können, obwohl nur ein Zweig ausgeführt wird.

Den kombinierten Fall zuerst behandeln

FizzBuzz hat einen Sonderfall, in dem sich zwei Regeln überlappen: Vielfache von 3 und 5 brauchen „FizzBuzz“. Prüfe diesen Fall vor jeder einzelnen Teilbarkeitsprüfung:

if (n % 15 == 0) {
    System.out.println("FizzBuzz");
} else if (n % 3 == 0) {
    System.out.println("Fizz");
} else if (n % 5 == 0) {
    System.out.println("Buzz");
} else {
    System.out.println(n);
}

Die Prüfung % 15 == 0 akzeptiert 30; 9 erreicht „Fizz“, 10 erreicht „Buzz“ und 7 erreicht den letzten Zweig. Würde % 3 == 0 zuerst geprüft, würde 30 zu früh akzeptiert und nur „Fizz“ ausgegeben.

Ein Ergebnis oder mehrere Aktionen wählen

Getrennte if-Anweisungen sind unabhängige Entscheidungen. Bei x = 15 kann ein if (x > 10) „big“ ausgeben und ein folgendes if (x > 0) außerdem „positive“. Verbindest du sie mit else if, wird die zweite Prüfung nicht erreicht, wenn die erste wahr ist. Verwende unabhängige Prüfungen, wenn beide Aktionen nötig sein können; verwende eine Kette für ein ausgewähltes Ergebnis.

Randwerte und ungültige Werte prüfen

Eine Kette für ganzzahlige Temperaturen mit temp < 10, dann temp > 10 && temp < 25 und dann temp >= 25 erfasst genau 10 nicht. Ersetze die zweite Prüfung durch temp < 25: Wird sie erreicht, ist die erste Prüfung bereits fehlgeschlagen, der Wert ist also mindestens 10. Ein abschließendes else behandelt dann 25 und mehr.

Probiere für jeden Schwellenwert den Wert unmittelbar darunter, den Schwellenwert selbst und den Wert unmittelbar darüber. Bei der Notenkette zeigen 89, 90 und 91, ob die Grenze für A korrekt eingeschlossen ist. Teste auch die äußeren Grenzen.

Validiere eine Punktzahl, bevor du eine Note vergibst: Setze score < 0 || score > 100 an den Anfang und gib dort „Invalid score“ aus. Die späteren Zweige verarbeiten dann nur gültige Punktzahlen; 150 kann nicht versehentlich „A“ erhalten. Die Validierung ist ein eigener erster Fall, keine Korrektur, nachdem die Note bereits gewählt wurde.

Wichtige Erkenntnisse

  • Die erste wahre Bedingung in einer Kette wählt den einzigen Zweig, der ausgeführt wird.
  • Setze engere überlappende Fälle vor allgemeinere Fälle.
  • Verwende getrennte if-Anweisungen, wenn mehrere Aktionen infrage kommen.
  • Teste die Werte an und neben jedem Schwellenwert.
  • Weise ungültige Eingaben zurück, bevor du gültige einordnest.

2.3 Switch-Fälle und Ergebnisse von Ausdrücken

Ein switch wählt einen Fall, indem es einen Wert mit festen Marken vergleicht. Das passt zu benannten Befehlen und nummerierten Auswahlmöglichkeiten. Verwende eine else if-Kette, wenn die Auswahl von einem Bereich oder mehreren Variablen abhängt.

Exakte Werte abgleichen

Ein wertbasierter switch akzeptiert Selektoren vom Typ char, byte, short, int, deren Wrappertypen, String und Aufzählungstypen. Ohne Vorschaufunktionen werden Selektoren vom Typ long, float, double und boolean nicht unterstützt. Marken müssen Konstanten sein: Eine Bedingung wie score >= 90 ist keine Wertmarke.

switch (day) {
    case 1, 2, 3, 4, 5 -> System.out.println("Weekday");
    case 6, 7 -> System.out.println("Weekend");
    default -> System.out.println("Invalid day");
}

Ein Fall mit Pfeil führt nur seinen eigenen Code aus, ohne Fall-through. Kommas gruppieren mehrere Marken für eine Aktion. Der Tag 6 gibt „Weekend“ aus; der Tag 9 entspricht keinem aufgeführten Wert und gibt „Invalid day“ aus.

String-Marken gleichen Inhalte exakt und unter Beachtung der Groß- und Kleinschreibung ab. Der Befehl „Start“ passt nicht zu case "start". Eine doppelte Marke ist ein Kompilierfehler, und ein switch kann Fälle mit Pfeil und Fälle mit Doppelpunkt nicht mischen.

Einen Wert erzeugen

Ein switch-Ausdruck berechnet ein Ergebnis:

int days = switch (month) {
    case 1, 3, 5, 7, 8, 10, 12 -> 31;
    case 4, 6, 9, 11 -> 30;
    case 2 -> 28;
    default -> 0;
};

In einem Jahr ohne Schalttag ergibt Monat 9 den Wert 30, Monat 2 den Wert 28 und der ungültige Monat 13 den Wert 0. Das Semikolon nach der schließenden Klammer beendet die Variablendeklaration.

Ein Ausdruck muss vollständig sein: Jeder mögliche Selektorwert muss ein Ergebnis haben. Füge für diese Beispiele mit int und String ein default ein. Eine wertbasierte switch-Anweisung kann default auslassen; bei einem Wert ohne passenden Fall wird dann kein Fall ausgeführt. Ein Ausdruck, der einen Wert liefert, kann die Erzeugung seines Ergebnisses nicht einfach überspringen.

Einem Block mit yield ein Ergebnis geben

Ein Fall, der vor der Auswahl seines Werts etwas berechnet, braucht einen Block:

int days = switch (month) {
    case 2 -> {
        boolean leap = (year % 4 == 0 && year % 100 != 0)
                || year % 400 == 0;
        yield leap ? 29 : 28;
    }
    case 4, 6, 9, 11 -> 30;
    case 1, 3, 5, 7, 8, 10, 12 -> 31;
    default -> 0;
};

yield liefert den Wert des Falls an den switch-Ausdruck. Der Februar ergibt 29 im Jahr 2024 und 28 im Jahr 2026. Ein einzelner Ausdruck nach einem Pfeil wie case 2 -> 28; braucht kein yield.

Die ältere Doppelpunktform lesen
switch (level) {
    case 1:
        System.out.println("Bronze");
    case 2:
        System.out.println("Silver");
        break;
    case 3:
        System.out.println("Gold");
        break;
}

Bei Stufe 1 tritt die Ausführung in den ersten Fall ein und läuft in den zweiten weiter, sodass sowohl „Bronze“ als auch „Silver“ ausgegeben werden. Das ist Fall-through: Eine Marke mit Doppelpunkt beendet die Ausführung nicht. break beendet den switch. Aufeinanderfolgende Marken mit Doppelpunkt können sich absichtlich eine Aktion teilen; ein fehlendes break nach einer Aktion kann versehentlich die nächste ausführen.

Ein switch mit char kann 'a', 'e', 'i', 'o', 'u' zum Ergebnis „vowel“ gruppieren, während default „other“ ergibt. Dasselbe Prinzip der exakten Werte gilt für Zeichen, Befehle und numerische Auswahlmöglichkeiten.

Wichtige Erkenntnisse

  • Verwende switch für feste Marken eines Selektors.
  • Fälle mit Pfeil laufen nicht in den nächsten Fall weiter.
  • Ein switch-Ausdruck muss für jeden möglichen Selektorwert ein Ergebnis liefern.
  • Ein Fall mit Block liefert sein Ausdrucksergebnis mit yield.
  • Ein Fall mit Doppelpunkt kann ohne break in den nächsten Fall weiterlaufen.
  • String-Fälle gleichen Inhalte exakt und unter Beachtung der Groß- und Kleinschreibung ab.
3

Steuere Wiederholung und Abbruch

Eine Wiederholung hängt sowohl von einer Bedingung als auch von einer Änderung des Programmzustands ab. Verfolge eine Schleife von ihren Startwerten über Prüfung, Rumpf und Aktualisierung, um zu sehen, wann sie endet. Die drei Schleifenformen setzen diese Teile an unterschiedliche Stellen: vor den Rumpf, danach oder gemeinsam in einen Kopf. Vorzeitige Abbrüche und übersprungene Durchläufe bieten zusätzliche Möglichkeiten, machen es aber auch sinnvoll, die Ausführungsreihenfolge sorgfältig nachzuvollziehen.

3.1 Prüfungen in while-Schleifen und Zustandsänderungen

Eine while-Schleife prüft ihre Bedingung vor jedem Durchlauf. Ist die Bedingung wahr, führt Java den Rumpf aus und kehrt zur Prüfung zurück. Ist sie falsch, wird die Ausführung nach der Schleife fortgesetzt. Eine falsche erste Prüfung bedeutet null Durchläufe.

Start, Prüfung, Rumpf und Aktualisierung verfolgen
int i = 1;
while (i <= 5) {
    System.out.println(i);
    i++;
}

Der Startwert ist 1. Jeder Durchlauf gibt den aktuellen Wert aus und erhöht ihn dann. Der fünfte Durchlauf gibt 5 aus und ändert i zu 6. Die nächste Prüfung ist falsch, daher endet die Schleife. Der Rumpf wird fünfmal ausgeführt, die Bedingung aber sechsmal geprüft: einmal vor jedem Durchlauf und ein letztes Mal mit falschem Ergebnis.

Eine Zählschleife braucht einen Startwert, eine Prüfung und eine Aktualisierung, die zum Abbruch führt. Lässt du i++ weg, gibt diese Schleife unendlich oft 1 aus. Ein versehentliches Semikolon ist eine weitere Falle: In while (i <= 5); ist die leere Anweisung der Rumpf. Beginnt i innerhalb des Bereichs, wird der spätere Block nie erreicht und kann den Wert nicht aktualisieren.

Beim Überschreiten eines Grenzwerts anhalten

Eine Gleichheitsprüfung ist als Abbruchprüfung oft unzuverlässig. Beginnend bei 0 und jeweils um 3 erhöht, werden 0, 3, 6, 9, 12 und so weiter erreicht. Die Prüfung i != 10 kann das Überschreiten von 10 nicht erkennen, weil 10 übersprungen wird. Die Prüfung i < 10 beendet die Schleife nach der Verarbeitung von 9. Wähle eine Schranke, die zur Richtung der Aktualisierung passt.

Einige Schleifen wiederholen sich unbekannt oft. Zum Beispiel:

int amount = 1;
int days = 0;
while (amount < 1000) {
    amount *= 2;
    days++;
}

Jeder Durchlauf verdoppelt die Menge und zählt einen Tag. Nach neun Durchläufen beträgt sie 512; nach zehn beträgt sie 1024. Die falsche Prüfung bei 1024 beendet die Schleife mit days gleich 10. Eine Schleife kann oberhalb ihres Schwellenwerts enden, wenn die Aktualisierung in größeren Schritten erfolgt.

Vor der Entscheidung über den Abbruch einlesen
while (true) {
    String line = scanner.nextLine();
    if (line.equals("stop")) {
        break;
    }
    System.out.println("You wrote: " + line);
}

Hier ist scanner der Scanner für die Eingabe. Die Schleife liest eine Zeile ein, prüft auf „stop“ und gibt nur gewöhnliche Zeilen wieder aus. Der Stoppbefehl wird eingelesen, aber nicht verarbeitet. while (true) braucht einen erreichbaren Abbruch, um zu enden; eine Schleife, die sich ohne Abbruch weiter wiederholt, ist eine Endlosschleife.

Zustandsänderungen protokollieren

Betrachte ein Produkt:

int n = 3;
int product = 1;
while (n > 0) {
    product *= n;
    n--;
}
Zeitpunktproductn
Vor der Schleife13
Nach Durchlauf 132
Nach Durchlauf 261
Nach Durchlauf 360

Die Multiplikation verwendet den alten Wert von n, und das Dekrement folgt danach. Würdest du das Dekrement vor die Multiplikation setzen, würden andere Werte multipliziert.

Deklariere ein laufendes Ergebnis vor der Schleife, damit es von einem Durchlauf zum nächsten erhalten bleibt. Eine im Rumpf deklarierte Variable wird jedes Mal neu erstellt, wenn die Ausführung ihre Deklaration erreicht. Gib innerhalb des Rumpfs aus, um Zwischenergebnisse zu sehen; gib nach der schließenden Klammer aus, um das Endergebnis einmal anzuzeigen.

Wichtige Erkenntnisse

  • Eine while-Schleife kann auch kein einziges Mal ausgeführt werden.
  • Vollziehe die Bedingung vor jedem Durchlauf nach, einschließlich der letzten Prüfung mit falschem Ergebnis.
  • Zählschleifen brauchen eine Aktualisierung, die zu einer Abbruchschranke führt.
  • Ein Stoppbefehl muss geprüft werden, bevor die Eingabe verarbeitet wird.
  • Halte laufende Ergebnisse außerhalb des Schleifenrumpfs.

3.2 Eingabeprüfungen mit do-while

Eine do-while-Schleife führt den Rumpf aus, bevor sie prüft, ob ein weiterer Durchlauf nötig ist. Verwende sie, wenn die erste Aktion stattfinden muss, etwa das Anzeigen eines Menüs oder das Abfragen eines Eingabewerts.

Nach der ersten Aktion prüfen
int i = 10;
do {
    System.out.println(i);
    i++;
} while (i < 5);

Der Rumpf gibt 10 aus und erhöht i auf 11. Erst dann prüft Java i < 5. Die Bedingung ist falsch, daher gibt es keinen zweiten Durchlauf. Eine bei 10 beginnende while (i < 5)-Schleife würde nichts ausgeben.

Das Semikolon nach dem abschließenden while (...) ist erforderlich. Es schließt die do-while-Anweisung ab. Das unterscheidet sich vom versehentlichen Semikolon nach dem Kopf einer kopfgesteuerten while-Schleife, das einen leeren Schleifenrumpf erzeugt.

Wiederholen, solange die Eingabe ungültig ist
int rating;
do {
    System.out.print("Rating (1-5): ");
    rating = Integer.valueOf(scanner.nextLine());
} while (rating < 1 || rating > 5);

Die Eingabeaufforderung erscheint vor der ersten Prüfung, sodass der Benutzer den zu prüfenden Wert eingeben kann. Bei den Eingaben 7, dann 0 und dann 4 sind die ersten beiden Bedingungen wahr und lösen eine erneute Eingabeaufforderung aus. Die letzte Bedingung ist falsch, daher endet die Schleife mit rating gleich 4.

Die Bedingung beschreibt das Fortsetzen, nicht das Akzeptieren. Eine gültige Bewertung erfüllt rating >= 1 && rating <= 5. Die Schleife wiederholt sich, solange diese Aussage falsch ist; nach den De Morganschen Gesetzen lässt sich das als rating < 1 || rating > 5 schreiben. Eine Und-Verknüpfung zwischen diesen äußeren Schranken wäre nie wahr: Eine Zahl kann nicht gleichzeitig unter 1 und über 5 liegen.

Die geprüfte Variable vor dem Block deklarieren

Die schließende Klammer beendet den Gültigkeitsbereich des Rumpfs, bevor die Bedingung ausgewertet wird. Eine Deklaration wie int rating innerhalb des do-Blocks wäre daher in der abschließenden Bedingung nicht verfügbar. Deklariere die Variable vor do und weise ihr die Eingabe innerhalb des Rumpfs zu. Die Zuweisung wird immer vor der ersten Prüfung ausgeführt.

Dieselbe Platzierung ist wichtig, wenn der akzeptierte Wert danach verwendet wird. rating bleibt nach der gesamten Schleife im Gültigkeitsbereich und enthält nun den zuletzt eingelesenen Wert.

Ein Menü offen halten
String choice;
do {
    System.out.println("a: show status, q: quit");
    choice = scanner.nextLine();
    if (choice.equals("a")) {
        System.out.println("Ready");
    }
} while (!choice.equals("q"));

Jeder Durchlauf zeigt das Menü an und liest eine Auswahl ein. Die Eingabe „a“ gibt „Ready“ aus und wiederholt die Schleife. Die Eingabe „q“ überspringt die Aktion und beendet die Schleife an der Bedingung. Auch bei einem unbekannten Befehl wird wiederholt, weil er nicht „q“ ist.

Enthält der Rumpf kein auf die Schleife zielendes continue, lässt sich eine do-while-Schleife als while (true) mit einem break bei negierter Bedingung am Ende umschreiben. Bei einer solchen Umschreibung braucht ein continue besondere Aufmerksamkeit: In der ursprünglichen do-while-Schleife springt es zur Bedingung, während es in einer while-true-Schleife zum Anfang springt und die hinzugefügte Prüfung am Ende überspringen kann.

Wichtige Erkenntnisse

  • Der Rumpf einer do-while-Schleife wird vor seiner ersten Prüfung ausgeführt.
  • Das abschließende Semikolon ist erforderlich.
  • Deklariere eine Variable außerhalb des Rumpfs, wenn die Bedingung sie benötigt.
  • Wiederhole bei der Eingabevalidierung, solange der Wert ungültig ist.

3.3 Zahlenbereiche und Endwerte in for-Schleifen

Eine for-Schleife fasst die Steuerung einer Zählaufgabe in einem Kopf zusammen. Sie ist nützlich, wenn du den Bereich oder die Anzahl der Durchläufe vor Beginn der Wiederholung kennst.

Den Kopf in Ausführungsreihenfolge lesen
for (int i = 1; i <= 5; i++) {
    System.out.println(i);
}

Die Initialisierung wird einmal ausgeführt und setzt i auf 1. Java prüft i <= 5, führt bei wahrem Ergebnis den Rumpf aus, führt i++ aus und kehrt zur Prüfung zurück. Die Aktualisierung steht im Kopf, wird aber nach dem Rumpf ausgeführt. Die abschließende falsche Prüfung beendet die Schleife.

Beim gewöhnlichen Zählen haben i++ und ++i an der Stelle der Aktualisierung dieselbe Wirkung, weil der Wert keines der beiden Ausdrücke verwendet wird. Halte die Änderungen des Zählers im Kopf, damit die Folge leicht vorherzusagen ist.

Den ersten und letzten Wert wählen
KopfIm Rumpf verwendete WerteDurchläufe
int i = 0; i < 5; i++0 bis 45
int i = 0; i <= 5; i++0 bis 56
int i = 10; i >= 1; i--10 bis 110
int i = 0; i <= 20; i += 50, 5, 10, 15, 205

Bei Aufwärtsschritten um jeweils eins und einem Endwert, der mindestens so groß wie der Startwert ist, ergibt ein ausgeschlossener Endwert die Anzahl Endwert minus Startwert; ein eingeschlossener Endwert fügt einen Durchlauf hinzu. Bei größeren Schritten musst du die tatsächlich erreichten Werte auflisten oder zählen. Eine abwärts zählende Schleife muss in der passenden Richtung prüfen: Ein Start bei 10 mit i <= 1 ergibt null Durchläufe.

Ein Off-by-one-Fehler schließt einen Endwert unerwünscht ein oder aus. Um 1 bis 10 auszugeben, lässt i < 10 die 10 aus; verwende i <= 10. Prüfe den ersten und letzten Wert im Rumpf sowie den ersten Wert, der die Bedingung nicht erfüllt.

Ein Ergebnis über einen Bereich aufbauen
int sum = 0;
for (int i = 1; i <= 100; i++) {
    sum += i;
}
System.out.println(sum);

Der Rumpf addiert jede ganze Zahl einmal und endet bei 5050. Ein Produkt beginnt anders: Initialisiere product mit 1, bevor du mit den Zahlen 1 bis 5 multiplizierst. Das ergibt 120; ein Start bei 0 würde das Produkt nach jeder Multiplikation bei 0 belassen.

Auf Gültigkeitsbereiche und leere Rümpfe achten

Ein im Kopf deklarierter Zähler existiert während der gesamten Schleife, aber nicht nach ihrer schließenden Klammer. Deklariere ihn früher, wenn späterer Code seinen letzten Wert benötigt.

Ein Semikolon unmittelbar nach dem Kopf ist ein leerer Rumpf. In for (int i = 0; i < 3; i++); wird die leere Anweisung dreimal ausgeführt. Ein folgender Block, der „Hello“ ausgibt, wird einmal nach der Schleife ausgeführt, nicht dreimal. Geschweifte Klammern gehören direkt hinter den Kopf.

Jeder Teil des Kopfs kann ausgelassen werden. for (;;) { ... } hat keine Abbruchbedingung und verhält sich wie while (true); die Schleife braucht einen Abbruch wie break, um zu enden.

Die übersichtlichste Schleife auswählen
AufgabeGeeignete FormGrund
Einen bekannten Bereich durchlaufenforStart, Schranke und Schritt stehen zusammen.
Wiederholen, bis sich Eingabe oder Zustand ändernwhileDie Prüfung kann den ersten Durchlauf verhindern.
Zuerst fragen, dann prüfendo-whileDie erste Ausführung des Rumpfs ist erforderlich.

Die Formen können dieselbe Wiederholung ausdrücken, aber beim Umschreiben muss die Reihenfolge von Prüfungen und Aktualisierungen erhalten bleiben, einschließlich dessen, was ein continue überspringt.

Wichtige Erkenntnisse

  • Eine for-Schleife führt die Initialisierung einmal aus, danach folgen Prüfung, Rumpf und Aktualisierung.
  • Prüfe den Startwert, den letzten eingeschlossenen Wert und die Anzahl der Durchläufe.
  • Ein im Kopf deklarierter Zähler ist nach der Schleife nicht verfügbar.
  • Verwende for für Bereiche, while für einen sich ändernden Zustand und do-while für einen erforderlichen ersten Durchlauf.
  • Ein Semikolon nach einem for-Kopf erzeugt einen leeren Rumpf.

3.4 Vorzeitige Abbrüche und übersprungene Durchläufe

Ein vorzeitiger Abbruch kann eine Wiederholung beenden, sobald ihre Aufgabe erfüllt ist. Ein übersprungener Durchlauf kann unerwünschte Arbeit auslassen und die Schleife weiterlaufen lassen. Verfolge genau, wohin der Ablauf jeweils springt: break und continue haben unterschiedliche Aufgaben.

Eine Suche mit break beenden
for (int n = 51; n <= 100; n++) {
    if (n % 7 == 0) {
        System.out.println(n);
        break;
    }
}

Die Werte 51 bis 55 bestehen die Teilbarkeitsprüfung nicht. Der nächste Wert, 56, wird ausgegeben und break verlässt die Schleife sofort. Die Aktualisierung wird nach diesem break nicht ausgeführt. Ohne den Abbruch würden auch spätere Vielfache wie 63 und 70 ausgegeben.

Ein break ohne Sprungmarke bezieht sich auf die nächste umgebende Schleife oder den nächsten umgebenden switch. Die Ausführung wird nach diesem Konstrukt fortgesetzt; das gesamte Programm wird dadurch nicht beendet.

Mit continue überspringen
for (int i = 1; i <= 10; i++) {
    if (i % 3 == 0) {
        continue;
    }
    System.out.print(i + " ");
}

Für 3, 6 und 9 überspringt continue die Ausgabeanweisung. In einer for-Schleife wird die Aktualisierung im Kopf trotzdem ausgeführt, gefolgt von der Bedingung. Die Ausgabe enthält 1, 2, 4, 5, 7, 8 und 10.

Bei einer while- oder do-while-Schleife springt continue zur Bedingung. Jede darunter im Rumpf stehende Aktualisierung wird übersprungen. Beginnt ein while-Zähler bei 0 und ist die erste Aktion if (i % 3 == 0) { continue; }, wird ein späteres i++ im Rumpf nie erreicht. Der Zähler bleibt bei 0 und die Schleife wiederholt sich unendlich. Setze die nötige Aktualisierung vor jeden Pfad, auf dem sie übersprungen wird, oder verwende einen for-Kopf, damit die Aktualisierung automatisch erfolgt.

Verschachtelte Schleifen gezielt verlassen

Ein gewöhnliches break innerhalb einer inneren Schleife beendet nur diese innere Schleife. Eine Sprungmarke kann eine äußere Schleife als Abbruchziel benennen:

outer:
for (int a = 1; a <= 10; a++) {
    for (int b = 1; b <= 10; b++) {
        if (a * b == 24 && a + b == 10) {
            System.out.println("Found " + a + " and " + b);
            break outer;
        }
    }
}

Die Suche durchläuft die Paare der Reihe nach. Bei a = 4 und b = 6 sind beide Prüfungen erfüllt und das break mit Sprungmarke verlässt beide Schleifen. continue outer würde stattdessen zur Aktualisierung der äußeren Schleife und dann zu ihrer nächsten Prüfung übergehen.

switch-Abbrüche von Schleifenabbrüchen unterscheiden

In einer Menüschleife mit einem switch in Doppelpunktform beendet break innerhalb eines Falls den switch. Es beendet nicht von selbst die umgebende Schleife. Ein übersichtliches Muster setzt im Fall für das Beenden ein Schleifen-Flag auf false und verlässt dann den switch mit break. Die Schleife endet, wenn die nächste Prüfung ihrer Bedingung das falsche Flag erkennt. Fälle mit Pfeil brauchen kein break, um Fall-through zu verhindern.

break ohne Sprungmarke ist innerhalb einer Schleife oder eines switch zulässig; continue ist innerhalb einer Schleife zulässig. An anderer Stelle verhindern sie das Kompilieren. Belasse die normale Abbruchregel in der Schleifenbedingung, wenn sie dorthin passt. Verwende while (true) mit einem break, wenn die Abbruchprüfung sinnvollerweise nach dem Einlesen der Eingabe, aber vor ihrer Verarbeitung steht. Mehrere Abbrüche können nützlich sein, aber jeder zusätzliche Pfad bringt beim Nachvollziehen weiteren zu verfolgenden Zustand mit sich.

Wichtige Erkenntnisse

  • break verlässt sein Ziel sofort.
  • continue in einer for-Schleife führt weiterhin die Aktualisierung im Kopf aus.
  • continue in einer while-Schleife kann eine nötige Aktualisierung im Rumpf überspringen.
  • Ein gewöhnlicher Abbruch wirkt auf das nächste dafür geeignete Konstrukt.
  • Ein break mit Sprungmarke kann eine äußere Schleife verlassen.
  • Ein break im switch verlässt eine umgebende Schleife nicht direkt.
4

Entwickle und prüfe nützliche Schleifen

Eine Schleife wird nützlich, wenn sie genau die Informationen speichert, die eine Aufgabe braucht: eine Anzahl, eine laufende Summe, einen besten Wert oder ein Flag, das einen Treffer festhält. Die Kombination dieser kleinen Muster löst Aufgaben zur Eingabeverarbeitung und Suche. Verschachtelte Schleifen erweitern die Wiederholung auf Zeilen und Spalten. Verfolge die sich ändernden Werte, halte den Zustand im richtigen Gültigkeitsbereich und prüfe mit leeren Eingaben und Grenzwertfällen, ob das Ergebnis alle Daten beschreibt.

4.1 Laufende Anzahlen, Summen und Mittelwerte

Ein Zähler hält fest, wie viele Werte eine Bedingung erfüllen. Ein Akkumulator verbindet Werte zu einem laufenden Ergebnis. Deklariere beide vor der Schleife, damit jeder Durchlauf auf dem bisherigen Ergebnis aufbaut.

Passend zur Operation initialisieren

Verwende int count = 0; und erhöhe den Zähler, wenn ein Element die Bedingung erfüllt. Eine Summe beginnt bei 0; aktualisiere sie mit sum += value;. Ein Produkt beginnt bei 1, weil beim Multiplizieren eines anfänglichen Werts von 0 jeder spätere Faktor zunichtegemacht würde. Wird eine Summe im Rumpf initialisiert, setzt sie sich bei jedem Durchlauf zurück.

Bei einem Zahlenbereich kann die Schrittweite der Schleife die Werte auswählen: Addierst du die geraden ganzen Zahlen von 2 bis 100 in Schritten von 2, ergibt das 2550. Oder setze eine Bedingung in die Schleife. Zählst du die Zahlen von 1 bis 100, die durch 3 oder durch 5 teilbar sind, ergibt das 47: Die sechs Vielfachen von 15 dürfen nur einmal gezählt werden.

Die Eingabe vor dem Addieren beenden

Eine Endemarkierung ist ein besonderer Eingabewert, der das Einlesen beendet. Sie ist kein gewöhnlicher Datenwert:

int sum = 0;
int count = 0;
while (true) {
    int number = Integer.valueOf(scanner.nextLine());
    if (number == 0) {
        break;
    }
    sum += number;
    count++;
}

Bei der Eingabe 12, 7, 5, 0 nimmt die Summe nacheinander die Werte 12, 19 und 24 an. Der Zähler erreicht 3. Die letzte 0 löst den Abbruch aus, bevor eine der beiden Variablen geändert wird. Würde sie mitgezählt, entstünde ein viertes Element und der Mittelwert wäre falsch, obwohl das Addieren von null die Summe unverändert lässt.

Erst nach Prüfung der Anzahl dividieren
if (count > 0) {
    double average = (double) sum / count;
    System.out.println(average);
} else {
    System.out.println("No numbers entered");
}

Das Beispiel gibt 8.0 aus. Bei ganzzahligen Operanden verwirft die Division den Nachkommateil: 25 / 4 ist 6. Wandle vor der Division um, um 6,25 zu erhalten: (double) sum / count. Eine anschließende explizite Typumwandlung, (double) (sum / count), wandelt lediglich das bereits abgeschnittene Ergebnis in 6,0 um.

Kommt die Endemarkierung zuerst, ist die Anzahl 0. Eine Ganzzahldivision durch null wirft eine ArithmeticException; eine Gleitkommasumme von null dividiert durch null ergibt NaN. Die Prüfung der Anzahl verhindert, dass eine leere Eingabe einen nicht aussagekräftigen Mittelwert erzeugt.

Mehrere Ergebnisse in einem Durchlauf verfolgen

Für die Punktzahlen 55, 72, 90, 48 und 81 ergeben sich bei einer Bestehensgrenze von 60 fünf Punktzahlen und drei bestandene Fälle. Führe einen Gesamtzähler für jede Punktzahl und einen Zähler für bestandene Fälle innerhalb der Bestehensbedingung. 100.0 * passed / total ergibt 60,0 Prozent; 100.0 bewirkt, dass mit Gleitkommazahlen gerechnet wird. Prüfe auch vor dieser Division, ob die Gesamtzahl positiv ist.

Wo die Ausgabe steht, verändert das angezeigte Ergebnis. Strecken von 5, 3 und 8 km ergeben die laufenden Summen 5, 8 und 16 km, wenn sie innerhalb der Schleife nach der Addition ausgegeben werden. Die Ausgabe danach zeigt nur die endgültigen 16 km.

Einen ausreichend großen Typ für die Summe wählen

Das Maximum eines int ist 2.147.483.647. Die Summe aller ganzen Zahlen von 1 bis 100.000 sollte 5.000.050.000 ergeben, aber ein int springt ohne Fehlermeldung auf 705.082.704. long sum = 0; speichert diese Summe korrekt; das Maximum von long beträgt etwa 9,2 × 10¹⁸. Eine nachträgliche erweiternde Typumwandlung eines bereits übergelaufenen Ergebnisses kann den verlorenen Wert nicht wiederherstellen.

Wichtige Erkenntnisse

  • Initialisiere eine Summe oder Anzahl mit 0 und ein Produkt mit 1.
  • Schließe die Endemarkierung sowohl aus der Summe als auch aus der Anzahl aus.
  • Wandle vor der Division einen Operanden um, damit der Nachkommateil erhalten bleibt.
  • Schütze Mittelwerte und Prozentsätze vor leerer Eingabe.
  • Setze die Aktualisierung jedes Zählers zu der Bedingung, deren Erfüllungen er zählt.
  • Verwende einen ausreichend großen Typ, bevor du eine große Summe aufsummierst.

4.2 Beste Werte, Suche und Ziffern

Einige Schleifen merken sich einen besten Wert, andere, ob ein Treffer vorgekommen ist. Wähle den Anfangszustand so, dass er vor und nach jedem Durchlauf zutrifft.

Den bisher besten Wert festhalten

Um ein Maximum zu verfolgen, ersetze es nur, wenn der aktuelle Wert größer ist: if (value > max) { max = value; }. Beginnend mit dem ersten Messwert ergeben die Temperaturen 14, 19, 11, 23 und 17 °C nacheinander die Maxima 14, 19, 19, 23 und 23 °C. Für ein Minimum wird stattdessen < verwendet.

Ein Maximum bei 0 beginnen zu lassen, schlägt bei ausschließlich negativen Daten fehl: -5, -2 und -9 würden fälschlich 0 als Ergebnis hinterlassen. Initialisiere mit einem tatsächlichen Messwert oder beginne bei Integer.MIN_VALUE für ein int-Maximum und bei Integer.MAX_VALUE für ein int-Minimum. Gib an, dass kein Ergebnis vorliegt, wenn es keine Messwerte gab.

Um eine Position festzuhalten, aktualisiere sie im selben Zweig wie den Wert. Ein striktes > behält bei gleichen Werten das erste Maximum; >= ersetzt es erneut und behält das letzte.

Nach einem Treffer anhalten
int n = 1;
while (n * n <= 500) {
    n++;
}

Bei 22 ist das Quadrat 484, also wird ein weiterer Durchlauf ausgeführt. Bei 23 ist es 529 und die Bedingung ist nicht erfüllt. Die Schleife hat die kleinste positive ganze Zahl gefunden, deren Quadrat größer als 500 ist. Eine Suche in einem begrenzten Bereich kann stattdessen jeden Kandidaten in einer for-Schleife prüfen und beim ersten Treffer abbrechen.

Beginne für eine Frage nach mindestens einem Treffer mit einem falschen Flag und setze es bei einem Treffer auf wahr. Beginne für eine Frage nach allen Werten mit wahr und setze das Flag bei einem Gegenbeispiel auf falsch. Setze keines der beiden Flags bei späteren Werten in einem else-Zweig zurück: Ein späterer nicht passender Wert löscht beispielsweise einen zuvor gefundenen negativen Messwert nicht aus.

Auf einen Teiler prüfen

Eine Primzahl ist mindestens 2 und hat keinen Teiler von 2 bis zur um eins kleineren Zahl. Bei einer kleinen positiven ganzen Zahl prüft eine kürzere Prüfung Teiler nur bis zur Quadratwurzel:

int n = 91;
boolean isPrime = n >= 2;
for (int d = 2; d * d <= n; d++) {
    if (n % d == 0) {
        isPrime = false;
        break;
    }
}

Die beiden Faktoren eines Paars können nicht beide größer als die Quadratwurzel sein. Bei 91 ergibt der Teiler 7 einen Rest von null und setzt das Flag auf falsch. Bei 97 ist keine Zahl von 2 bis 9 ein Teiler, daher bleibt das Flag wahr. Werte unter 2 beginnen mit einem falschen Flag. Verwende für große positive int-Werte d <= n / d, um einen Überlauf bei d * d zu vermeiden.

Pro Durchlauf eine Dezimalziffer entfernen

Bei einer nicht negativen ganzen Zahl extrahiert % 10 die letzte Ziffer und die Ganzzahldivision / 10 entfernt sie:

int n = 4072;
int sum = 0;
while (n > 0) {
    sum += n % 10;
    n /= 10;
}

Die Ziffern sind 2, 7, 0 und 4 und ergeben 13. Der Arbeitswert n endet bei 0. Um Ziffern umzukehren, aktualisiere reversed = reversed * 10 + n % 10;, bevor du die Ziffer entfernst; aus 1234 wird 4321, wenn das Ergebnis in den gewählten Typ passt.

Beim Zählen der Ziffern braucht null einen Durchlauf, obwohl n > 0 von Anfang an falsch ist. Verwende eine do-while-Schleife, die den Zähler erhöht und n durch 10 dividiert. Sie zählt für 0 eine Ziffer und für positive Werte die übliche Anzahl.

Wichtige Erkenntnisse

  • Initialisiere einen Extremwert aus tatsächlichen Daten oder mit einem passenden Grenzwert des Typs.
  • Aktualisiere die Position eines Extremwerts zusammen mit seinem Wert.
  • Halte ein Such-Flag nach einem Treffer für mindestens einen Wert wahr beziehungsweise nach einem Gegenbeispiel für alle Werte falsch.
  • Ein Primzahltest braucht keine Teiler oberhalb der Quadratwurzel zu prüfen.
  • Bei nicht negativen ganzen Zahlen extrahiert % 10 eine Ziffer und / 10 entfernt sie.
  • Um die Ziffern von null zu zählen, ist ein erster Durchlauf erforderlich.

4.3 Verschachtelte Schleifen, Ablaufverfolgung und Testfälle

Verschachtelte Schleifen wiederholen für jeden äußeren Durchlauf eine vollständige Wiederholung. Sie sind nützlich für Zeilen, Spalten, Tabellen und Formen. Die innere Schleife muss jedes Mal neu beginnen, wenn die äußere Schleife sie erreicht.

Eine Zeile ausgeben und dann beenden
for (int row = 1; row <= 3; row++) {
    for (int col = 1; col <= 5; col++) {
        System.out.print(row * col + "\t");
    }
    System.out.println();
}

Die erste Zeile enthält 1, 2, 3, 4, 5; die zweite enthält 2, 4, 6, 8, 10; die dritte enthält 3, 6, 9, 12, 15. Die innere Ausgabe erzeugt Spalten in einer Zeile; das println nach der inneren Schleife beendet diese Zeile. Würde println in die innere Schleife verschoben, stünde jedes Produkt in einer eigenen Zeile.

Bei festgelegten Anzahlen multipliziere die äußeren mit den inneren Durchläufen. Drei äußere und vier innere Durchläufe führen den inneren Rumpf 12-mal aus. Die Tabelle oben enthält drei mal fünf, also 15, Produktausgaben.

Die Zeilenlänge ändern lassen
for (int row = 1; row <= 4; row++) {
    for (int col = 1; col <= row; col++) {
        System.out.print("*");
    }
    System.out.println();
}

Die innere Schleifengrenze hängt nun von der Zeile ab. Die Anzahlen sind 1, 2, 3 und 4, das Dreieck enthält also 10 Sterne. Eine einzelne Multiplikation mit fester Anzahl wäre falsch, weil die innere Schleife nicht in jeder Zeile gleich oft läuft.

Verwende unterschiedliche Namen für Schleifenzähler mit überlappenden Gültigkeitsbereichen. Ein weiteres int i innerhalb einer Schleife zu deklarieren, in der i bereits im Gültigkeitsbereich liegt, lässt sich nicht kompilieren. Initialisiere bei einer inneren while-Schleife ihren Zähler zu Beginn jedes äußeren Durchlaufs. Wird er nur vor der äußeren Schleife initialisiert, bleibt er nach der ersten Zeile jenseits der Schleifengrenze.

Werte an einem einheitlichen Zeitpunkt verfolgen

Bei einer Schleife von 1 bis 4 subtrahiere ungerade Werte von einer bei 0 beginnenden Summe und addiere gerade Werte:

Verarbeiteter WertAktionSumme nach dem Durchlauf
11 subtrahieren-1
22 addieren1
33 subtrahieren-2
44 addieren2

Halte fest, ob eine Zeile den Anfang oder das Ende eines Durchlaufs beschreibt. Berücksichtige bei der Prüfung des Abbruchs die letzte nicht erfüllte Bedingung. Eine Ablaufverfolgung, die Werte vor und nach der Aktualisierung mischt, kann eine korrekte Schleife falsch aussehen lassen.

Trennzeichen zwischen Elemente setzen

Fünf Zahlen brauchen vier Kommas. Gib vor jedem Element außer dem ersten ein Trennzeichen aus:

for (int i = 1; i <= 5; i++) {
    if (i > 1) {
        System.out.print(", ");
    }
    System.out.print(i);
}

Die Ausgabe lautet „1, 2, 3, 4, 5“, ohne Komma am Anfang oder Ende. Das ist ein Zaunpfahlproblem: Die Anzahl der Zwischenräume unterscheidet sich von der Anzahl der Elemente.

Testfälle, die Fehler aufdecken

Probiere null Durchläufe, einen Durchlauf und die Werte an und neben jeder Grenze. Probiere bei Eingabeschleifen zuerst die Endemarkierung. Prüfe bei verschachtelten Schleifen, ob die zweite Zeile korrekt zurückgesetzt wird. Vorübergehende Ausgaben der Schleifenvariablen zeigen den tatsächlichen Fortschritt. Hängt ein Programm, untersuche jeden Pfad auf eine Aktualisierung oder einen Abbruch und stoppe es im Terminal mit Strg+C oder mit der Stopptaste der Entwicklungsumgebung.

Wichtige Erkenntnisse

  • Die innere Schleife wird für jeden äußeren Durchlauf vollständig ausgeführt.
  • Multipliziere die Anzahlen der Durchläufe nur, wenn beide feststehen.
  • Setze den Zähler einer inneren while-Schleife für jeden äußeren Durchlauf zurück.
  • Setze den Zeilenumbruch einer Zeile nach ihre innere Schleife.
  • Verwende für die Zeilen einer Ablauftabelle in jedem Durchlauf einen einheitlichen Zeitpunkt.
  • Teste null Durchläufe, einen Durchlauf und beide Seiten einer Grenze.
  • Trennzeichen stehen zwischen Elementen, daher ist ihre Anzahl um eins kleiner.

Bedingungen und Schleifen in Java: Beispiele

4 Interaktive Lektionen

1

Wandle eine Programmregel in eine Bedingung um

12 Schritte
Erstelle Vergleiche, verknüpfe sie und prüfe sowohl ihre Wahrheitswerte als auch ihre Auswertungsreihenfolge.
  1. 1
    EinführungBeginne mit einer Regel über Daten

    Eine Bedingung beantwortet eine Frage zu den aktuellen Daten mit wahr oder falsch. Beginne mit einfachen Vergleichen und verknüpfe sie dann zu einer Regel, die genau die beabsichtigten Werte akzeptiert.

    Wir prüfen einen Temperaturbereich, vergleichen Text und sichern eine Ganzzahldivision ab. Unterscheide bei jedem Schritt zwischen der Bedeutung der Bedingung und der Reihenfolge, in der Java sie auswertet.

  2. 2
    ErklärungGib einem Vergleich einen Namen

    Ein Vergleich liefert einen boolean-Wert, der für die spätere Verwendung gespeichert werden kann.

    int age = 17;
    boolean isAdult = age >= 18;
    

    Hier speichert isAdult den Wert false. Der Ausdruck if (isAdult) prüft diesen Wert später direkt. Eine bloße ganze Zahl kann nicht als Bedingung dienen: if (age) schlägt fehl, weil Java einen booleschen Wert und keine als Wahrheitswert verwendete Zahl verlangt.

  3. 3
    BeispielLies den Operator genau

    Bei a = 7 und b = 10 ist a < b wahr und a >= b falsch. Die Vergleiche a != b und a == 7 sind wahr.

    Der Unterschied zwischen = und == ist wichtig: Eine Zuweisung ändert eine Variable, während ein Vergleich eine Frage stellt. Bei einem booleschen Wert wird if (done = true) kompiliert, überschreibt aber das Flag vor der Prüfung. Verwende if (done), um den vorhandenen Wert zu prüfen.

  4. 4
    TippGleiche die Zeichen einer Eingabe ab

    Ein String wie command, der nicht null ist, hat einen Textinhalt und eine Objektidentität. command.equals("quit") prüft die Zeichen; command == "quit" prüft die Identität.

    Verwende equalsIgnoreCase nur, wenn Unterschiede in der Groß- und Kleinschreibung akzeptiert werden sollen. Zum Beispiel stimmen „Quit“ und „quit“ mit dieser Methode überein, unterscheiden sich aber bei equals. Die Negation einer exakten Übereinstimmung ergibt !command.equals("quit").

  5. 5
    BeispielPrüfe eine Differenz zwischen Dezimalzahlen
    double sum = 0.1 + 0.2;
    boolean close = Math.abs(sum - 0.3) < 1e-9;
    

    Die Summe wird als 0.30000000000000004 gespeichert. Exakte Gleichheit mit 0.3 ist falsch, aber die absolute Differenz liegt unter dieser Toleranz, sodass close wahr ist. Der Toleranztest akzeptiert eine kleine Differenz; er ändert weder einen der gespeicherten Werte noch macht er sie exakt gleich.

  6. 6
    HerausforderungPrüfe eine negative ungerade Zahl

    Ein Programm verwendet n % 2 == 1, um ungerade ganze Zahlen zu erkennen. Was übersieht es, wenn n gleich -11 ist, und wie lässt sich die Prüfung reparieren?

    ---reveal---

    -11 % 2 ist -1, daher ist die Prüfung falsch, obwohl -11 ungerade ist. Verwende n % 2 != 0: Bei Teilbarkeit durch 2 ist der Rest null, und sowohl positive als auch negative Reste ungleich null zeigen ungerade ganze Zahlen an.

  7. 7
    ErklärungVerlange beide Schranken

    Um Temperaturen von 18 bis einschließlich 24 °C zu akzeptieren, verlange beide Vergleiche: temp >= 18 && temp <= 24.

    Bei 21 sind beide wahr. Bei 17 ist der erste falsch; bei 25 ist der zweite falsch. Würde zwischen diesen Schranken für den inneren Bereich || verwendet, würden alle drei Werte akzeptiert, weil jeder mindestens eine der beiden Prüfungen erfüllt. Jeder Operand muss ein vollständiger boolescher Ausdruck sein.

  8. 8
    KernaussageKehre den gesamten Bereich um

    Außerhalb desselben Bereichs bedeutet temp < 18 || temp > 24. Eine nicht erfüllte Schranke reicht aus, um außerhalb zu liegen.

    Hier zeigt sich ein De Morgansches Gesetz: !(p && q) entspricht !p || !q. Beim Negieren beider Teile ändert sich auch der verknüpfende Operator. Das zugehörige Gesetz lautet: !(p || q) entspricht !p && !q; bliebe die alte Verknüpfung erhalten, würden andere Eingaben akzeptiert.

  9. 9
    BeispielSetze eine Schutzbedingung vor die Division
    int total = 36;
    int count = 0;
    boolean large = count != 0 && total / count > 10;
    

    Der falsche erste Vergleich legt das Ergebnis fest, daher überspringt && die Division. Das ist Kurzschlussauswertung. Würden die Operanden vertauscht, würde vor der Prüfung von count durch null dividiert und eine ArithmeticException geworfen. Bei || überspringt ein wahrer linker Operand entsprechend den rechten.

  10. 10
    HerausforderungUnterscheide Gruppierung und Lesereihenfolge

    Ergeben bei a = true, b = false und c = false die Ausdrücke a || b && c und (a || b) && c dasselbe Ergebnis? Erkläre die Gruppierung.

    ---reveal---

    Nein. Der erste Ausdruck wird als a || (b && c) gruppiert, weil && eine höhere Rangfolge hat, und ist daher wahr. Der zweite verlangt das Ergebnis von a || b und außerdem c; da c falsch ist, ist dieses Ergebnis falsch.

  11. 11
    HerausforderungKombiniere eine Schranke und eine Ausnahme

    Eine Last wird akzeptiert, wenn sie von 6 bis einschließlich 14 kg beträgt oder eine Übersteuerung aktiv ist. Außerdem muss die Ganzzahlberechnung 100 / count > 5 sicher ausgeführt werden können und die Bedingung erfüllen. Schreibe die Bedingung so, dass bei count 0 die Division nicht erreicht wird.

    ---reveal---

    count != 0 && (load >= 6 && load <= 14 || override) && 100 / count > 5

    Die erste Schutzbedingung weist null zurück. Die gruppierte Auswahl akzeptiert den Bereich oder die Übersteuerung; nur ein Pfad, der diese Prüfungen besteht, erreicht die Division.

  12. 12
    ZusammenfassungPrüfe eine Bedingung von beiden Seiten

    Probiere vor der Verwendung einer Bedingung eine Eingabe, die akzeptiert werden sollte, und eine, die abgelehnt werden sollte. Prüfe bei Intervallen auch die Endpunkte.

    Lies Klammern und Operatorrangfolge, um die Gruppierung zu bestimmen, und verfolge dann die Kurzschlussauswertung von links nach rechts. So erkennst du sowohl eine falsche Regel für die Annahme als auch eine Berechnung, die vor ihrer Schutzbedingung ausgeführt wird.

2

Wähle einen Pfad und erzeuge ein Ergebnis

14 Schritte
Verfolge Blöcke, ordne überlappende Fälle und verwende switch-Ausdrücke für die Auswahl anhand exakter Werte.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungVerfolge den Pfad, den Java erreicht
  2. 2
    BeispielFühre genau einen Zweig aus
  3. 3
    ErklärungHalte das Ergebnis nach der Entscheidung fest
  4. 4
    HerausforderungFinde eine bedingungslose Ausgabe
  5. 5
    TippMache die innere Auswahl deutlich
  6. 6
    BeispielPrüfe Schwellenwerte in der richtigen Reihenfolge
  7. 7
    VerbindungTrenne unabhängige Aktionen
  8. 8
    HerausforderungKorrigiere einen fehlenden Endwert
  9. 9
    ErklärungWähle anhand eines exakten Werts
  10. 10
    BeispielWeise den gewählten Wert zu
  11. 11
    ErklärungGib einem Block seinen Wert
  12. 12
    HerausforderungVerfolge Fall-through bei Doppelpunkten
  13. 13
    HerausforderungWähle eine Struktur für eine kombinierte Regel
  14. 14
    ZusammenfassungUntersuche die Grenzen der Entscheidung
3

Verfolge eine Schleife vom ersten Durchlauf bis zum Abbruch

18 Schritte
Verfolge kopf- und fußgesteuerte Schleifen, gezählte Wiederholungen, übersprungene Durchläufe und Abbrüche mit Sprungmarke.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungBeobachte die Zustandsänderung
  2. 2
    ErklärungPrüfe vor dem Eintritt
  3. 3
    BeispielVerfolge ein sich änderndes Produkt
  4. 4
    HerausforderungVermeide einen übersprungenen Stoppwert
  5. 5
    ErklärungFühre den Rumpf vor der Entscheidung einmal aus
  6. 6
    BeispielLies eine Bewertung vor der Prüfung ein
  7. 7
    HerausforderungSage einen akzeptierten Endwert voraus
  8. 8
    VerbindungVerlege das Zählen in den Kopf
  9. 9
    BeispielZähle in Schritten größer als eins
  10. 10
    HerausforderungBehalte den beabsichtigten Endwert bei
  11. 11
    TippPrüfe auf einen leeren Rumpf
  12. 12
    BeispielHalte beim ersten Treffer an
  13. 13
    ErklärungÜberspringe den Rest eines Durchlaufs
  14. 14
    HerausforderungFinde die übersprungene Aktualisierung
  15. 15
    ErklärungGib einer äußeren Schleife einen Namen für den Abbruch
  16. 16
    VerbindungHalte switch- und Schleifenabbrüche auseinander
  17. 17
    HerausforderungKombiniere Überspringen und vorzeitigen Abbruch
  18. 18
    ZusammenfassungVerfolge das nächste Ziel
4

Erzeuge Ergebnisse, die alle verarbeiteten Daten beschreiben

19 Schritte
Kombiniere Zähler, Extremwerte, Flags, Ziffern und verschachtelte Schleifen und prüfe ihren Zustand mit Ablaufverfolgungen und Randfällen.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungEntscheide, was einen Durchlauf überdauern muss
  2. 2
    ErklärungTrenne eine Anzahl von einer Summe
  3. 3
    BeispielLies die Endemarkierung ein und weise sie zurück
  4. 4
    BeispielVerfolge den Zustand während der Eingabe
  5. 5
    ErklärungErhalte den Nachkommateil des Mittelwerts
  6. 6
    HerausforderungBerechne den Mittelwert nur aus akzeptierten Messwerten
  7. 7
    TippWähle früh genug einen ausreichend großen Rechentyp
  8. 8
    BeispielHalte den besten Messwert fest
  9. 9
    HerausforderungHalte fest, wo gleiche Werte auftreten
  10. 10
    KernaussageLass ein Flag einen Treffer festhalten
  11. 11
    ErklärungSuche nach einem Teiler
  12. 12
    BeispielExtrahiere Ziffern in einer festen Reihenfolge
  13. 13
    HerausforderungHalte einen negativen Messwert fest
  14. 14
    ErklärungSchließe jede Zeile ab, bevor du fortfährst
  15. 15
    BeispielZähle bei wechselnder Zeilenlänge
  16. 16
    HerausforderungKorrigiere das Trennzeichen beim ersten Element
  17. 17
    TippWähle aufschlussreiche Zeilen für die Ablaufverfolgung
  18. 18
    HerausforderungKombiniere eine veränderliche Schleifengrenze mit einer Auswahl
  19. 19
    ZusammenfassungPrüfe die Bedeutung jedes Ergebnisses

Bedingungen und Schleifen in Java: Übungsaufgaben

50 Übungsfragen in 5 Sets

Set 1: Verfolge Schleifenprüfungen, Aktualisierungen und Abbrüche10 Übungsfragen

Frage 1 von 10

Wie oft wird der Rumpf ausgeführt?

int n = 12;
while (n < 8) {
    n++;
}
  1. 1-mal
  2. 4-mal
  3. 0-mal
  4. 5-mal
Antwort zeigenAntwort ausblenden
Antwort: C
Eine while-Schleife prüft ihre Bedingung, bevor sie den Rumpf betritt. Der anfängliche Vergleich 12 < 8 ist falsch, daher gibt es weder ein Inkrement noch eine Ausführung des Rumpfs. Ein verpflichtender erster Durchlauf gehört zu do-while, dessen Prüfung dem Rumpf folgt.

Frage 2 von 10

Was wird ausgegeben?

int level = 9;
do {
    level -= 2;
} while (level > 8);
System.out.println(level);
  1. 7
  2. 9
  3. 8
  4. 5
Antwort zeigenAntwort ausblenden
Antwort: A
Der do-while-Rumpf wird zuerst ausgeführt und subtrahiert 2, wodurch level zu 7 wird. Seine Bedingung ist dann falsch, sodass die Schleife endet. Bliebe 9 erhalten, würde dies wie eine kopfgesteuerte while-Schleife behandelt und die erste Ausführung des Rumpfs übersprungen.

Frage 3 von 10

Wie oft wird der Rumpf ausgeführt?

for (int k = 2; k <= 17; k += 4) {
    System.out.println(k);
}
  1. 3
  2. 5
  3. 6
  4. 4
Antwort zeigenAntwort ausblenden
Antwort: D
Der Rumpf verwendet 2, 6, 10 und 14. Die nächste Aktualisierung ergibt 18, was die Prüfung der einschließenden oberen Schranke nicht erfüllt. Es wäre ein Fehler, 17 allein deshalb einzuschließen, weil die Bedingung <= verwendet: Die Schrittweite erreicht diesen Wert nie.

Frage 4 von 10

Was wird ausgegeben, wenn du das letzte Leerzeichen ignorierst?

for (int k = 2; k <= 7; k++) {
    if (k % 2 == 0) {
        continue;
    }
    System.out.print(k + " ");
}
  1. „2 4 6“
  2. „3 5 7“
  3. „3“
  4. „3 4 5 6 7“
Antwort zeigenAntwort ausblenden
Antwort: B
Gerade Werte führen zu continue und überspringen die Ausgabe; ungerade Werte erreichen sie. Die Aktualisierung der for-Schleife wird nach continue trotzdem ausgeführt, sodass der Zähler weiterläuft. Nur 3 auszugeben würde das Überspringen eines Durchlaufs mit dem Beenden der gesamten Schleife verwechseln.

Frage 5 von 10

Welche Werte haben amount und steps nach dieser Schleife?

int amount = 3;
int steps = 0;
while (amount < 40) {
    amount *= 2;
    steps++;
}
  1. amount = 24, steps = 3
  2. amount = 40, steps = 4
  3. amount = 48, steps = 5
  4. amount = 48, steps = 4
Antwort zeigenAntwort ausblenden
Antwort: D
Die Menge nimmt nacheinander die Werte 6, 12, 24 und 48 an, wobei pro Verdopplung ein Schritt gezählt wird. Die Prüfung schlägt erst nach Erreichen von 48 fehl. Ein Abbruch bei 24 verwechselt den letzten Wert, der die Bedingung erfüllt, mit dem Wert, der nach der letzten Ausführung des Rumpfs verbleibt.

Frage 6 von 10

Welchen Wert hat total am Ende?

int total = 0;
for (int k = 1; k <= 8; k++) {
    if (k % 3 == 0) {
        continue;
    }
    total += k;
    if (total > 12) {
        break;
    }
}
  1. 12
  2. 13
  3. 19
  4. 15
Antwort zeigenAntwort ausblenden
Antwort: C
Addiert werden 1, 2, 4, 5 und 7, weil 3 und 6 übersprungen werden. Das ergibt die aufeinanderfolgenden Summen 1, 3, 7, 12 und 19; die letzte Addition löst break aus. Ein Ende bei 12 würde > fälschlich als >= lesen oder die Grenze vor dem Addieren prüfen.

Frage 7 von 10

Eine do-while-Schleife liest eine ganze Zahl von 2 bis 6 ein. Welche Bedingung lässt sie genau dann wiederholen, wenn der Wert ungültig ist?
  1. value < 2 || value > 6
  2. value >= 2 && value <= 6
  3. value < 2 && value > 6
  4. value <= 2 || value >= 6
Antwort zeigenAntwort ausblenden
Antwort: A
Ungültige Werte liegen unter 2 oder über 6, daher muss jede der beiden äußeren Schranken einen weiteren Durchlauf auslösen. Mit <= und >= würden die erlaubten Endwerte zurückgewiesen. Eine Verknüpfung der beiden äußeren Prüfungen mit && würde nie wiederholen, weil keine ganze Zahl beide erfüllt.

Frage 8 von 10

Ein for-Kopf deklariert int index. Wo kann Code diese Variable lesen?
  1. Überall in der main-Methode.
  2. Nur bei der Aktualisierung im Kopf.
  3. Nur nach dem Ende der Schleife.
  4. Nur innerhalb dieser for-Schleife.
Antwort zeigenAntwort ausblenden
Antwort: D
Eine im for-Kopf deklarierte Variable liegt im Kopf und im Schleifenrumpf im Gültigkeitsbereich, dieser endet aber mit der Schleife. Ein anschließender Lesezugriff lässt sich nicht kompilieren. Um den letzten Zählerwert zu behalten, deklariere die Variable vor der for-Anweisung.

Frage 9 von 10

Was wird ausgegeben?

int hits = 0;
outer:
for (int row = 1; row <= 4; row++) {
    for (int col = 1; col <= 4; col++) {
        if (row + col == 5) {
            break outer;
        }
        hits++;
    }
}
System.out.println(hits);
  1. 6
  2. 3
  3. 9
  4. 12
Antwort zeigenAntwort ausblenden
Antwort: B
In Zeile 1 erhöhen die Spalten 1, 2 und 3 den Wert von hits. Spalte 4 ergibt die Summe 5, und das break mit Sprungmarke verlässt die äußere Schleife vor einem weiteren Inkrement. Wer spätere Zeilen mitzählt, behandelt das break mit Sprungmarke wie ein gewöhnliches break, das nur die innere Schleife beendet.

Frage 10 von 10

Warum endet diese Schleife nie?

int n = 1;
while (n != 12) {
    n += 2;
}
  1. Die Aktualisierung verkleinert n bei jedem Durchlauf.
  2. Die Bedingung wird nur einmal geprüft.
  3. Die Folge bleibt ungerade und überspringt 12.
  4. Der Rumpf setzt n bei jedem Durchlauf auf 1.
Antwort zeigenAntwort ausblenden
Antwort: C
Beginnend bei 1 ergibt die wiederholte Addition von 2 nur ungerade Zahlen, sodass n nie zu 12 wird. Die Ungleichung bleibt auch wahr, nachdem n die beabsichtigte Grenze überschritten hat. Eine Schranke wie n < 12 würde stattdessen das Überschreiten der Grenze erkennen, ohne einen exakten Treffer zu verlangen.
Set 2: Lies Bedingungen und wähle einen Pfad10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Welchen Wert hat -13 % 2 != 0?
  1. false
  2. true
  3. -1
  4. 1
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein String command, der nicht null ist, enthält aus einer Eingabe gelesenen Text. Welcher Ausdruck prüft, ob sein Inhalt genau „pause“ ist?
  1. command == "pause"
  2. command.equalsIgnoreCase("pause")
  3. !command.equals("pause")
  4. command.equals("pause")
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Welche Bedingung akzeptiert eine Masse von 4 bis 9 kg einschließlich beider Endpunkte?
  1. mass >= 4 && mass <= 9
  2. mass > 4 && mass < 9
  3. mass >= 4 || mass <= 9
  4. mass < 4 || mass > 9
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Was wird hier ausgegeben?

boolean ready = true;
boolean locked = false;
boolean expired = false;
System.out.println(ready || locked && expired);
  1. false
  2. true false
  3. true
  4. false false
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Was gibt dieser Code aus?

int stock = 0;
if (stock > 0) {
    System.out.print("available ");
} else {
    System.out.print("empty ");
}
System.out.print("checked");
  1. „available checked“
  2. „empty checked“
  3. „empty“
  4. „available empty checked“
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Was wird ausgegeben?

int load = 74;
if (load >= 50) {
    System.out.print("medium");
} else if (load >= 70) {
    System.out.print("high");
} else {
    System.out.print("low");
}
  1. „medium“
  2. „high“
  3. „mediumhigh“
  4. „low“
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Welcher Wert wird in mode gespeichert?

String command = "RUN";
int mode = switch (command) {
    case "run" -> 1;
    case "wait" -> 2;
    default -> 3;
};
  1. 1
  2. 2
  3. 0
  4. 3
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Was geschieht bei int sum = 15; und int count = 0;, wenn count == 0 || sum / count > 4 ausgewertet wird?
  1. Der Ausdruck ergibt ohne Division false.
  2. Der Ausdruck ergibt ohne Division true.
  3. Der Ausdruck wirft eine ArithmeticException.
  4. Der Ausdruck ergibt nach der Division true.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Warum lässt sich dieser Code nicht kompilieren?

int value = 8;
String label;
if (value > 5) {
    label = "large";
}
System.out.println(label);
  1. label liegt außerhalb seines deklarierten Gültigkeitsbereichs.
  2. Ein if kann keinen String-Wert zuweisen.
  3. label erhält nicht auf jedem Pfad einen Wert.
  4. Der Vergleich muss stattdessen >= verwenden.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein Programm erlaubt den Eintritt, wenn member && !blocked || guest && codeValid wahr ist. Welche Bedingung weist genau die Eintritte zurück, die es erlauben würde?
  1. (!member || blocked) && (!guest || !codeValid)
  2. (!member && blocked) || (!guest && !codeValid)
  3. (!member || blocked) || (!guest || !codeValid)
  4. (!member && blocked) && (!guest && !codeValid)
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 3: Berechne Ergebnisse aus wiederholten Eingaben10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Welchen Anfangswert sollte ein Akkumulator haben, bevor er die ganzen Zahlen von 2 bis 6 multipliziert?
  1. 0
  2. 2
  3. 6
  4. 1
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine Schleife liest 9, 4, 8 und dann die Endemarkierung -1 ein. Sie prüft die Endemarkierung, bevor sie Summe und Anzahl aktualisiert. Welchen Mittelwert sollte sie ausgeben?
  1. 5.0
  2. 7.0
  3. 5.25
  4. 6.666666666666667
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Was ergibt (double) (sum / count) bei int sum = 17; und int count = 4;?
  1. 4.25
  2. 4.5
  3. 4.0
  4. 5.0
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Eine Schleife zur Bestimmung des Maximums verarbeitet nur negative ganze Zahlen. Warum kann die Initialisierung von max mit 0 eine falsche Antwort ergeben?
  1. Keine negative Eingabe kann diesen Anfangswert ersetzen.
  2. Jede negative Eingabe wird diesen Anfangswert ersetzen.
  3. Null verhindert den Start der Eingabeschleife.
  4. Der Vergleich negativer ganzer Zahlen verursacht einen Überlauf.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Was wird ausgegeben?

int n = 6205;
int sum = 0;
while (n > 0) {
    sum += n % 10;
    n /= 10;
}
System.out.println(sum);
  1. 12
  2. 56
  3. 13
  4. 5026
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Wie viele Sterne werden insgesamt ausgegeben?

for (int row = 2; row <= 5; row++) {
    for (int col = 1; col < row; col++) {
        if (col == 2) {
            continue;
        }
        System.out.print("*");
    }
}
  1. 6
  2. 9
  3. 10
  4. 7
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Welche Werte haben best und position danach?

int best = Integer.MIN_VALUE;
int position = 0;
for (int day = 1; day <= 5; day++) {
    int value = day % 3 - 4;
    if (value >= best) {
        best = value;
        position = day;
    }
}
  1. best = -2, position = 2
  2. best = -2, position = 5
  3. best = -3, position = 4
  4. best = -4, position = 3
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine Schleife hat 7 akzeptierte von 12 Messwerten gezählt. Welcher Ausdruck berechnet den Prozentsatz der akzeptierten Werte mit Nachkommateil?
  1. 100.0 * accepted / total
  2. accepted / total * 100.0
  3. (double) (accepted / total) * 100
  4. (double) (100 * (accepted / total))
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Wie lautet die Ausgabe?

for (int k = 3; k <= 5; k++) {
    if (k > 3) {
        System.out.print(", ");
    }
    System.out.print(k);
}
  1. „, 3, 4, 5“
  2. „3, 4, 5, “
  3. „3, 4, 5“
  4. „345“
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Was gibt dieser Code aus?

boolean allPositive = true;
for (int k = 1; k <= 4; k++) {
    int value = k - 2;
    if (value <= 0) {
        allPositive = false;
    } else {
        allPositive = true;
    }
}
System.out.println(allPositive);
  1. false, weil ein früherer Wert nicht positiv war.
  2. true, obwohl nicht alle Werte positiv waren.
  3. true, weil jeder erzeugte Wert positiv war.
  4. false, obwohl jeder erzeugte Wert positiv war.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 4: Kombiniere Entscheidungen mit Schleifenmustern10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Welches Schlüsselwort liefert ein Ergebnis aus einem Blockfall mit mehreren Anweisungen in einem switch-Ausdruck?
  1. yield
  2. break
  3. continue
  4. default
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Was wird ausgegeben?

int result = 0;
switch (2) {
    case 1:
        result += 2;
    case 2:
        result += 3;
    case 3:
        result += 5;
        break;
    default:
        result = -1;
}
System.out.println(result);
  1. 3
  2. 10
  3. 8
  4. -1
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Welchen Wert hat total nach der Schleife?

int total = 0;
for (int k = 1; k <= 5; k++) {
    switch (k % 3) {
        case 0:
            break;
        default:
            total += k;
    }
    total++;
}
  1. 14
  2. 17
  3. 16
  4. 5
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Welchen Wert hat total am Ende?

int total = 0;
for (int n = 1; n <= 9; n++) {
    if (n % 2 == 0) {
        total += 2;
    } else if (n % 3 == 0) {
        total += 3;
    } else {
        total--;
    }
}
  1. 14
  2. 8
  3. 9
  4. 11
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Eine Validierungsschleife akzeptiert ganze Zahlen von 10 bis 14. Sie liest mit do { ... } while (value < 10 || value > 14); die Eingaben 8, 14 und dann 11 ein. Wie viele Eingaben liest sie?
  1. 1
  2. 3
  3. 2
  4. 4
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Was wird ausgegeben?

int n = 58;
int result = 0;
do {
    int digit = n % 10;
    if (digit % 2 == 0) {
        result = result * 10 + digit;
    }
    n /= 10;
} while (n > 0);
System.out.println(result);
  1. 8
  2. 85
  3. 5
  4. 58
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine verschachtelte Schleife gibt vier Zeilen mit je sechs Werten aus. Der Aufruf für den Zeilenumbruch steht nach der inneren Schleife, aber innerhalb der äußeren Schleife. Wie viele Wertausgaben und Aufrufe für den Zeilenumbruch werden ausgeführt?
  1. 24 Wertausgaben und 24 Aufrufe für den Zeilenumbruch.
  2. 10 Wertausgaben und 4 Aufrufe für den Zeilenumbruch.
  3. 24 Wertausgaben und 6 Aufrufe für den Zeilenumbruch.
  4. 24 Wertausgaben und 4 Aufrufe für den Zeilenumbruch.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Warum kann Math.abs((0.1 + 0.2) - 0.3) < 1e-9 wahr sein, während (0.1 + 0.2) == 0.3 falsch ist?
  1. Die Toleranz ändert die gespeicherte Summe zu genau 0,3.
  2. Die berechnete Differenz ist ungleich null, aber kleiner als die Toleranz.
  3. Der Gleichheitsoperator vergleicht Identitäten von double-Objekten.
  4. Der Aufruf zur Betragsbildung rundet jede Differenz auf null.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine Schleife mit Endemarkierung soll den Mittelwert positiver ganzer Zahlen bis 0 berechnen. Ihr Rumpf liest einen Wert ein, erhöht count, prüft auf 0 und bricht ab, bevor er den Wert addiert. Für die Eingaben 6, 10, 0 gibt sie (double) sum / count aus. Was ist das Ergebnis und welche Korrektur ist nötig?
  1. Etwa 5,3333; erst nach der Abbruchprüfung zählen.
  2. 8,0; die Aktualisierung der Summe vor die Abbruchprüfung setzen.
  3. 16,0; count vor dem Einlesen mit 1 initialisieren.
  4. Etwa 5,3333; stattdessen den fertigen Quotienten umwandeln.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Was gibt dieser Code aus?

for (int n = 4; n > 0; n--);
{
    System.out.print("done");
}
  1. Viermal „done“
  2. Überhaupt nichts
  3. Unendlich oft „done“
  4. Einmal „done“
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 5: Finde Fehler und sage zusammengesetztes Verhalten voraus10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Was ist !(false || true)?
  1. true
  2. 0
  3. false
  4. 1
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Was wird ausgegeben?

int a = -2;
int b = 5;
if (a > 0)
    if (b > 0)
        System.out.print("both");
    else
        System.out.print("one");
System.out.print("end");
  1. „oneend“
  2. „end“
  3. „bothend“
  4. „bothoneend“
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Welcher Wert wird zugewiesen?

int level = 3;
int result = switch (level) {
    case 1, 2 -> 4;
    case 3 -> {
        int base = level * 2;
        yield base + 1;
    }
    default -> 0;
};
  1. 6
  2. 4
  3. 0
  4. 7
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Welchen Wert hat count am Ende?

int count = 0;
outer:
for (int row = 1; row <= 3; row++) {
    for (int col = 1; col <= 3; col++) {
        if (row == col) {
            continue outer;
        }
        count++;
    }
}
  1. 3
  2. 6
  3. 0
  4. 9
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Für n = 143 beginnt eine Schleife zur Primzahlprüfung beim Teiler 2 und läuft, solange d * d <= n gilt. Bei einem Rest von null bricht sie ab. Bei welchem Teiler bricht sie zuerst ab?
  1. 7
  2. 11
  3. 12
  4. 13
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Welchen Wert hat count am Ende?

int count = 0;
int col = 1;
for (int row = 1; row <= 3; row++) {
    while (col <= row) {
        count++;
        col++;
    }
}
  1. 6
  2. 1
  3. 9
  4. 3
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine Eingabeschleife endet bei der Endemarkierung -9 und soll nur aus positiven Werten den Mittelwert berechnen. Summe und Anzahl beginnen bei 0. Die Schleife prüft auf die Endemarkierung, addiert dann jeden Datenwert zu sum, erhöht count aber nur für positive Werte. Was gibt (double) sum / count für die Eingaben -4, 6, -2, 10, -9 aus und welche Korrektur ist nötig?
  1. 5.0; nur positive Werte addieren und zählen.
  2. 8.0; nur positive Werte addieren und zählen.
  3. 2.5; jeden Datenwert addieren und zählen.
  4. 5.0; positive Werte addieren, aber jeden Datenwert zählen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Welche Ziffernanzahl ergibt dies für n = 0?

int n = 0;
int digits = 0;
do {
    digits++;
    n /= 10;
} while (n > 0);
  1. 0
  2. 10
  3. 1
  4. Die Schleife endet nie.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine Kette weist score < 0 || score > 40 zurück und bezeichnet dann score >= 30 als „high“, score >= 18 als „middle“ und den Rest als „low“. Welche Bezeichnungen erhalten die Punktzahlen 40, 41 und 18 in dieser Reihenfolge?
  1. „invalid“, „invalid“, „low“
  2. „high“, „invalid“, „middle“
  3. „high“, „high“, „middle“
  4. „high“, „invalid“, „low“
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine Suche gibt die erste ganze Zahl von 25 bis 75 aus, die durch 4 oder 7, aber nicht durch beide teilbar ist. Was gibt sie aus?
  1. 28
  2. 35
  3. 32
  4. 36
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

63 Schlüsselbegriffe, jeweils mit Definition

A

Ablauftabelle
Eine Ablauftabelle hält ausgewählte Programmwerte an einheitlichen Zeitpunkten während der Ausführung fest und macht so Zustandsänderungen und Schleifenpfade sichtbar.
Eine Ablauftabelle zeigt die Summe nach jedem Durchlauf und die Bedingung, die die Schleife schließlich beendet.
Akkumulator
Ein Akkumulator speichert ein laufendes Ergebnis über Schleifendurchläufe hinweg, indem er jeden akzeptierten Wert zum vorherigen Ergebnis addiert oder damit multipliziert.
Ein vor der Schleife initialisierter Akkumulator speichert die über mehrere Tage zurückgelegte Gesamtstrecke.
Aktualisierung
Eine Aktualisierung ändert den steuernden Zustand einer Schleife nach einem normal abgeschlossenen Rumpf; in einem for-Kopf steht diese Operation nach der Bedingung.
Die Aktualisierung i += 4 erhöht den Zähler von 2 auf 6, nachdem der erste for-Schleifenrumpf beendet ist.

Ä

Äußere Schleife
Eine äußere Schleife umschließt eine weitere Schleife und steuert, wie oft die innere Wiederholung beginnt; häufig geht sie pro Durchlauf eine Zeile weiter.
Die äußere Schleife läuft viermal, wenn eine Tabelle vier Zeilen mit jeweils einem anschließenden Zeilenumbruch braucht.

B

Bedingter Operator
Der bedingte Operator ?: wählt anhand einer booleschen Bedingung einen von zwei Ausdruckswerten und ermöglicht so eine kurze Auswahl zwischen zwei Werten.
Der bedingte Operator setzt label je nach Ergebnis einer Restprüfung auf „even“ oder „odd“.
Block
Ein Block fasst Anweisungen zwischen geschweiften Klammern zusammen, sodass ein Zweig oder eine Schleife die Gruppe als Rumpf mit eigenem Gültigkeitsbereich für lokale Variablen behandeln kann.
Ein Block um zwei Ausgabeanweisungen macht beide von derselben if-Prüfung abhängig.
Boolescher Wert
Ein boolescher Wert ist entweder true oder false; Vergleiche liefern einen solchen Wert, und Java-Bedingungen erfordern einen Ausdruck dieses Typs.
Der in isFull gespeicherte boolesche Wert wird wahr, wenn ein Behälter seine Kapazität erreicht.
break-Anweisung
Eine break-Anweisung verlässt ihr Ziel sofort; ohne Sprungmarke ist ihr Ziel die nächste umgebende Schleife oder der nächste umgebende switch, in dem sie steht.
Eine break-Anweisung beendet die Suche, wenn der erste Kandidat gefunden wird, der die geforderten Prüfungen erfüllt.
break-Anweisung mit Sprungmarke
Eine break-Anweisung mit Sprungmarke benennt eine umgebende Anweisung mit Sprungmarke als Abbruchziel und ermöglicht so einer verschachtelten Suche, eine äußere Schleife zu verlassen.
Eine break-Anweisung mit Sprungmarke beendet beide Suchschleifen sofort, wenn das gesuchte Paar gefunden wird.

C

case-Marke
Eine case-Marke bezeichnet einen festen Wert, den ein switch-Fall akzeptiert; mehrere durch Kommas getrennte Marken können sich eine Aktion mit Pfeil teilen.
Eine case-Marke für 6 kann sich in einem switch mit Pfeil eine Wochenendaktion mit der Marke für 7 teilen.
continue-Anweisung
Eine continue-Anweisung überspringt den Rest des aktuellen Schleifenrumpfs und fährt mit dem nächsten Durchlauf fort; bei einer einfachen for-Schleife gehört dazu die Aktualisierung.
Eine continue-Anweisung überspringt die Ausgabe eines unerwünschten Werts, lässt den for-Zähler aber trotzdem weiterlaufen.
continue-Anweisung mit Sprungmarke
Eine continue-Anweisung mit Sprungmarke zielt auf eine umgebende Schleife mit Sprungmarke, bricht die aktuelle Arbeit ab und fährt mit dem nächsten Durchlauf dieser Schleife fort.
Eine continue-Anweisung mit Sprungmarke wechselt zur Aktualisierung der äußeren for-Schleife, statt die verbleibenden Spalten zu prüfen.

D

Dangling-Else-Problem
Beim Dangling-Else-Problem kann die optische Zuordnung eines else unklar sein; Java ordnet es dem nächsten vorhergehenden if zu, das noch kein else hat.
Geschweifte Klammern lösen das Dangling-Else-Problem, wenn eine äußere Ticketprüfung eine innere Altersprüfung enthält.
De Morgansche Gesetze
Die De Morganschen Gesetze negieren eine verknüpfte boolesche Prüfung, indem sie beide Operanden negieren und den verknüpfenden Operator zwischen Und und Oder wechseln.
De Morgansche Gesetze wandeln eine Prüfung auf „nicht innerhalb eines geschlossenen Intervalls“ in eine Oder-Verknüpfung zweier äußerer Schranken um.
Divisionsrest
Ein Divisionsrest ist der Wert, den % nach einer Ganzzahldivision liefert; ein Rest von null zeigt an, dass ein Wert durch den Divisor teilbar ist.
Der Divisionsrest in -13 % 2 ist -1, daher erkennt eine Prüfung auf einen Rest ungleich null diese ungerade ganze Zahl.
do-while-Schleife
Eine do-while-Schleife führt ihren Rumpf aus, bevor sie ihre Bedingung prüft. Daher findet mindestens ein Durchlauf statt, bevor die Wiederholung enden kann.
Eine do-while-Schleife fragt eine Bewertung ab, bevor sie prüft, ob ein weiterer Versuch nötig ist.

E

Eingabevalidierung
Die Eingabevalidierung prüft, ob ein eingegebener Wert die zulässigen Bedingungen des Programms erfüllt, bevor er eingeordnet oder verarbeitet wird.
Die Eingabevalidierung weist eine Punktzahl über 100 zurück, bevor eine Notenkette sie als „A“ einordnen könnte.
else-if-Kette
Eine else-if-Kette prüft mehrere Bedingungen der Reihe nach und führt nur den ersten Zweig mit wahrer Bedingung aus oder ihr abschließendes else, wenn keine Prüfung erfolgreich ist.
Eine else-if-Kette weist eine Note zu, selbst wenn die Punktzahl mehrere niedrigere Schwellenwerte erfüllt.
Endemarkierung
Eine Endemarkierung ist ein festgelegter Eingabewert, der das Ende einer Folge signalisiert und vor der gewöhnlichen Datenverarbeitung geprüft wird.
Eine Endemarkierung von -1 beendet das Einlesen, ohne als zusätzliches Element in die Anzahl oder Summe der Daten einzugehen.
Endlosschleife
Eine Endlosschleife wiederholt sich ohne Abbruch, oft weil eine erforderliche Aktualisierung fehlt oder ein Stoppwert nie erreicht wird.
Ein Zähler, der bei der Prüfung i <= 5 bei 1 bleibt, erzeugt eine Endlosschleife, sofern kein anderer Pfad die Schleife verlässt.
Exklusives Oder
Das exklusive Oder ist wahr, wenn genau einer von zwei booleschen Operanden wahr ist; Java drückt diese Operation mit dem Operator ^ aus.
Das exklusive Oder weist einen Wert zurück, der durch beide getesteten Zahlen teilbar ist, wenn genau eine Teilbarkeitsregel gelten muss.

F

Fall-through
Fall-through bezeichnet die Fortsetzung der Ausführung von einem Fall mit Doppelpunkt in spätere case-Anweisungen, bis ein Abbruch erfolgt oder der switch endet.
Ein fehlendes break verursacht Fall-through, sodass beim passenden ersten Fall dessen Statusmeldung und anschließend auch die Meldung des nächsten Falls ausgegeben werden.
Flag
Ein Flag ist eine boolesche Variable, die festhält, ob eine Bedingung erfüllt wurde, etwa ob ein Treffer gefunden oder ein Gegenbeispiel angetroffen wurde.
Ein Flag für mindestens einen negativen Messwert bleibt nach einem Treffer wahr, selbst wenn der letzte Messwert positiv ist.
for-Schleife
Eine for-Schleife fasst Initialisierung, wiederholte Bedingungsprüfung und Aktualisierung in einem Kopf zusammen und macht gezählte Wiederholungen leicht nachvollziehbar.
Eine for-Schleife durchläuft die ganzen Zahlen von 1 bis 12 und addiert jeden Wert zu einer laufenden Summe.
Fortsetzungsbedingung
Eine Fortsetzungsbedingung beschreibt, wann ein weiterer Schleifendurchlauf stattfinden soll; ein wahres Ergebnis wiederholt die Schleife und ein falsches beendet die Wiederholung.
Die Fortsetzungsbedingung für die Eingabe einer Bewertung ist außerhalb des Intervalls von 1 bis einschließlich 5 wahr.
Fußgesteuerte Schleife
Eine fußgesteuerte Schleife prüft erst nach der Ausführung ihres Rumpfs, ob ein weiterer Durchlauf erfolgt; Javas do-while-Form setzt die Bedingung nach die schließende geschweifte Klammer.
Eine fußgesteuerte Schleife kann ein Menü einmal anzeigen, selbst wenn der erste Befehl sie sofort beendet.

G

Ganzzahldivision
Die Ganzzahldivision dividiert ganzzahlige Operanden und verwirft einen möglichen Nachkommateil, sodass eine Umwandlung des fertigen Ergebnisses diesen Teil nicht wiederherstellen kann.
Die Ganzzahldivision ergibt für 17 / 4 den Wert 4, weshalb bei einer Mittelwertberechnung zuerst ein Operand umgewandelt wird.
Gegenbeispiel
Ein Gegenbeispiel ist ein einzelner Wert, der eine Aussage über alle Werte falsch macht; ein Flag für Treffer bei allen Werten bleibt danach falsch.
Ein Messwert von null ist ein Gegenbeispiel zur Aussage, dass jeder erfasste Wert positiv ist.
Gleichheitsoperator
Der Gleichheitsoperator == vergleicht primitive Werte; bei Objektreferenzen wie Strings prüft er dagegen, ob die Objekte identisch sind.
Der Gleichheitsoperator akzeptiert 3 == 3.0, weil eine numerische Typumwandlung ihre Werte gleich macht.
Grenzwerttest
Ein Grenzwerttest prüft einen Wert an oder neben einem Schwellenwert und hilft, Lücken, Überschneidungen sowie einen falsch ein- oder ausgeschlossenen Endwert aufzudecken.
Ein Grenzwerttest mit 29, 30 und 31 prüft den Übergang in eine Kategorie, die bei 30 beginnt.
Gültigkeitsbereich
Der Gültigkeitsbereich einer lokalen Variablen ist der Teil des Programms, in dem diese Variable benannt werden kann; eine Deklaration im Block endet an dessen schließender Klammer.
Der Gültigkeitsbereich eines vor einem if deklarierten Ergebnisses erlaubt es der folgenden Ausgabe, den zugewiesenen Wert zu lesen.

I

Initialisierung
Eine Initialisierung gibt einer Variablen ihren Anfangswert; die Initialisierung einer for-Schleife wird einmal vor ihrer ersten Bedingungsprüfung ausgeführt.
Die Initialisierung setzt einen Countdown auf 8, bevor im Kopf seine Prüfung und Verringerung beginnen.
Innere Schleife
Eine innere Schleife wird von einer anderen Schleife umschlossen und führt eine wiederholte Aufgabe aus, etwa das Durchlaufen jeder Spalte der aktuellen Zeile.
Die innere Schleife beginnt in jeder Zeile erneut bei Spalte 1, wenn ihr Zähler korrekt zurückgesetzt wird.

K

Kurzschlussauswertung
Die Kurzschlussauswertung überspringt den rechten Operanden von && oder ||, wenn der linke Operand bereits das gesamte Ergebnis bestimmt.
Die Kurzschlussauswertung macht count != 0 && sum / count > 5 sicher, wenn beide Variablen int-Werte sind.

L

Laufende Summe
Eine laufende Summe ist die Summe aller bisher verarbeiteten Werte. Sie wird bei jedem Durchlauf aktualisiert und steht für eine Zwischen- oder Endausgabe zur Verfügung.
Eine nach jeder Addition ausgegebene laufende Summe zeigt den Fortschritt, bevor die letzte Eingabe erfolgt.
Logisches Oder
Das logische Oder verknüpft zwei boolesche Ausdrücke und ist wahr, wenn mindestens einer wahr ist, auch wenn beide wahr sind; seine Form mit Kurzschlussauswertung ist ||.
Ein logisches Oder akzeptiert einen Befehl, wenn er mit einer von zwei erlaubten Textmarken übereinstimmt.
Logisches Und
Das logische Und verknüpft zwei boolesche Ausdrücke und ist nur wahr, wenn beide wahr sind; Java schreibt seine Form mit Kurzschlussauswertung als &&.
Ein logisches Und verknüpft die untere und obere Schranke, wenn beide für eine akzeptierte Temperatur gelten müssen.

M

Maximum
Ein Maximum ist der größte Wert in den verarbeiteten Daten; eine Schleife hält ihn fest, indem sie den gespeicherten besten Wert nur bei Bedarf ersetzt.
Das Maximum mehrerer negativer Temperaturen muss mit einem Datenwert oder einem ausreichend niedrigen Anfangswert initialisiert werden.
Minimum
Ein Minimum ist der kleinste Wert in den verarbeiteten Daten. Es wird verfolgt, indem der gespeicherte beste Wert bei einem kleineren Messwert ersetzt wird.
Das Minimum bleibt an einem wärmeren Tag unverändert, weil der neue Messwert nicht kleiner ist.

N

Negation
Die Negation kehrt einen booleschen Wert mit ! um und macht aus wahr falsch und aus falsch wahr, ohne die zugrunde liegenden Daten zu ändern.
Die Negation in !command.equals("stop") ist wahr, solange sich der eingegebene Text von „stop“ unterscheidet.

O

Off-by-one-Fehler
Ein Off-by-one-Fehler lässt eine Schleife einmal zu oft oder zu wenig laufen, meist weil ihr Startwert oder ihre Endpunktprüfung falsch ist.
Ein Off-by-one-Fehler lässt den letzten Wert aus, wenn eine Schleife < 12 verwendet, aber 12 einschließen muss.
Operatorrangfolge
Die Operatorrangfolge bestimmt, wie Ausdrücke ohne Klammern gruppiert werden; das logische Und bindet stärker als das logische Oder.
Durch die Operatorrangfolge bedeutet a || b && c dasselbe wie a || (b && c), obwohl Oder zuerst erscheint.

P

Primzahl
Eine Primzahl ist eine ganze Zahl von mindestens 2, die außer 1 und sich selbst keine positiven Teiler hat; ein weiterer gefundener Teiler schließt sie aus.
Der Primzahltest weist 91 zurück, wenn er den Teiler 7 erreicht, weil der Rest null ist.

R

Randfall
Ein Randfall ist eine Eingabe oder ein Anfangszustand nahe einer Grenze, etwa leere Daten, ein Durchlauf oder ein Endwert, durch den ein verborgener Fehler sichtbar werden kann.
Ein Randfall, bei dem die Endemarkierung zuerst eingegeben wird, prüft, ob eine Schleife zur Mittelwertberechnung fehlende Daten behandelt.

S

Schleifendurchlauf
Ein Schleifendurchlauf ist eine Ausführung eines Schleifenrumpfs; die Schleifenbedingung bestimmt, ob ein weiterer Durchlauf beginnen kann oder die Wiederholung endet.
Ein Schleifendurchlauf verdoppelt die gespeicherte Menge und erhöht die Anzahl der vergangenen Tage um eins.
Schleifenvariable
Eine Schleifenvariable enthält einen veränderlichen Zustand, der die Wiederholung steuert oder beschreibt, etwa die aktuelle Anzahl oder einen Kandidatenwert.
Die Schleifenvariable wird um drei erhöht, sodass eine Prüfung der Schranke die Schleife auch dann beenden kann, wenn ein exakter Zielwert übersprungen wird.
Schwellenwert
Ein Schwellenwert ist ein Grenzwert, der Ergebnisse trennt; sein Vergleichsoperator bestimmt, ob der Schwellenwert selbst zu einem Fall gehört.
Ein als score >= 30 geschriebener Schwellenwert schließt 30 ein, während score > 30 genau diese Punktzahl ausschließt.
Selektor
Ein Selektor ist der von einem switch ausgewertete und mit seinen case-Marken abgeglichene Wert, um zu wählen, welcher Code oder Ausdruck ausgeführt wird.
Der Selektor command leitet den Text „wait“ an einen Fall mit genau dieser String-Marke weiter.
Suche
Eine Suche untersucht Kandidaten, bis sie einen gesuchten Treffer findet oder alle verfügbaren Kandidaten ohne Treffer geprüft hat.
Eine Suche kann bei der ersten Zahl anhalten, deren Quadrat den gewählten Grenzwert überschreitet.
switch-Ausdruck
Ein switch-Ausdruck wählt anhand passender Fälle einen Wert aus und liefert ihn, sodass sein Ergebnis zugewiesen oder in einem anderen Ausdruck verwendet werden kann.
Ein switch-Ausdruck weist die Anzahl der Tage zu, indem er den Fall für den aktuellen Monat auswählt.

T

Toleranz
Eine Toleranz ist eine zulässige Größe einer Differenz beim Vergleich berechneter Zahlen, die kleine Rundungsfehler enthalten können.
Eine Toleranz von 1e-9 akzeptiert in dieser Berechnung die winzige Differenz zwischen 0.1 + 0.2 und 0.3.

Ü

Überlauf
Ein Überlauf entsteht, wenn ein ganzzahliges Ergebnis den Wertebereich seines Typs überschreitet und ohne arithmetische Fehlermeldung auf einen anderen Wert springt.
Ein Überlauf in einem int-Akkumulator verfälscht eine große Summe, obwohl jede einzelne Eingabe in einen int passt.

V

Vergleichsoperator
Ein Vergleichsoperator prüft, in welcher Beziehung zwei Werte stehen, und liefert einen booleschen Wert, etwa ob eine Zahl größer als eine andere ist.
Der Vergleichsoperator <= schließt eine Punktzahl, die der oberen Grenze entspricht, in einen zulässigen Bereich ein.
Verschachtelte Schleife
Eine verschachtelte Schleife ist eine Schleife innerhalb einer anderen Schleife, sodass sie bei jedem Durchlauf des umgebenden Rumpfs vollständig ausgeführt wird.
Eine verschachtelte Schleife gibt alle Spalten einer Zeile aus, bevor die äußere Schleife zur nächsten Zeile übergeht.
Vollständigkeit
Vollständigkeit bedeutet, dass ein switch, der einen Wert liefert, jeden möglichen Selektorwert berücksichtigt, sodass keine Eingabe ohne Ergebnis bleibt.
Ein default-Fall sorgt bei einem int-switch mit nur wenigen ausdrücklichen Marken für Vollständigkeit.
Vorzeitiger Schleifenabbruch
Ein vorzeitiger Schleifenabbruch beendet eine Schleife, bevor ihre Bedingung sie normalerweise anhalten würde, oft weil ein Suchergebnis oder ein Stoppbefehl gefunden wurde.
Ein vorzeitiger Schleifenabbruch verhindert, dass eine Endemarkierung zu einer laufenden Summe addiert oder als Datenwert gezählt wird.

W

while-Schleife
Eine while-Schleife prüft vor jeder Ausführung des Rumpfs eine boolesche Bedingung und kann null Durchläufe ausführen, wenn die erste Prüfung falsch ist.
Eine while-Schleife verdoppelt eine Menge, bis sie ihren Zielwert erreicht oder überschreitet.

Y

yield-Anweisung
Die yield-Anweisung liefert einen Wert aus einem Blockfall eines switch-Ausdrucks, nachdem vorherige Berechnungen in diesem Block ausgeführt wurden.
Eine yield-Anweisung liefert 29, nachdem ein Fall für Februar bestimmt hat, dass das Jahr ein Schaltjahr ist.

Z

Zähler
Ein Zähler hält fest, wie viele Ereignisse oder passende Werte aufgetreten sind; gewöhnlich beginnt er bei null und erhöht sich einmal pro Treffer.
Ein Zähler erhöht sich nur für akzeptierte Messwerte und hält so den Nenner ihres Mittelwerts korrekt.
Zaunpfahlproblem
Ein Zaunpfahlproblem entsteht, wenn die Anzahlen von Elementen und Zwischenräumen verschieden sind, etwa wenn fünf ausgegebene Werte vier Trennzeichen brauchen.
Ein Zaunpfahlproblem wird vermieden, indem vor jeder Zahl außer der ersten ein Komma ausgegeben wird.
Ziffernextraktion
Die Ziffernextraktion entnimmt mit % 10 die letzte Dezimalziffer einer nicht negativen ganzen Zahl, sodass sie verwendet werden kann, bevor die Division sie entfernt.
Die Ziffernextraktion durchläuft die Ziffern von rechts nach links, wenn eine Schleife wiederholt durch 10 dividiert.
Zuweisungsoperator
Der Zuweisungsoperator = speichert einen Wert in einer Variablen; der entstehende Ausdruck hat diesen zugewiesenen Wert und kein Vergleichsergebnis.
Die Verwendung des Zuweisungsoperators in if (done = true) ändert das Flag, bevor der Zweig ausgeführt wird.
Zweig
Ein Zweig ist ein Pfad durch eine Entscheidung; eine if-else-Anweisung wählt anhand einer booleschen Bedingung einen ihrer beiden Zweige.
Der Zweig für den falschen Fall gibt „Try again“ aus, wenn die eingegebene Bewertung die geforderte Bedingung nicht erfüllt.

Über diese Einheit

Von StudeliFehler melden

Erstelle deine eigenen Lernmaterialien

Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.

Jetzt starten