Sie sind auf Seite 1von 58

Lektion 

do‐while‐Schleife
Modellierung
Quadratwurzelberechnung
Pi‐Berechnung

© Prof. Dr. Steffen Heinzl
do‐while‐Schleife

© Prof. Dr. Steffen Heinzl
Wir wollen ein Ratespiel entwickeln!

Der Computer denkt sich eine Zahl 
zwischen 1 und 100 aus. 

Der Spieler rät, bis er die Zahl 
erraten hat, und erhält nach jedem 
Versuch einen Hinweis, ob die geratene 
Zahl größer oder kleiner ist.

© Prof. Dr. Steffen Heinzl
Der Computer denkt sich eine Zahl 
zwischen 1 und 100 aus.

Math.random
liefert eine Fließkommazahl 
x mit 0 <= x < 1

int zufallszahl = (int) (Math.random() * 100 + 1);

© Prof. Dr. Steffen Heinzl
Der Spieler rät bis er die Zahl 
erraten hat…

Schleife mit Eingabe

int zufallszahl = (int) (Math.random() * 100 + 1);
Scanner scanner = new Scanner(System.in);

WIEDERHOLE BIS ERRATEN
int eingabe = scanner.nextInt();

© Prof. Dr. Steffen Heinzl
… und erhält nach jedem Versuch einen 
Hinweis, ob die geratene Zahl größer 
oder kleiner ist.
if‐Abfrage Ausgabe

int zufallszahl = (int) (Math.random() * 100 + 1);
Scanner scanner = new Scanner(System.in);

WIEDERHOLE BIS ERRATEN Jetzt benötigen wir 
int eingabe = scanner.nextInt(); noch die Schleife…
if (zufallszahl == eingabe) 
System.out.println("Volltreffer!");
else if (zufallszahl > eingabe)
System.out.println("Die gesuchte Zahl ist größer!");
else if (zufallszahl < eingabe)
System.out.println("Die gesuchte Zahl ist kleiner!");
© Prof. Dr. Steffen Heinzl
do‐while‐Schleife
 Eine do‐while‐Schleife wiederholt den Schleifenrumpf, solange die 
Laufbedingung erfüllt ist.
 Die Laufbedingung wird am Ende der Schleife überprüft (fußgesteuert).
 Der Schleifenrumpf wird daher mindestens einmal ausgeführt.
 Die do‐while‐Schleife hat folgende Form:

© Prof. Dr. Steffen Heinzl
do‐while‐Schleife
 Eine do‐while‐Schleife wiederholt den Schleifenrumpf, solange die 
Laufbedingung erfüllt ist.
 Die Laufbedingung wird am Ende der Schleife überprüft (fußgesteuert).
 Der Schleifenrumpf wird daher mindestens einmal ausgeführt.
 Die do‐while‐Schleife hat folgende Form:

do
{
<Anweisungen> Schleifenrumpf
}
while(<bool‘scher Ausdruck>);

Laufbedingung

© Prof. Dr. Steffen Heinzl
do‐while‐Schleife ‐ Beispiel
int zufallszahl = (int) (Math.random() * 100 + 1);
Scanner scanner = new Scanner(System.in);

do
{
int eingabe = scanner.nextInt();
if (zufallszahl == eingabe) 
System.out.println("Volltreffer!");
else if (zufallszahl > eingabe)
System.out.println("Die gesuchte Zahl ist größer!");
else if (zufallszahl < eingabe)
System.out.println("Die gesuchte Zahl ist kleiner!");
}
while (NOCH NICHT ERRATEN);
© Prof. Dr. Steffen Heinzl
do‐while‐Schleife ‐ Beispiel
int zufallszahl = (int) (Math.random() * 100 + 1);
Scanner scanner = new Scanner(System.in);

do
{
int eingabe = scanner.nextInt();
if (zufallszahl == eingabe) 
System.out.println("Volltreffer!");
else if (zufallszahl > eingabe)
System.out.println("Die gesuchte Zahl ist größer!");
else if (zufallszahl < eingabe)
System.out.println("Die gesuchte Zahl ist kleiner!");
}
while (zufallszahl != eingabe);
© Prof. Dr. Steffen Heinzl
do‐while‐Schleife ‐ Beispiel
int zufallszahl = (int) (Math.random() * 100 + 1);
Scanner scanner = new Scanner(System.in);

