while
while while
Informatik I – D-ITET Übung 3 Gruppe 7, ETZ F91 17-19h Daniel Dalquen Büro: CAB F61.1 ddalquen@inf.ethz.ch http://people.inf.ethz.ch/ddalquen/info1/ Dienstag, 16. Oktober 2007 1
- Seite 2 und 3: Nachbesprechung Ü1 • A1 - b) und
- Seite 4 und 5: Schleifen • ermöglichen wie das
- Seite 6 und 7: Beispiel int fak1(int a) { if(a < 0
- Seite 8 und 9: while-Schleife • Schleifenanweisu
- Seite 10 und 11: do-while-Schleife • Abbruchbeding
- Seite 12 und 13: Schleifen • for, while und do whi
- Seite 14 und 15: Übung 3, Aufgabe 1 • Wie oft wer
- Seite 16 und 17: Übung 3, Aufgabe 2 • Aufgabe auf
- Seite 18 und 19: Übung 3, Aufgabe 4 • Berechnung
Informatik I – D-ITET<br />
Übung 3<br />
Gruppe 7, ETZ F91 17-19h<br />
Daniel Dalquen<br />
Büro: CAB F61.1<br />
ddalquen@inf.ethz.ch<br />
http://people.inf.ethz.ch/ddalquen/info1/<br />
Dienstag, 16. Oktober 2007<br />
1
Nachbesprechung Ü1<br />
• A1<br />
- b) und f) haben Typ double, auch wenn das Ergebnis<br />
ganzzahlig ist<br />
- c) und g) enthalten nur Ganzzahl-Operationen<br />
• A2<br />
- c) zum Zeitpunkt der Typkonvertierung ist das<br />
Ergebnis (Ganzzahloperation) bereits berechnet<br />
Dienstag, 16. Oktober 2007<br />
2
Nachbesprechung Ü1<br />
• A5<br />
- d) Modulo-Operator gibt den Rest der Ganzzahl-<br />
Division zurück<br />
→ als bool-Wert interpretieren<br />
• A6<br />
- Frage von letzter Stunde: Reihenfolge von b, d<br />
vertauschbar?<br />
→ ja, ev. gibt der Compiler eine Warnung aus<br />
- c = 12.3 >= 3-2 && (e = 0)<br />
c = ((12.3 >= (3-2)) && (e = 0))<br />
→ c = (1 && 0) → c = 0<br />
Dienstag, 16. Oktober 2007<br />
3
Schleifen<br />
• ermöglichen wie das if-Statement einen Ausbruch aus dem<br />
linearen Ablauf des Programms<br />
• bei jedem Durchlauf einer Schleife wird deren<br />
Abbruchbedingung (auch Schleifeninvariante) geprüft<br />
• Anweisungen innerhalb der Schleife werden so lange<br />
ausgeführt bis die Scheifeninvariante nicht mehr gilt<br />
• in C++ drei Schleifenkonstrukte: for, <strong>while</strong> und do <strong>while</strong><br />
Dienstag, 16. Oktober 2007<br />
4
for-Schleife<br />
• Schleifenanweisung enthält Parameter zur Initialisierung,<br />
Prüfung und Inkrementierung der Laufvariablen<br />
• for(init; condition; increment)<br />
{<br />
// statements<br />
}<br />
• init: wird vor dem ersten Schleifendurchlauf ausgeführt<br />
• condition: wird vor jedem Schleifendurchlauf geprüft<br />
→ logischer Ausdruck (Ergebnis true oder false)<br />
• increment: wird nach jedem Schleifendurchlauf ausgeführt<br />
Dienstag, 16. Oktober 2007<br />
5
Beispiel<br />
int fak1(int a)<br />
{<br />
if(a < 0)<br />
return -1;<br />
int res = 1;<br />
for(int i = 2; i
for-Schleife<br />
• meist im Zusammenhang mit einer Laufvariablen benutzt<br />
• kann auch mehrere Statements im Schleifenkopf enthalten:<br />
for(init1, ... , initk; cond; inc1, ... , incn)<br />
• ... bis zur Unlesbarkeit:<br />
for(int i=2, j=0; i&&(j||a[i]||(j=i+1)); (j&&(++j%=n))||(++i%=n))<br />
(j%i)||(a[j]=1);<br />
Dienstag, 16. Oktober 2007<br />
7
<strong>while</strong>-Schleife<br />
• Schleifenanweisung enthält nur die Schleifeninvariante<br />
• <strong>while</strong>(condition)<br />
{<br />
// statements<br />
}<br />
• condition wird vor jedem Durchlauf geprüft<br />
Dienstag, 16. Oktober 2007<br />
8
Beispiel<br />
int fak2(int a)<br />
{<br />
if(a < 0)<br />
return -1;<br />
int i = 2, res = 1;<br />
<strong>while</strong>(i
do-<strong>while</strong>-Schleife<br />
• Abbruchbedingung wird im Gegensatz zu for und <strong>while</strong><br />
erst am Ende jedes Durchlaufs geprüft<br />
• Schleife wird mindestens einmal ausgeführt<br />
• do<br />
{<br />
// statements<br />
} <strong>while</strong>(condition);<br />
•<br />
Dienstag, 16. Oktober 2007<br />
10
Beispiel<br />
int fak3(int a)<br />
{<br />
if(a < 0)<br />
return -1;<br />
int i = 1, res = 1;<br />
do<br />
{<br />
res *= i;<br />
} <strong>while</strong>(++i
Schleifen<br />
• for, <strong>while</strong> und do <strong>while</strong> sind grundsätzlich äquivalent<br />
z.B. <strong>while</strong>(cond) → for( ; cond; )<br />
• Endlosschleifen:<br />
for( ; ; );<br />
<strong>while</strong>(true);<br />
do {} <strong>while</strong>(true);<br />
• manuell aus der Schleife springen: break;<br />
• Sprung ans Ende des Schleifenblocks: continue; 12<br />
Dienstag, 16. Oktober 2007
Wann welche Schleife?<br />
• Anzahl der Iterationen steht vor der Schleife fest<br />
→ for<br />
• Schleife mit unbestimmt vielen Iterationen<br />
→ <strong>while</strong><br />
• Schleife soll mindestens einmal ausgeführt werden<br />
→ do { } <strong>while</strong><br />
Dienstag, 16. Oktober 2007<br />
13
Übung 3, Aufgabe 1<br />
• Wie oft werden die Schleifen ausgeführt?<br />
• Umwandlung von <strong>while</strong>- in for-Schleifen<br />
- aufteilen in Initialisierung, Abbruchbedingung und<br />
Inkrementierung<br />
Dienstag, 16. Oktober 2007<br />
14
Übung 3, Aufgabe 1<br />
• <strong>while</strong> → for<br />
char i = 'z';<br />
<strong>while</strong>(i - 97 >= 0) {<br />
cout = 0; i--)<br />
cout
Übung 3, Aufgabe 2<br />
• Aufgabe auf Papier lösen (z.B. mit Tabelle)<br />
• Berechnungen innerhalb der Schleifen nachvollziehen<br />
Ereignis a b c d i<br />
Eintritt in die äussere Schleife 3.0 5 ? 1.0 ?<br />
Eintritt in die innere Schleife 3.0 5 3.0 1.0 1<br />
...<br />
• könnte eine Prüfungsaufgabe sein<br />
Dienstag, 16. Oktober 2007<br />
16
Übung 3, Aufgabe 3<br />
• Ausgabe des kleinen 1x1<br />
- eine Schleife für das Wiederholen der Berechnung<br />
- zwei verschachtelte Schleifen für die Ausgabe des<br />
ersten Teils<br />
for(int x = ...) {<br />
for(int y = ...) {<br />
// ...<br />
}<br />
}<br />
- im zweiten Teil: Abbruchbedingung der inneren Schleife<br />
abhängig von der Laufvariablen der äusseren Schleife<br />
Dienstag, 16. Oktober 2007<br />
17
Übung 3, Aufgabe 4<br />
• Berechnung der Eulerschen Zahl<br />
• eine Schleife genügt<br />
→ Berechnung eines Terms aus dem vorigen<br />
• Abbruchbedingung so wählen, dass 5 Stellen nach dem<br />
Komma richtig sind<br />
Dienstag, 16. Oktober 2007<br />
18
Fragen?<br />
Dienstag, 16. Oktober 2007<br />
19