while

while while

29.01.2014 Aufrufe

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

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!