5. Kontrollstrukturen II Schleifen Sprünge Grundlagen der Informatik (Alex Rempel) 1
Schleifen Schleifen allgemein und in C++ Schleifen (Loops) ermöglichen die Realisierung sich wiederholender Aufgaben (z.b. Durchschnittberechnung) 3 Arten von Schleifen in C++ 'while' kopfgesteuert, abweisender Charakter 'do while' 'for' fußgesteuert, nicht abweisender Charakter Zählschleife, Schleife mit fester Schrittweite Grundlagen der Informatik (Alex Rempel) 2
while Schleifen while Schleife ist kopfgesteuert Ablauf while (expression) statement expression als Wahrheitswert auswerten wenn true führe statement aus und prüfe wieder wenn false überspringe statement statement wird also solange (engl. while) ausgeführt wie expression true ist Grundlagen der Informatik (Alex Rempel) 3
while Schleifen while Flussdiagramm und Struktogramm expression expression true statement statement false Grundlagen der Informatik (Alex Rempel) 4
while Schleifen while Beispiel gib ASCII code zu Character aus Abbruch bei Eingabe von 'q' solange char nicht 'q' Eingabe als char Ausgabe als (int)char Grundlagen der Informatik (Alex Rempel) 5
while Schleifen while Beispiel gib ASCII code zu Character aus Abbruch bei Eingabe von 'q' #include <iostream> #include <iomanip> using namespace std; void main() { unsigned char ucinput = '0'; while (ucinput!= 'q') { cout << "Character input: "; cin >> ucinput; cout << "\n\t'" << ucinput << "' == ASCII " << (int)ucinput << endl; Grundlagen der Informatik (Alex Rempel) 6
while Schleifen while Beispiel gib ASCII code zu Character aus Abbruch bei Eingabe von 'q' #include <iostream> #include <iomanip> using namespace std; void main() { unsigned char ucinput = '0'; while (ucinput!= 'q') { cout << "Character input: "; cin >> ucinput; cout << "\n\t'" << ucinput << "' == ASCII " << (int)ucinput << endl; Grundlagen der Informatik (Alex Rempel) 7
while Schleifen while Fehlerquelle: unendliche Schleife Die Abbruchbedingungen in einer Schleife müssen stets gültig bleiben, sonst terminiert das Programm nicht #include <iostream> using namespace std; Für welche Eingaben terminiert das Programm nicht so wie geplant? void main() { int iinput = 0; cout << "Integer input i = "; cin >> iinput; while (iinput * iinput > 0) { cout << "i * i = " << iinput * iinput << endl; iinput--; Grundlagen der Informatik (Alex Rempel) 8
do while Schleifen do while Schleife ist fußgesteuert Ablauf statement ausführen expression als Wahrheitswert auswerten wenn true führe statement aus und prüfe wieder do statement while (expression) wenn false beende Schleife statement wird also solange ausgeführt wie expression true ist, aber mindestens ein Mal Grundlagen der Informatik (Alex Rempel) 9
do while Schleifen do while Flussdiagramm und Struktogramm statement statement expression false true expression Grundlagen der Informatik (Alex Rempel) 10
do while Beispiel do while Schleifen gib zu einer Zahl innerhalb eines vorgegebenen Wertebereichs die Wurzel aus Eingabe als double solange double nicht innerhalb von min und max Ausgabe Wurzel aus double Grundlagen der Informatik (Alex Rempel) 11
do while Beispiel do while Schleifen gib zu einer Zahl innerhalb eines vorgegebenen Wertebereichs die Wurzel aus #include <iostream> #include <math.h> using namespace std; void main() { double dmin = 3.5, dmax = 25.3; double dinput = 0; do { cout << "Double input (" << dmin << " < d < " << dmax << ") = "; cin >> dinput; while (dinput <= dmin dinput >= dmax); cout << "Square root sqrt(" << dinput << ") = " << sqrt(dinput) << endl; Grundlagen der Informatik (Alex Rempel) 12
do while Beispiel do while Schleifen gib zu einer Zahl innerhalb eines vorgegebenen Wertebereichs die Wurzel aus #include <iostream> #include <math.h> using namespace std; void main() { double dmin = 3.5, dmax = 25.3; double dinput = 0; do { cout << "Double input (" << dmin << " < d < " << dmax << ") = "; cin >> dinput; while (dinput <= dmin dinput >= dmax); cout << "Square root sqrt(" << dinput << ") = " << sqrt(dinput) << endl; Grundlagen der Informatik (Alex Rempel) 13
Schleifen in Schleifen Schleifen können auch verschachtelt werden Beispiel: Fakultätberechnung Aufgabe: Fakultät für Zahlen von 1 bis 9 ausgeben Verfahren: Fakultät von n ist 'n!' n! = 1 * 2 * 3 *... * n Beispiel: 4! = 1 * 2 * 3 * 4 = 24 Grundlagen der Informatik (Alex Rempel) 14
Schleifen in Schleifen Schleifen können auch verschachtelt werden Beispiel: Fakultätberechnung (n! = 1*2*3*...*n) min=1, max=9, nr=min solange nr <= max factorial=1, counter=1 solange counter <= nr factorial = factorial * counter counter = counter+1 Ausgabe factorial nr = nr+1 Grundlagen der Informatik (Alex Rempel) 15
Schleifen in Schleifen Schleifen können auch verschachtelt werden Beispiel: Fakultätberechnung (n! = 1*2*3*...*n) #include <iostream> using namespace std; void main() { int imin = 1, imax = 9; int inumber = imin; while (inumber <= imax) { // for all numbers in range unsigned long ulfactorial = 1; int icounter = 1; while (icounter <= inumber) { // calculate factorial ulfactorial = ulfactorial * icounter; ++icounter; cout << "Factorial(" << inumber << ") = " << ulfactorial << endl; ++inumber; // prepare next number Grundlagen der Informatik (Alex Rempel) 16
Schleifen in Schleifen Schleifen können auch verschachtelt werden Beispiel: Fakultätberechnung (n! = 1*2*3*...*n) #include <iostream> using namespace std; void main() { int imin = 1, imax = 9; int inumber = imin; while (inumber <= imax) { // for all numbers in range unsigned long ulfactorial = 1; int icounter = 1; while (icounter <= inumber) { // calculate factorial ulfactorial = ulfactorial * icounter; ++icounter; cout << "Factorial(" << inumber << ") = " << ulfactorial << endl; ++inumber; // prepare next number Grundlagen der Informatik (Alex Rempel) 17
for Schleifen for Zählschleife mit festen Schritten Ablauf for (statement_init; expression; statement_step) statement statement_init ausführen expression als Wahrheitswert auswerten wenn true führe statement aus wenn false beende Schleife statement_step ausführen zurück zur expression Prüfung Grundlagen der Informatik (Alex Rempel) 18
for Schleifen for Flußdiagramm und Struktogramm statement_init statement_init expression statement_step expression true statement statement statement_step false Grundlagen der Informatik (Alex Rempel) 19
for Beispiel Grundlagen der Informatik for Schleifen Aufgabe: ASCII Code und Zeichen ausgeben (32 bis 255) #include <iostream> #include <iomanip> using namespace std; void main() { int ifrom = 32, ito = 255; for (int i = ifrom; i <= ito; ++i) { cout << setw(5) << i << "=" << (char)i; if (i%10 == 0) // new line after 10 values cout << endl; cout << endl; Grundlagen der Informatik (Alex Rempel) 20
for Beispiel Grundlagen der Informatik for Schleifen Aufgabe: ASCII Code und Zeichen ausgeben (32 bis 255) Grundlagen der Informatik (Alex Rempel) 21
for Schleifen Hinweis: die temporäre Variable i in... for (int i = imax; i > imin; --i)......darf nicht außerhalb der for Schleife genutzt werden Hinweis: Äquivalenz von for und while for (statement_init; expression; statement_step) statement statement_init; while (expression) { statement; statement_step; Grundlagen der Informatik (Alex Rempel) 22
for Schleifen Mehrere Ausdrucke innerhalb von for Kommaoperator expression_1, expression_2... expressions werden von links nach rechts gewertet Das Resultat hat den Typ der letzten expression Beispiel: Summe von 1 bis 10 #include <iostream> using namespace std; void main() { int inumber = 0, isum = 0; for (inumber=1, isum=0; inumber <= 10; isum += inumber, ++inumber); cout << "Sum of 1 to 10 = " << isum << endl; Grundlagen der Informatik (Alex Rempel) 23
for Schleifen Mehrere Ausdrucke innerhalb von for Kommaoperator expression_1, expression_2... expressions werden von links nach rechts gewertet Das Resultat hat den Typ der letzten expression Beispiel: Summe von 1 bis 10 #include <iostream> using namespace std; void main() { int inumber = 0, isum = 0; for (inumber=1, isum=0; inumber <= 10; isum += inumber, ++inumber); cout << "Sum of 1 to 10 = " << isum << endl; Kommaoperator kein Kommaoperator Kommaoperator Grundlagen der Informatik (Alex Rempel) 24
Sprünge Grundlagen der Informatik Sprünge break aktueller Schleifenblock wird verlassen while (epxression_1) { statement_1 if (expression_2) break; statement_2 statement_3 Grundlagen der Informatik (Alex Rempel) 25
Sprünge Grundlagen der Informatik Sprünge continue springe zur Überprüfung der aktuellen Schleife while (epxression_1) { statement_1 if (expression_2) continue; statement_2 statement_3 Grundlagen der Informatik (Alex Rempel) 26
Sprünge Grundlagen der Informatik Sprünge goto springe zu einer Marke for (...) for (...) for(...) goto label_name... label_name:... Im Labor sind goto Anweisungen verboten! Sehr fehleranfällig und schwer wartbar C++ bietet bessere Alternativen (Ausnahmebehandlung) Grundlagen der Informatik (Alex Rempel) 27
for Schleifen for kann im Prinzip alle Schleifen abbilden oft sehr trickreich, aber schwer lesbar Beispiel für for Mächtigkeit: for (Datei öffnen, lese Daten; kein Dateiende; lese Daten) verarbeite Daten Grundlagen der Informatik (Alex Rempel) 28