Brückenkurs Programmieren
Tag 2: Verzweigungen und While-Schleifen
Christopher Schölzel
Technische Hochschule Mittelhessen
3. September 2019
Inhalt
Verzweigungen If-Abfrage
Logische Ausdrücke Logische Operatoren
Schleifen: While While
Nachmittag: Java-API und Float-Besonderheiten
Inhalt
Verzweigungen If-Abfrage
Logische Ausdrücke Logische Operatoren
Schleifen: While While
Nachmittag: Java-API und Float-Besonderheiten
Verzweigungen
Immer nur das Gleiche tun ist langweilig.
I Bisher: Aneinanderreihung von einzelnen Befehlen
I Wie im Computerspiel: Unterschiedliche Pfade machen Code interessant
Idee
Wir bauen uns eine kleine „KI“, die für uns Ja-/Nein-Fragen nach dem Zufallsprinzip entscheidet.
Verzweigungen: If-Abfrage
Syntax
if (Bedingung) { Anweisungsblock1 } else {
Anweisungsblock2 }
Definition
Eine If-Abfrage entspricht einer Weiche.
I Bedingung ist wahr (true): Führe If-Teil(Block 1) aus.
Verzweigungen: Beispiele für If-Abfragen
Beispiel 1 if (x == 0) {
System.out.println("Du erzeugst ein schwarzes Loch!");
} else {
System.out.println("4 geteilt durch "+x+" ist "+(4/x));
}
Beispiel 2 if (x < 0) {
x = -x;
}//Else-Teil darf auch wegfallen
Aufgabe: Mini-KI
Erzeuge mit der Funktion Math.random() eine Pseudozufallszahl zwischen 0 und 1.
Gebe dann mit der Funktion System.out.println(String) die entsprechende Antwort auf der Konsole aus:
I falls die Zufallszahl größer als 0,5 ist: Ja, aber sicher!
I ansonsten: Nein, auf keinen Fall!
Erinnerung: If-Syntax if (Bedingung) {
Anweisungsblock1 } else {
Anweisungsblock2
Verzweigungen: Bedingungen / Logische Ausdrücke
Was kann man eigentlich alles als Bedingung in einem If verwenden?
Definition
Bedingungen sindlogische Ausdrücke, das heißt Ausdrücke, die einen Wahrheitswert ergeben (true oder false).
Beispiele: true 3 < 4
4 <= 4 1 == 1 2+1 != 4 true
Beispiele: false 3 > 4
5 <= 4 1 == 2 2+1 != 4-1 false
Verzweigungen: Logische Operatoren
Definition
Logische Operatoren errechnen einen Wahrheitswert aus anderen Werten (und bilden damit logische Ausdrücke).
== < <=
!= > >=
Verzweigungen: Verknüpfungen von logischen Operatoren
Logischer Ausdruck
Der Wert von x liegt zwischen 0 und 10.
Verzweigungen: Verknüpfungen von logischen Operatoren
Logischer Ausdruck
Der Wert von x ist größer als 0 und kleiner als 10.
Verzweigungen: Verknüpfungen von logischen Operatoren
Logischer Ausdruck
Der Wert von x ist größer als 0 und kleiner als 10.
Um kompliziertere Bedingungen auszudrücken gibt es auch Operatoren, die logische Ausdrückenegieren oder miteinanderverknüpfenkönnen:
Verzweigungen: Verknüpfungen von logischen Operatoren
Logischer Ausdruck
Der Wert von x ist größer als 0 und kleiner als 10. x > 0 && x < 10 Um kompliziertere Bedingungen auszudrücken gibt es auch Operatoren, die logische Ausdrückenegieren oder miteinanderverknüpfenkönnen:
a && b a und b
a || b a oder b
!a nicht a
Logikhilfe: Wahrheitstabellen
Die Funktionsweise der Verknüpfungsoperatoren lässt sich mit einer Wahrheitstabelleverdeutlichen, die das Resultat des Operators für alle möglichen Eingabewerte angibt.
A B A && B A || B false false false false
false true false true
true false false true
true true true true
Übung: Wahrheitstabelle
Aufgabe: Vervollständige die Wahrheitstabelle für den folgenden Ausdruck.
boolean target = (x > 0 && x < 10) || (x > 20 && x < 30);
x > 0 x < 10 x > 20 x < 30 target
false true false true
true true false true
true false false true
true false true true
true false true false
Übung: Mensaplan
Aufgabe: Setze die folgenden „Mensaregeln“ in Java-Code um.
1. Wenn es Kaiserschmarren gibt, nimm immer diesen.
2. Wenn es Fisch unter drei Euro gibt, nimm diesen.
3. Ansonsten nimm die vegetarische Option.
Wenn Regel 1 und 2 beide zutreffen, dann hat Regel 1 Vorrang.
Codevorgabe:
boolean kaiserschmarrenAvailable = false; // setze hier zum Testen boolean fishAvailable = true; // unterschiedliche
double price = 3.5; // Werte ein
// hier kommt dein Code
Inhalt
Verzweigungen If-Abfrage
Logische Ausdrücke Logische Operatoren
Schleifen: While While
Nachmittag: Java-API und Float-Besonderheiten
Warum unbegrenzte Schleifen?
Aufgabe
Erzeuge so lange zwei zufällige ganze Zahlen zwischen 1 und 6, bis beide gleich sind.
Zufallszahl zwischen 1 und 6: (int) (Math.random()*6+1) int a = (int) (Math.random()*6+1);
int b = (int) (Math.random()*6+1);
if (a == b) System.out.println("Pasch!"); else {
... // die gleichen Anweisungen wie oben }
Frage: Wie viele Zeilen müssen wir schreiben?
Antwort: Unendlichviele! Es könnte immer ein Würfelwurf mehr nötig sein.
Warum unbegrenzte Schleifen?
Aufgabe
Erzeuge so lange zwei zufällige ganze Zahlen zwischen 1 und 6, bis beide gleich sind.
Zufallszahl zwischen 1 und 6: (int) (Math.random()*6+1) int a = (int) (Math.random()*6+1);
int b = (int) (Math.random()*6+1);
if (a == b) System.out.println("Pasch!"); else {
... // die gleichen Anweisungen wie oben }
Frage: Wie viele Zeilen müssen wir schreiben?
Antwort: Unendlichviele! Es könnte immer ein Würfelwurf mehr nötig sein.
Warum unbegrenzte Schleifen?
Aufgabe
Erzeuge so lange zwei zufällige ganze Zahlen zwischen 1 und 6, bis beide gleich sind.
Zufallszahl zwischen 1 und 6: (int) (Math.random()*6+1)
int a = (int) (Math.random()*6+1); int b = (int) (Math.random()*6+1);
if (a == b) System.out.println("Pasch!"); else {
... // die gleichen Anweisungen wie oben }
Frage: Wie viele Zeilen müssen wir schreiben?
Antwort: Unendlichviele! Es könnte immer ein Würfelwurf mehr nötig sein.
Warum unbegrenzte Schleifen?
Aufgabe
Erzeuge so lange zwei zufällige ganze Zahlen zwischen 1 und 6, bis beide gleich sind.
Zufallszahl zwischen 1 und 6: (int) (Math.random()*6+1) int a = (int) (Math.random()*6+1);
int b = (int) (Math.random()*6+1);
if (a == b) System.out.println("Pasch!");
else {
... // die gleichen Anweisungen wie oben }
Frage: Wie viele Zeilen müssen wir schreiben?
Antwort: Unendlichviele! Es könnte immer ein Würfelwurf mehr nötig sein.
Warum unbegrenzte Schleifen?
Aufgabe
Erzeuge so lange zwei zufällige ganze Zahlen zwischen 1 und 6, bis beide gleich sind.
Zufallszahl zwischen 1 und 6: (int) (Math.random()*6+1) int a = (int) (Math.random()*6+1);
int b = (int) (Math.random()*6+1);
if (a == b) System.out.println("Pasch!");
else {
... // die gleichen Anweisungen wie oben }
Frage: Wie viele Zeilen müssen wir schreiben?
Antwort: Unendlichviele! Es könnte immer ein Würfelwurf mehr nötig sein.
Warum unbegrenzte Schleifen?
Aufgabe
Erzeuge so lange zwei zufällige ganze Zahlen zwischen 1 und 6, bis beide gleich sind.
Zufallszahl zwischen 1 und 6: (int) (Math.random()*6+1) int a = (int) (Math.random()*6+1);
int b = (int) (Math.random()*6+1);
if (a == b) System.out.println("Pasch!");
else {
... // die gleichen Anweisungen wie oben }
Frage: Wie viele Zeilen müssen wir schreiben?
Gründe für Schleifen
Zusammengefasst: Wir brauchen ein Sprachkonstrukt, das...
I eine unbekannteAnzahl von Wiederholungen ausführt.
I bis eineAbbruchbedingungerfüllt ist I z.B. Würfeln bis zum Pasch
Unbekannte Wiederholungsanzahl: While
Definition
Eine Schleife (engl.loop) erlaubt die wiederholte Ausführung eines Anweisungsblocks solange eine Fortsetzungsbedingung erfüllt ist.
Syntax
while (Bedingung) { Anweisungsblock }
Beispiel
String s = "";
while(s.length() < 10) { s = s + "#";
System.out.println(s);
}
Aufgabe: Logarithmus zu Fuß
Teile einen Integer x so lange durch zwei, bis Du bei null angekommen bist.
Tipps:
I Bedingung anders herum
formuliert: So lange x nicht null ist...
Erinnerung: While-Syntax while (Bedingung) {
Anweisungsblock }
Bonus:
I Gib den Wert bei jedem Schleifendurchlauf aus.
I Zähle, wie viele Schleifendurchläufe nötig sind und gib diese Zahl aus. I Multipliziere einen Double y so lange mit 1.02 bis er doppelt so
groß wie vorher ist.
Aufgabe: Logarithmus zu Fuß
Teile einen Integer x so lange durch zwei, bis Du bei null angekommen bist.
Tipps:
I Bedingung anders herum
formuliert: So lange x nicht null ist...
Erinnerung: While-Syntax while (Bedingung) {
Anweisungsblock }
Bonus:
I Gib den Wert bei jedem Schleifendurchlauf aus.
I Zähle, wie viele Schleifendurchläufe nötig sind und gib diese Zahl aus.
I Multipliziere einen Double y so lange mit 1.02 bis er doppelt so
While: Anschauliches Beispiel ;)
Beispiel aus dem (studentischen) Leben: Solange du dich noch nicht am Boden festhalten musst, trinke ein weiteres Bier.
Java
double promille = 0;
while (promille < 3) {
System.out.println("Unn zisch, unn klack, unn weg!");
promille = promille + 0.1;
}
While: Endlosschleife
Frage: Was passiert, wenn die Fortsetzungsbedingung immer erfüllt wird?
Java
double promille = 0;
while (promille < 3) {
System.out.println("Unn zisch, unn klack, unn weg!");
promille = promille - 0.1;
}
Antwort: Der Computer hört nie auf zu rechnen!
... und der Student oder die Studentin hört nie auf zu trinken.
While: Endlosschleife
Frage: Was passiert, wenn die Fortsetzungsbedingung immer erfüllt wird?
Java
double promille = 0;
while (promille < 3) {
System.out.println("Unn zisch, unn klack, unn weg!");
promille = promille - 0.1;
}
Antwort: Der Computer hört nie auf zu rechnen!
... und der Student oder die Studentin hört nie auf zu trinken.
Zusammenfassung
Variablen
double a = 3.5;
int b = 10;
boolean c = true;
String blabla = "Blabla";
Logische Operatoren
> >= == !=
&& || !
If-Abfrage
if (Bedingung) { Anweisungsblock1 } else {
Anweisungsblock2 }
Arithmetische Operatoren
+ - * / %
Inhalt
Verzweigungen If-Abfrage
Logische Ausdrücke Logische Operatoren
Schleifen: While While
Nachmittag: Java-API und Float-Besonderheiten
Mögliche Themen zur Besprechung am Nachmittag
API lesen
I Was ist eine API?
I Wo finde ich die Java-API?
I Welche Funktionen bieten die Klassen String, Integer, ... ? I Welche Funktionen bietet die Klasse Math?
I Wie liest man die API?
Float-Besonderheiten I ∞,−∞und NaN
I Warum sollte man Floats nicht mit == vergleichen?
I Warum gilt Float.NaN != FLoat.NaN?