do
{
int eingabe = scanner.nextInt(); eingabe ist sichtbar
if (zufallszahl == eingabe) 
System.out.println("Volltreffer!");
else if (zufallszahl > eingabe)
System.out.println("Die gesuchte Zahl ist größer!");
else if (zufallszahl < eingabe)
System.out.println("Die gesuchte Zahl ist kleiner!");
}
while (zufallszahl != eingabe); eingabe ist nicht sichtbar

© Prof. Dr. Steffen Heinzl
do‐while‐Schleife ‐ Beispiel
int zufallszahl = (int) (Math.random() * 100 + 1);
Scanner scanner = new Scanner(System.in);
int eingabe;

do
{
eingabe = scanner.nextInt();
if (zufallszahl == eingabe) 
System.out.println("Volltreffer!");
else if (zufallszahl > eingabe)
System.out.println("Die gesuchte Zahl ist größer!");
else if (zufallszahl < eingabe)
System.out.println("Die gesuchte Zahl ist kleiner!");
}
while (zufallszahl != eingabe);
© Prof. Dr. Steffen Heinzl
do‐while‐Schleife ‐ Beispiel
int zufallszahl = (int) (Math.random() * 100 + 1);
Scanner scanner = new Scanner(System.in);
int eingabe; eingabe ist sichtbar

do
{
eingabe = scanner.nextInt();
if (zufallszahl == eingabe) 
System.out.println("Volltreffer!");
else if (zufallszahl > eingabe)
System.out.println("Die gesuchte Zahl ist größer!");
else if (zufallszahl < eingabe)
System.out.println("Die gesuchte Zahl ist kleiner!");
}
while (zufallszahl != eingabe);
© Prof. Dr. Steffen Heinzl
break
int zufallszahl = (int) (Math.random() * 100 + 1);
Scanner scanner = new Scanner(System.in);
int eingabe;

do
{
eingabe = scanner.nextInt();
if (zufallszahl == eingabe) 
{
System.out.println("Volltreffer!"); mit break lässt sich eine Schleife vorzeitig
break; verlassen
}
else if (zufallszahl > eingabe)
System.out.println("Die gesuchte Zahl ist größer!");
else if (zufallszahl < eingabe)
Die  System.out.println("Die gesuchte Zahl ist kleiner!");
Ausführung }
wird dahinter while (true); Die Laufbedingung wird dadurch einfacher.
fortgesetzt. Der Programmfluss kann ‐ vor allem© Prof. Dr. Steffen Heinzl
bei häufiger
Verwendung ‐ unübersichtlicher werden.
Wir erweitern unser Spiel dahingehend, 
dass der Spieler nur 10 Rateversuche hat.

