- Lernen
- Informatik & Informationswissenschaften
- Programmierung
- Java-Programmierung – Klassen, Vererbung, Collections und Streams
- Bedingungen und Schleifen in Java
Bedingungen und Schleifen in Java
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
- 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 WerteVerwende 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.
- Vergleiche Werte und speichere die Ergebnisse als boolesche Werte
- Lass ein Programm abhängig von Bedingungen unterschiedliche Anweisungen ausführen: von einem einzelnen
ifüberelse if-Ketten und den bedingten Operator bis hin zuswitch.- Führe Code mit if und else abhängig von einer Bedingung ausSchreibe
if- undif-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 ausVerwende
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 ausVerwende
switch-Anweisungen undswitch-Ausdrücke, um anhand des Werts einer Variablen auszuwählen: mit Fällen mit Pfeil, mehreren Marken pro Fall,defaultundyield. Erkenne außerdem Fall-through in der älteren Doppelpunktform.
- Führe Code mit if und else abhängig von einer Bedingung aus
- Schreibe
while-,do-while- undfor-Schleifen, die genau so oft wie nötig ausgeführt werden und zum richtigen Zeitpunkt enden, und steuere sie mitbreakundcontinue.- Wiederhole Anweisungen mit while, solange eine Bedingung erfüllt istSchreibe
while-Schleifen, die korrekt beginnen, aktualisiert werden und enden, verwendewhile (true)mitbreakfür Wiederholungen ohne vorab festgelegtes Ende und vollziehe eine Schleife Durchlauf für Durchlauf nach. - Führe den Schleifenrumpf mit do-while mindestens einmal ausVerwende 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-SchleifenSchreibe
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 continueBeende eine Schleife vorzeitig mit
break, überspringe den Rest eines Durchlaufs mitcontinue, verlasse verschachtelte Schleifen mit einembreakmit Sprungmarke und halte Schleifen mit vorzeitigem Abbruch übersichtlich.
- Wiederhole Anweisungen mit while, solange eine Bedingung erfüllt ist
- 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 MittelwertVerwende 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 ZiffernVerfolge 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 sieSchreibe 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.
- Zähle Werte und berechne ihre Summe und ihren Mittelwert
Bedingungen und Schleifen in Java einfach erklärt
1Erstelle 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
| Operator | Frage |
|---|---|
< | 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
equalsoderequalsIgnoreCase. - Vergleiche berechnete Dezimalzahlen mit einer passenden Toleranz.
- Verwende
n % 2 != 0fü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.
2Wä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
elsegehört zum nächsten noch nicht zugeordnetenif. - 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
switchfü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
breakin den nächsten Fall weiterlaufen. - String-Fälle gleichen Inhalte exakt und unter Beachtung der Groß- und Kleinschreibung ab.
3Steuere 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--;
}
| Zeitpunkt | product | n |
|---|---|---|
| Vor der Schleife | 1 | 3 |
| Nach Durchlauf 1 | 3 | 2 |
| Nach Durchlauf 2 | 6 | 1 |
| Nach Durchlauf 3 | 6 | 0 |
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
| Kopf | Im Rumpf verwendete Werte | Durchläufe |
|---|---|---|
int i = 0; i < 5; i++ | 0 bis 4 | 5 |
int i = 0; i <= 5; i++ | 0 bis 5 | 6 |
int i = 10; i >= 1; i-- | 10 bis 1 | 10 |
int i = 0; i <= 20; i += 5 | 0, 5, 10, 15, 20 | 5 |
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
| Aufgabe | Geeignete Form | Grund |
|---|---|---|
| Einen bekannten Bereich durchlaufen | for | Start, Schranke und Schritt stehen zusammen. |
| Wiederholen, bis sich Eingabe oder Zustand ändern | while | Die Prüfung kann den ersten Durchlauf verhindern. |
| Zuerst fragen, dann prüfen | do-while | Die 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
forfür Bereiche,whilefü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
breakverlässt sein Ziel sofort.continuein einer for-Schleife führt weiterhin die Aktualisierung im Kopf aus.continuein 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.
4Entwickle 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
% 10eine Ziffer und/ 10entfernt 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 Wert | Aktion | Summe nach dem Durchlauf |
|---|---|---|
| 1 | 1 subtrahieren | -1 |
| 2 | 2 addieren | 1 |
| 3 | 3 subtrahieren | -2 |
| 4 | 4 addieren | 2 |
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
1Wandle eine Programmregel in eine Bedingung um
12 Schritte
- 1Einfü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.
- 2Erklä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
isAdultden Wertfalse. Der Ausdruckif (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. - 3BeispielLies den Operator genau
Bei
a = 7undb = 10ista < bwahr unda >= bfalsch. Die Vergleichea != bunda == 7sind wahr.Der Unterschied zwischen
=und==ist wichtig: Eine Zuweisung ändert eine Variable, während ein Vergleich eine Frage stellt. Bei einem booleschen Wert wirdif (done = true)kompiliert, überschreibt aber das Flag vor der Prüfung. Verwendeif (done), um den vorhandenen Wert zu prüfen. - 4TippGleiche 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
equalsIgnoreCasenur, wenn Unterschiede in der Groß- und Kleinschreibung akzeptiert werden sollen. Zum Beispiel stimmen „Quit“ und „quit“ mit dieser Methode überein, unterscheiden sich aber beiequals. Die Negation einer exakten Übereinstimmung ergibt!command.equals("quit"). - 5BeispielPrü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.30000000000000004gespeichert. Exakte Gleichheit mit0.3ist falsch, aber die absolute Differenz liegt unter dieser Toleranz, sodassclosewahr ist. Der Toleranztest akzeptiert eine kleine Differenz; er ändert weder einen der gespeicherten Werte noch macht er sie exakt gleich. - 6HerausforderungPrüfe eine negative ungerade Zahl
Ein Programm verwendet
n % 2 == 1, um ungerade ganze Zahlen zu erkennen. Was übersieht es, wennngleich -11 ist, und wie lässt sich die Prüfung reparieren?---reveal---
-11 % 2ist-1, daher ist die Prüfung falsch, obwohl -11 ungerade ist. Verwenden % 2 != 0: Bei Teilbarkeit durch 2 ist der Rest null, und sowohl positive als auch negative Reste ungleich null zeigen ungerade ganze Zahlen an. - 7Erklä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. - 8KernaussageKehre 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. - 9BeispielSetze 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 eineArithmeticExceptiongeworfen. Bei||überspringt ein wahrer linker Operand entsprechend den rechten. - 10HerausforderungUnterscheide Gruppierung und Lesereihenfolge
Ergeben bei
a = true,b = falseundc = falsedie Ausdrückea || b && cund(a || b) && cdasselbe 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 vona || bund außerdemc; dacfalsch ist, ist dieses Ergebnis falsch. - 11HerausforderungKombiniere 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 > 5sicher 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 > 5Die 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.
- 12ZusammenfassungPrü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.
2Wähle einen Pfad und erzeuge ein Ergebnis
14 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungVerfolge den Pfad, den Java erreicht
- 2BeispielFühre genau einen Zweig aus
- 3ErklärungHalte das Ergebnis nach der Entscheidung fest
- 4HerausforderungFinde eine bedingungslose Ausgabe
- 5TippMache die innere Auswahl deutlich
- 6BeispielPrüfe Schwellenwerte in der richtigen Reihenfolge
- 7VerbindungTrenne unabhängige Aktionen
- 8HerausforderungKorrigiere einen fehlenden Endwert
- 9ErklärungWähle anhand eines exakten Werts
- 10BeispielWeise den gewählten Wert zu
- 11ErklärungGib einem Block seinen Wert
- 12HerausforderungVerfolge Fall-through bei Doppelpunkten
- 13HerausforderungWähle eine Struktur für eine kombinierte Regel
- 14ZusammenfassungUntersuche die Grenzen der Entscheidung
3Verfolge eine Schleife vom ersten Durchlauf bis zum Abbruch
18 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungBeobachte die Zustandsänderung
- 2ErklärungPrüfe vor dem Eintritt
- 3BeispielVerfolge ein sich änderndes Produkt
- 4HerausforderungVermeide einen übersprungenen Stoppwert
- 5ErklärungFühre den Rumpf vor der Entscheidung einmal aus
- 6BeispielLies eine Bewertung vor der Prüfung ein
- 7HerausforderungSage einen akzeptierten Endwert voraus
- 8VerbindungVerlege das Zählen in den Kopf
- 9BeispielZähle in Schritten größer als eins
- 10HerausforderungBehalte den beabsichtigten Endwert bei
- 11TippPrüfe auf einen leeren Rumpf
- 12BeispielHalte beim ersten Treffer an
- 13ErklärungÜberspringe den Rest eines Durchlaufs
- 14HerausforderungFinde die übersprungene Aktualisierung
- 15ErklärungGib einer äußeren Schleife einen Namen für den Abbruch
- 16VerbindungHalte switch- und Schleifenabbrüche auseinander
- 17HerausforderungKombiniere Überspringen und vorzeitigen Abbruch
- 18ZusammenfassungVerfolge das nächste Ziel
4Erzeuge Ergebnisse, die alle verarbeiteten Daten beschreiben
19 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungEntscheide, was einen Durchlauf überdauern muss
- 2ErklärungTrenne eine Anzahl von einer Summe
- 3BeispielLies die Endemarkierung ein und weise sie zurück
- 4BeispielVerfolge den Zustand während der Eingabe
- 5ErklärungErhalte den Nachkommateil des Mittelwerts
- 6HerausforderungBerechne den Mittelwert nur aus akzeptierten Messwerten
- 7TippWähle früh genug einen ausreichend großen Rechentyp
- 8BeispielHalte den besten Messwert fest
- 9HerausforderungHalte fest, wo gleiche Werte auftreten
- 10KernaussageLass ein Flag einen Treffer festhalten
- 11ErklärungSuche nach einem Teiler
- 12BeispielExtrahiere Ziffern in einer festen Reihenfolge
- 13HerausforderungHalte einen negativen Messwert fest
- 14ErklärungSchließe jede Zeile ab, bevor du fortfährst
- 15BeispielZähle bei wechselnder Zeilenlänge
- 16HerausforderungKorrigiere das Trennzeichen beim ersten Element
- 17TippWähle aufschlussreiche Zeilen für die Ablaufverfolgung
- 18HerausforderungKombiniere eine veränderliche Schleifengrenze mit einer Auswahl
- 19ZusammenfassungPrüfe die Bedeutung jedes Ergebnisses
Bedingungen und Schleifen in Java: Übungsaufgaben
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++;
}
Antwort zeigenAntwort ausblenden
Frage 2 von 10
Was wird ausgegeben?
int level = 9;
do {
level -= 2;
} while (level > 8);
System.out.println(level);
Antwort zeigenAntwort ausblenden
Frage 3 von 10
Wie oft wird der Rumpf ausgeführt?
for (int k = 2; k <= 17; k += 4) {
System.out.println(k);
}
Antwort zeigenAntwort ausblenden
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 + " ");
}
Antwort zeigenAntwort ausblenden
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++;
}
Antwort zeigenAntwort ausblenden
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;
}
}
Antwort zeigenAntwort ausblenden
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Frage 8 von 10
int index. Wo kann Code diese Variable lesen?Antwort zeigenAntwort ausblenden
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);
Antwort zeigenAntwort ausblenden
Frage 10 von 10
Warum endet diese Schleife nie?
int n = 1;
while (n != 12) {
n += 2;
}
Antwort zeigenAntwort ausblenden
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
-13 % 2 != 0?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
String command, der nicht null ist, enthält aus einer Eingabe gelesenen Text. Welcher Ausdruck prüft, ob sein Inhalt genau „pause“ ist?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
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);
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");
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");
}
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;
};
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
int sum = 15; und int count = 0;, wenn count == 0 || sum / count > 4 ausgewertet wird?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);
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
member && !blocked || guest && codeValid wahr ist. Welche Bedingung weist genau die Eintritte zurück, die es erlauben würde?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
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
(double) (sum / count) bei int sum = 17; und int count = 4;?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
max mit 0 eine falsche Antwort ergeben?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);
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("*");
}
}
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;
}
}
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
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);
}
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);
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
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);
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++;
}
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--;
}
}
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
do { ... } while (value < 10 || value > 14); die Eingaben 8, 14 und dann 11 ein. Wie viele Eingaben liest sie?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);
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
Math.abs((0.1 + 0.2) - 0.3) < 1e-9 wahr sein, während (0.1 + 0.2) == 0.3 falsch ist?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
(double) sum / count aus. Was ist das Ergebnis und welche Korrektur ist nötig?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");
}
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
!(false || true)?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");
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;
};
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++;
}
}
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
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?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++;
}
}
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
(double) sum / count für die Eingaben -4, 6, -2, 10, -9 aus und welche Korrektur ist nötig?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);
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
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?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe
Schlüsselbegriffe
A
Ablauftabelle
Akkumulator
Aktualisierung
i += 4 erhöht den Zähler von 2 auf 6, nachdem der erste for-Schleifenrumpf beendet ist.Ä
Äußere Schleife
B
Bedingter Operator
?: wählt anhand einer booleschen Bedingung einen von zwei Ausdruckswerten und ermöglicht so eine kurze Auswahl zwischen zwei Werten.label je nach Ergebnis einer Restprüfung auf „even“ oder „odd“.Block
Boolescher Wert
true oder false; Vergleiche liefern einen solchen Wert, und Java-Bedingungen erfordern einen Ausdruck dieses Typs.isFull gespeicherte boolesche Wert wird wahr, wenn ein Behälter seine Kapazität erreicht.break-Anweisung
break-Anweisung mit Sprungmarke
C
case-Marke
continue-Anweisung
continue-Anweisung mit Sprungmarke
D
Dangling-Else-Problem
De Morgansche Gesetze
Divisionsrest
% nach einer Ganzzahldivision liefert; ein Rest von null zeigt an, dass ein Wert durch den Divisor teilbar ist.-13 % 2 ist -1, daher erkennt eine Prüfung auf einen Rest ungleich null diese ungerade ganze Zahl.do-while-Schleife
E
Eingabevalidierung
else-if-Kette
Endemarkierung
Endlosschleife
i <= 5 bei 1 bleibt, erzeugt eine Endlosschleife, sofern kein anderer Pfad die Schleife verlässt.Exklusives Oder
^ aus.F
Fall-through
Flag
for-Schleife
Fortsetzungsbedingung
Fußgesteuerte Schleife
G
Ganzzahldivision
17 / 4 den Wert 4, weshalb bei einer Mittelwertberechnung zuerst ein Operand umgewandelt wird.Gegenbeispiel
Gleichheitsoperator
== vergleicht primitive Werte; bei Objektreferenzen wie Strings prüft er dagegen, ob die Objekte identisch sind.3 == 3.0, weil eine numerische Typumwandlung ihre Werte gleich macht.Grenzwerttest
Gültigkeitsbereich
I
Initialisierung
Innere Schleife
K
Kurzschlussauswertung
&& oder ||, wenn der linke Operand bereits das gesamte Ergebnis bestimmt.count != 0 && sum / count > 5 sicher, wenn beide Variablen int-Werte sind.L
Laufende Summe
Logisches Oder
||.Logisches Und
&&.M
Maximum
Minimum
N
Negation
! um und macht aus wahr falsch und aus falsch wahr, ohne die zugrunde liegenden Daten zu ändern.!command.equals("stop") ist wahr, solange sich der eingegebene Text von „stop“ unterscheidet.O
Off-by-one-Fehler
< 12 verwendet, aber 12 einschließen muss.Operatorrangfolge
a || b && c dasselbe wie a || (b && c), obwohl Oder zuerst erscheint.P
Primzahl
R
Randfall
S
Schleifendurchlauf
Schleifenvariable
Schwellenwert
score >= 30 geschriebener Schwellenwert schließt 30 ein, während score > 30 genau diese Punktzahl ausschließt.Selektor
command leitet den Text „wait“ an einen Fall mit genau dieser String-Marke weiter.Suche
switch-Ausdruck
T
Toleranz
1e-9 akzeptiert in dieser Berechnung die winzige Differenz zwischen 0.1 + 0.2 und 0.3.Ü
Überlauf
V
Vergleichsoperator
<= schließt eine Punktzahl, die der oberen Grenze entspricht, in einen zulässigen Bereich ein.Verschachtelte Schleife
Vollständigkeit
Vorzeitiger Schleifenabbruch
W
while-Schleife
Y
yield-Anweisung
Z
Zähler
Zaunpfahlproblem
Ziffernextraktion
% 10 die letzte Dezimalziffer einer nicht negativen ganzen Zahl, sodass sie verwendet werden kann, bevor die Division sie entfernt.Zuweisungsoperator
= speichert einen Wert in einer Variablen; der entstehende Ausdruck hat diesen zugewiesenen Wert und kein Vergleichsergebnis.if (done = true) ändert das Flag, bevor der Zweig ausgeführt wird.Zweig
- 1Java-Programme kompilieren und starten
- 2Bedingungen und Schleifen in Java
- 3Java-Methoden und Problemzerlegung
- 4Listen, Arrays und Strings in Java
- 5Java-Klassen und Objekte
- 6Objektreferenzen in Java
- 7HashMaps und Collections in Java
- 8Vererbung in Java
- 9Ausnahmen und Dateien in Java
- 10Modultests in Java
- 11Lambda-Ausdrücke und Streams in Java
Über diese Einheit
Erstelle deine eigenen Lernmaterialien
Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.