© Prof. Dr. Steffen Heinzl
do‐while‐Schleife ‐ Beispiel
int anzahlVersuche = 0;
int zufallszahl = (int) (Math.random() * 100 + 1);
Scanner scanner = new Scanner(System.in);
int eingabe;
do
{
eingabe = scanner.nextInt();
anzahlVersuche++;
if (zufallszahl == eingabe) 
System.out.println("Volltreffer!");
else if (zufallszahl > eingabe)
System.out.println("Die gesuchte Zahl ist größer!");
else if (zufallszahl < eingabe)
System.out.println("Die gesuchte Zahl ist kleiner!");
}
while (zufallszahl != eingabe && anzahlVersuche < 10);
if (zufallszahl == eingabe) System.out.println("Sie haben gewonnen.");
else System.out.println("Sie haben verloren.");
© Prof. Dr. Steffen Heinzl
do‐while‐Schleife ‐ Beispiel
int anzahlVersuche = 0;
int zufallszahl = (int) (Math.random() * 100 + 1);
Scanner scanner = new Scanner(System.in);
int eingabe;
do Was können wir noch 
{
eingabe = scanner.nextInt();
vereinfachen?
anzahlVersuche++;
if (zufallszahl == eingabe) 
System.out.println("Volltreffer!");
Hinweis: DRY
else if (zufallszahl > eingabe)
System.out.println("Die gesuchte Zahl ist größer!");
else if (zufallszahl < eingabe)
System.out.println("Die gesuchte Zahl ist kleiner!");
}
while (zufallszahl != eingabe && anzahlVersuche < 10);
if (zufallszahl == eingabe) System.out.println("Sie haben gewonnen.");
else System.out.println("Sie haben verloren.");
© Prof. Dr. Steffen Heinzl
do‐while‐Schleife ‐ Beispiel
int anzahlVersuche = 0;
int zufallszahl = (int) (Math.random() * 100 + 1);
Scanner scanner = new Scanner(System.in);
int eingabe;
do
{
Doppelter Code
eingabe = scanner.nextInt();
anzahlVersuche++;
if (zufallszahl == eingabe) 
System.out.println("Volltreffer!");
else if (zufallszahl > eingabe)
System.out.println("Die gesuchte Zahl ist größer!");
else if (zufallszahl < eingabe)
System.out.println("Die gesuchte Zahl ist kleiner!");
}
while (zufallszahl != eingabe && anzahlVersuche < 10);
if (zufallszahl == eingabe) System.out.println("Sie haben gewonnen.");
else System.out.println("Sie haben verloren.");
© Prof. Dr. Steffen Heinzl
boolean getroffen = false;
int anzahlVersuche = 0;
int zufallszahl = (int) (Math.random() * 100 + 1);
Scanner scanner = new Scanner(System.in);
int eingabe;
do
{
eingabe = scanner.nextInt(); Wir arbeiten mit einer 
anzahlVersuche++;
if (zufallszahl == eingabe) sogenannten Flag zur 
{ Markierung.
getroffen = true;
System.out.println("Volltreffer!");
}
else if (zufallszahl > eingabe)
System.out.println("Die gesuchte Zahl ist größer!");
else if (zufallszahl < eingabe)
System.out.println("Die gesuchte Zahl ist kleiner!");
}
while (!getroffen && anzahlVersuche < 10);
if (getroffen) System.out.println("Sie haben gewonnen.");
else System.out.println("Sie haben verloren."); © Prof. Dr. Steffen Heinzl
Wir wollen programmatisch herausfinden, 
gegen welchen Wert die folgende Reihe 
voraussichtlich konvergiert.

1
3

Dazu schreiben wir die ersten Glieder auf:

1 1 1 1 1 1

3 3 3 3 3 3

© Prof. Dr. Steffen Heinzl
1 1 1 1 1 1

3 3 3 3 3 3

Wir müssen die Glieder nacheinander 
aufsummieren.

 wir brauchen eine Schleife

Der Exponent im Nenner 
bzw. der Nenner
bzw. der Summand 
ändert sich in jedem Durchlauf.
© Prof. Dr. Steffen Heinzl
1 1 1 1 1 1

3 3 3 3 3 3

Berechnung des ersten Summanden:
summand = 1.0/Math.pow(3, 0);
Berechnung des zweiten Summanden:
summand = 1.0/Math.pow(3, 1);
Berechnung des dritten Summanden:
summand = 1.0/Math.pow(3, 2);

Berechnung des (k+1)‐ten Summanden:
summand = 1.0/Math.pow(3, k);
© Prof. Dr. Steffen Heinzl
Summe
a + b

Summand Summand
double summe = 0;
double summand;

k muss in jedem 
Durchlauf erhöht werden
WIEDERHOLE
summand = 1.0/Math.pow(3, k);
summe = summe + summand;
do‐while‐Schleife, weil mindestens 
eine Berechnung stattfindet

© Prof. Dr. Steffen Heinzl
Welche Laufbedingung kommt in Frage?

double summe = 0;  unendlich? 
double summand;  bis k oder 3k an die Zahlengrenze stößt?
 bis die Wertänderung unter ein 
int k = 0; bestimmtes EPSILON fällt?
do
{
summand = 1.0/Math.pow(3, k);
summe = summe + summand;
k++;
}
while(                    );
System.out.println(summe);

© Prof. Dr. Steffen Heinzl
double summe = 0;
double summand;
int k = 0;
do
{
summand = 1.0/Math.pow(3, k);
summe = summe + summand;
k++;
}
wenn weniger als 0.0000000001 zur 
while(summand > 1E‐10); Gesamtsumme dazukommt: Abbruch
System.out.println(summe);

© Prof. Dr. Steffen Heinzl
Äquivalenz do‐while und while
 Sei b eine bool‘sche Variable, die einen bool‘schen Ausdruck gespeichert habe.

while(b) { do {
<Anweisungen> <Anweisungen>
} }
while(b);

if(b) {
do { <Anweisungen>
<Anweisungen> while(b)
} {
while(b); <Anweisungen>
} }
© Prof. Dr. Steffen Heinzl
continue
 Mit der Anweisung continue ist es möglich, den aktuellen Schleifendurchlauf 
abzubrechen und mit dem nächsten zu beginnen.
/*Addiere alle Zahlen von 1 bis 10, lasse aber dabei alle durch 5 
teilbaren Zahlen aus*/
int j = 0;
int sum = 0;
while(j < 10)
{
j++;
if (j % 5 == 0) continue;
sum = sum + j;
}
System.out.println(sum);

© Prof. Dr. Steffen Heinzl
Endlosschleifen
 Folgende Schleifen laufen endlos, es sei denn sie werden durch break oder durch 
eine Fehlermeldung (Exception, Error) verlassen:

for (;;)  while(true) do


{ { {
<Anweisungen> <Anweisungen> <Anweisungen>
} } }
while(true);

© Prof. Dr. Steffen Heinzl
Modellierung von Kontrollstrukturen

© Prof. Dr. Steffen Heinzl
Modellierung von Kontrollstrukturen
 Mit Kontrollstrukturen (Schleifen, Verzweigungen) kann der Programmfluss 
gesteuert werden.
 Zur Modellierung des Programmflusses gibt es verschiedene Möglichkeiten:
 Pseudocode

WIEDERHOLE bis eingabe == ‐1
summe = summe + eingabe;

© Prof. Dr. Steffen Heinzl
Modellierung von Kontrollstrukturen
 Mit Kontrollstrukturen (Schleifen, Verzweigungen) kann der Programmfluss 
gesteuert werden.
 Zur Modellierung des Programmflusses gibt es verschiedene Möglichkeiten:
 Struktogramme/Nassi‐Shneiderman‐Diagramme

source: http://upload.wikimedia.org/wikipedia/commons/3/33/NassiShneiderman.png

© Prof. Dr. Steffen Heinzl
Modellierung von Kontrollstrukturen
 Mit Kontrollstrukturen (Schleifen, Verzweigungen) kann der Programmfluss 
gesteuert werden.
 Zur Modellierung des Programmflusses gibt es verschiedene Möglichkeiten:
 Flussdiagramme/Programmablaufpläne
 Aktivitätsdiagramme
 …

© Prof. Dr. Steffen Heinzl
Modellierung des Ratespiels 
mit einem Aktivitätsdiagramm

Der Computer denkt sich eine 
Zahl zwischen 1 und 100 aus. 
Der Spieler rät, bis er die 
Zahl erraten hat, und erhält 
nach jedem Versuch einen 
Hinweis, ob die geratene Zahl 
größer oder kleiner ist.
© Prof. Dr. Steffen Heinzl
Quadratwurzelbestimmung

© Prof. Dr. Steffen Heinzl
Quadratwurzel bestimmen
𝑥 𝑦 , wobei 𝑥, 𝑦 ∈ℝ \ 0
⇔ 𝑥 𝑦 ·𝑦 , da 𝑥, 𝑦 0
𝑥
⇔ 𝑦
𝑦
Setzt man nun einen Näherungswert 𝑦 für 𝑦 mit 𝑦 𝑦 ein, gilt:
𝑦 ·𝑦 𝑦
Aus 𝑦 𝑦 ⇒ 𝑦 𝑦
𝑦 𝑦

1
D. h. 𝑦 𝑦 ⇒ 𝑦

𝑦 𝑦 𝑥
𝑦
𝑦 bezeichnet den i‐ten
Näherungswert

© Prof. Dr. Steffen Heinzl
Quadratwurzel bestimmen
𝑥 𝑦 , wobei 𝑥, 𝑦 ∈ℝ \ 0
⇔ 𝑥 𝑦 ·𝑦 , da 𝑥, 𝑦 0
𝑥
⇔ 𝑦
𝑦
Setzt man nun einen Näherungswert 𝑦 für 𝑦 mit 𝑦 𝑦 ein, gilt:
𝑦 ·𝑦 𝑦
Aus 𝑦 𝑦 ⇒ 𝑦 𝑦
𝑦 𝑦 𝑥
𝑦
𝑦
1 2
D. h. 𝑦 𝑦 ⇒ 𝑦

⇒𝑦 liegt näher an 𝑦
𝑦 𝑦 𝑦 𝑥
𝑦
𝑦 bezeichnet den i‐ten
Näherungswert

© Prof. Dr. Steffen Heinzl
Quadratwurzel bestimmen
𝑥 𝑦 , wobei 𝑥, 𝑦 ∈ℝ \ 0
⇔ 𝑥 𝑦 ·𝑦 , da 𝑥, 𝑦 0
𝑥
⇔ 𝑦
𝑦
Setzt man nun einen Näherungswert 𝑦 für 𝑦 mit 𝑦 𝑦 ein, gilt:
𝑦 ·𝑦 𝑦
Aus 𝑦 𝑦 ⇒ 𝑦 𝑦
𝑦 𝑦 𝑥
𝑦
𝑦
1 2
D. h. 𝑦 𝑦 ⇒ 𝑦

⇒𝑦 liegt näher an 𝑦
𝑦 𝑦 𝑦 𝑥
𝑦
𝑦 bezeichnet den i‐ten
Analog gilt: 𝑦 𝑦 ⇒ 𝑦 Näherungswert

© Prof. Dr. Steffen Heinzl
Quadratwurzel bestimmen
 Wann breche ich die Berechnung ab?
 Bei einer bestimmten Genauigkeit, z. B.

𝑥
𝑦 10
𝑦

© Prof. Dr. Steffen Heinzl
Zum Nachlesen: Quadratwurzel (I)

© Prof. Dr. Steffen Heinzl
Zum Nachlesen: Quadratwurzel (II)

© Prof. Dr. Steffen Heinzl
Quadratwurzel: Beispiel
𝑥
𝑦
𝑦
𝑦
2
Näherungweise Berechnung von 2
x  2, wähle y0  1
x
 y0 2  1
y 3
y1  0 1   1,5
2 2 2
x 2
 y1  1,5 4  3 17
y 1,5 17
y2  1  3 2 6   1, 416
2 2 2 2 12

© Prof. Dr. Steffen Heinzl
Quadratwurzel: Beispiel
𝑥
𝑦
𝑦
𝑦
2
Näherungweise Berechnung von 2
x  2, wähle y0  1
x
 y0 2  1
y 3
y1  0 1   1,5
2 2 2
x 2
 y1  1,5 4  3 17
y 1,5 17
y2  1  3 2 6   1, 416
2 2 2 2 12

© Prof. Dr. Steffen Heinzl
Quadratwurzel: Beispiel
𝑥
𝑦
𝑦
𝑦
2
Näherungweise Berechnung von 2
x  2, wähle y0  1
x
 y0 2  1
y 3
y1  0 1   1,5
2 2 2
x 2
 y1  1,5 4  3 17
y 1,5 17
y2  1  3 2 6   1, 416
2 2 2 2 12

© Prof. Dr. Steffen Heinzl
Quadratwurzel: Beispiel
𝑥
𝑦
𝑦
𝑦
2
Näherungweise Berechnung von 2
x  2, wähle y0  1
x
 y0 2  1
y 3
y1  0 1   1,5
2 2 2
x 2
 y1  1,5 4  3 17
y 1,5 17
y2  1  3 2 6   1, 416
2 2 2 2 12

© Prof. Dr. Steffen Heinzl
Quadratwurzel: Beispiel
𝑥
𝑦
𝑦
𝑦
2
Näherungweise Berechnung von 2
x  2, wähle y0  1
x
 y0 2  1
y 3
y1  0 1   1,5
2 2 2
x 2
 y1  1,5 4  3 17
y 1,5 17
y2  1  3 2 6   1, 416
2 2 2 2 12

© Prof. Dr. Steffen Heinzl
Quadratwurzel: Beispiel
𝑥
𝑦
𝑦
𝑦
2
Näherungweise Berechnung von 2
x  2, wähle y0  1
x
 y0 2  1
y 3
y1  0 1   1,5
2 2 2
x 2
 y1  1,5 4  3 17
y 1,5 17
y2  1  3 2 6   1, 416
2 2 2 2 12

© Prof. Dr. Steffen Heinzl
Quadratwurzel: Beispiel
𝑥
𝑦
𝑦
𝑦
2
Näherungweise Berechnung von 2
x  2, wähle y0  1
x
 y0 2  1
y 3
y1  0 1   1,5
2 2 2
x 2
 y1  1,5 4  3 17
y 1,5 17
y2  1  3 2 6   1, 416
2 2 2 2 12

© Prof. Dr. Steffen Heinzl
Quadratwurzel: Beispiel
𝑥
𝑦
𝑦
𝑦
2
Näherungweise Berechnung von 2
x  2, wähle y0  1
x
 y0 2  1
y 3
y1  0 1   1,5
2 2 2
x 2
 y1  1,5 4  3 17
y 1,5 17
y2  1  3 2 6   1, 416
2 2 2 2 12

© Prof. Dr. Steffen Heinzl
Quadratwurzel: Beispiel
𝑥
𝑦
𝑦
𝑦
2
Näherungweise Berechnung von 2
x  2, wähle y0  1
x
 y0 2  1
y 3
y1  0 1   1,5
2 2 2
x 2
 y1  1,5 4  3 17
y 1,5 17
y2  1  3 2 6   1, 416
2 2 2 2 12

© Prof. Dr. Steffen Heinzl
Quadratwurzel: Beispiel
𝑥
𝑦
𝑦
𝑦
2
Näherungweise Berechnung von 2
x  2, wähle y0  1
x
 y0 2  1
y 3
y1  0 1   1,5
2 2 2
x 2
 y1  1,5 4  3 17
y 1,5 17
y2  1  3 2 6   1, 416
2 2 2 2 12

© Prof. Dr. Steffen Heinzl
Quadratwurzel: Beispiel
𝑥
𝑦
𝑦
𝑦
2
Näherungweise Berechnung von 2
x  2, wähle y0  1
x
 y0 2  1
y 3
y1  0 1   1,5
2 2 2
x 2
 y1  1,5 4  3 17
y 1,5 17
y2  1  3 2 6   1, 416
2 2 2 2 12

© Prof. Dr. Steffen Heinzl
PI‐Berechnung

© Prof. Dr. Steffen Heinzl
‐Beispiel:

Kreisfläche: r2

Kreisumfang: 2r

Aber wie kommt man auf den Wert für ?
© Prof. Dr. Steffen Heinzl
Kreisfläche Rechtecknäherung (I)
Betrachten wir für eine erste Näherung 
den Einheitskreis mit r = 1.


 1 1
4
 4

© Prof. Dr. Steffen Heinzl
Kreisfläche Rechtecknäherung (II)
Eine weitere Näherung mit zwei Rechtecken.

1
Fläche linkes Rechteck = 1 
2
© Prof. Dr. Steffen Heinzl
Kreisfläche Rechtecknäherung (II)
Für das rechte Rechteck muss zunächst 
dessen Höhe x berechnet werden.
2
1 3
x 2     12  x 2 
2 4
3
x
4

1 3 1
Fläche rechtes Rechteck  𝑥 · ·
2 4 2

© Prof. Dr. Steffen Heinzl
Kreisfläche Rechtecknäherung (III)

Fläche Fläche
linkes rechtes
Rechteck Rechteck

 1 1 1 3 1
  x     0,93301
4 2 2 2 4 2
  3, 73205 © Prof. Dr. Steffen Heinzl
Aufgabe
 Rechtecknäherung

Hinweis für das Übungsblatt: 
Berechnen Sie den Flächeninhalt zu obenstehender Zeichnung 
(auf Papier)!
© Prof. Dr. Steffen Heinzl

Das könnte Ihnen auch gefallen