Steueranweisungen Bisher Programme mit Funktionen als einfache Folge von Befehlen Ablauf von Programmen darüber hinaus steuerbar über Bedingte Ausführung: Ausführung von Programmteilen (Befehlen oder Programmblöcken) nur wenn eine bestimmte Bedingung erfüllt ist Selektion, Verzweigung Programmschleifen: mehrfache Wiederholung von Programmteilen so lange oder bis eine bestimmte Bedingung erfüllt bzw. nicht mehr erfüllt ist Iteration, Schleife Fehlerbehandlung: Ausführung spezieller Programmteile im Fall eines Fehlers Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 32
Einfache Bedingte Ausführung if-anweisung gefolgt von geklammerter Bedingung als Einführung für einen einzelnen Befehl oder einen Programmblock if (<Bedingung>) <Befehl>; if (<Bedingung>) { <Befehlssequenz> ; Bedingung kann über logische Operatoren verknüpft werden und evaluiert entsprechend zu 0 (FALSE) oder andernfalls TRUE ( logische Operatoren) Ausführung entsprechend Ergebnis: TRUE: Ausführung des vonif eingeleiteten Befehls oder Programmblocks FALSE: Programmteil der zumif-block gehört wird nicht ausgeführt und Ausführung danach fortgesetzt Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 33
Einfache Bedingte Ausführung: Beispiel (C) #include <stdio.h> int main() { int x; printf( x = ); scanf( %i,&x); if (x >= 0) printf( Zahl ist positiv oder gleich 0. \n ); if (x == 42) { printf( Die Zahl ist 42. \n ); printf( Das ist hexadezimal %X \n,42); ; return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 34
Einfache Bedingte Ausführung: Beispiel (C++) #include <iostream> using namespace std; int main() { int x; cout << x = ; cin >> x; if (x >= 0) cout << Zahl ist positiv oder gleich 0. << endl; if (x == 42) { cout << Die Zahl ist 42. << endl; cout << Das ist hexadezimal << hex << 42 << endl; ; return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 35
Darstellung von Programmabläufen Zum Entwurf und zur Illustration von Algorithmen verschiedene formale und informale Beschreibungsmittel: Pseudocode: informale, textuelle Darstellung des Algorithmus zum Teil mit Mitteln der natürlichen Sprache Struktogramme: formale Darstellung von Programmabläufen als Blockdiagramm Programmablaufpläne (PAP): Beschreibung des Programmablaufs durch spezielle Notation für generische Anweisungsklassen Im folgenden beide letztgenannte Diagrammtypen gemischt mit Pseudocode zur Illustration Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 36
Einfache Bedingte Ausführung: Struktogramm START Test42 Eingabe: x x >=0? ja Ausgabe Text % x = 42? ja Ausgabe Text Ausgabe Hex STOP % nein nein Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 37
Einfache Bedingte Ausführung: Struktogramm START Eingabe: x x >= 0? ja nein Ausgabe Text x = 42? ja nein Ausgabe Text Ausgabe Hex STOP Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 38
Bedingte Ausführung mit Alternative Erweiterter Syntax derif-anweisung umelse-klausel: Ausführung eines alternativen Programmteils, falls Bedingung nicht erfüllt if (<Bedingung>) <Befehl oder Programmblock> else <Befehl oder Programmblock>; In Abhängigkeit von der Bedingung wird nur ein Zweig der Anweisung ausgeführt (Verzweigung) Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 39
Bedingte Ausführung mit Alternative: Beispiel (C) #include <stdio.h> #include <math.h> int main() { float x; printf( x = ); scanf( %f,&x); if (x >= 0) { float w = sqrt(x); printf( Wurzel ist %f \n,w); else printf( Wurzelberechnung nicht möglich! \n ); return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 40
Bedingte Ausführung mit Alternative: Beispiel (C++) #include <iostream> #include <cmath> using namespace std; int main() { float x; cout << x = ; cin >> x; if (x >= 0) { float w = sqrt(x); cout << Wurzel ist << w << endl; else cout << Wurzelberechnung nicht möglich! << endl; return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 41
Bedingte Ausführung mit Alternative: Struktogramm START Wurzel Eingabe: x x >=0? ja w:=sqrt(x) Ausgabe w STOP nein Ausgabe Text Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 42
Bedingte Ausführung mit Alternative: Struktogramm START Eingabe: x x >= 0? ja nein w := sqrt(x) Ausgabe Text Ausgabe w STOP Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 43
Schachtelung vonif-anweisungen Verzweigungen können beliebig geschachtelt werden if (alter >= 0) if (alter < 120) printf( Alter korrekt... \n ); Können durch Zusammenfassen der Bedingungen oft vereinfacht werden: Sequenz vonif-bedingungen entspricht logischer Konjunktion if (alter >= 0 && alter < 120) printf( Alter korrekt... \n ); Aber nicht immer: Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 44
Schachtelung vonif-anweisungen /2 Schachtelung erlaubt separate Behandlung der logischen Alternativen imelse-zweig if (alter >= 0) if (alter < 120) printf( Alter korrekt... \n ); else printf( Alter zu hoch! \n ); else printf( Alter zu gering! \n ); Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 45
Sequenz vonif/else if-anweisungen Sequenz vonif/else if-anweisungen erlaubt Mehrfachverzweigung if (alter < 1) printf( Baby. \n ); else if (alter < 4) printf( Kleinkind. \n ); else if (alter < 6) printf( Vorschulkind. \n ); else if (alter < 18) printf( Schulkind. \n ); else printf( Führerschein. \n ); Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 46
Mehrfachverzweigung mitswitch switch-steueranweisung undcase-sprungmarken setzen einfache Sprungtabelle um switch(<variable>) { case <Wert1> : <Befehlssequenz>; case <Wert2> : <Befehlssequenz>; case <Wert3> : <Befehlssequenz>;... default: <Befehlssequenz>; switch-variable muss ordinalen Wert haben, d.h. Integer (inklusive char) case-marken sind Sprungmarken, d.h. Ausführung ab da bis zum Ende desswitch-statements sollen nur einzelne Fälle ausgeführt werden, muss derswitch-block mitbreak verlassen werden Falls kein Wert in der Liste, wird zur optionalendefault-marke gesprungen Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 47
Mehrfachverzweigung mitswitch: Beispiel /1 #include <stdio.h> #define PI 3.141592653589793 int main() { int auswahl; float radius,durchmesser,umfang,flaeche; printf( Radius des Kreises = ); scanf( %f,&radius); printf( 1) Berechnung des Durchmessers \n ); printf( 2) Berechnung des Umfangs \n ); printf( 3) Berechnung der Fläche \n ); printf( Auswahl: ); scanf( %i,&auswahl);... Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 48
Mehrfachverzweigung mitswitch: Beispiel /2... switch(auswahl) { case 1: durchmesser = 2*radius; printf( Durchmesser ist: %f \n, durchmesser); break; case 2: umfang = 2*radius*PI; printf( Umfang ist: %f \n, umfang); break; case 3: flaeche = radius*radius*pi; printf( Fläche ist: %f \n, flaeche); break; default: printf( Es wurde keine Berechnung durchgeführt. \n ); return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 49
Mehrfachverzweigung mitswitch: Beispiel /3 Vorsicht bei fehlendenbreak-steueranweisungen: switch(auswahl) { case 1: durchmesser = 2*radius; printf( Durchmesser ist: %f \n, durchmesser); case 2: umfang = 2*radius*PI; printf( Umfang ist: %f \n, umfang); case 3: flaeche = radius*radius*pi; printf( Fläche ist: %f \n, flaeche); Radius des Kreises = 23 1) Berechnung des Durchmessers 2) Berechnung des Umfangs 3) Berechnung der Fläche Auswahl: 1 Durchmesser ist: 46.000000 Umfang ist: 144.513260 Fläche ist: 1661.902466 Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 50
Programmschleifen Auch Iteration oder Zyklen: Wiederholung von Programmteilen (Blöcken oder einzelnen Befehlen) entsprechend bestimmten Bedingungen for-schleife: Zählschleife zum Durchlaufen von Wertebereichen für eine Variable while-schleife: kopfgesteuerte Schleife mit beliebiger Bedingung für Wiederholung, die vor dem Porgrammteil ausgwertet wird do-while-schleife: fußgesteuerte Schleife mit beliebiger Bedingung für Wiederholung, die am Ende des Porgrammteils ausgwertet wird Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 51
for-schleife Zählschleife for ([<Initialisierung>];[<Bedingung>];[<Schrittanweisung>]) <Befehl oder Programmblock> Initialisierung: Deklaration (oder kommaseparierte Folge von Deklarationen) und Defintion der Laufvariable(n), die einmalig vor Beginn der Iteration ausgeführt wird Bedingung: logischer Ausdruck, der am Anfang jeden Iterationsschritts erfüllt sein muss Schrittanweisung: Modifikation der Laufvariablen am Ende jeden Iterationsschrittes, bei mehreren auch kommaseparierte Liste von Modifikationen Alle drei Teile sind optional Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 52
for-schleife: PAP Initialisierung Bedingung ja nein Anweisungen Schrittanweisung Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 53
for-schleife: Beispiel (C) #include <stdio.h> int main() { int max; printf( Maximalwert = ); scanf( %i, &max); int sum = 0; for (int i=1; i <= max; i++) { sum = sum + i; printf( Summe der natürlichen Zahlen bis %i : %i \n, i, sum); return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 54
for-schleife: Beispiel (C++) #include <iostream> using namespace std; int main() { int max; cout << Maximalwert = ; cin >> max; int sum = 0; for (int i=1; i <= max; i++) { sum = sum + i; cout << Summe der natürlichen Zahlen bis << i << : << sum << endl; return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 55
for-schleife: Beispiele möglicher Schleifenköpfe Weitere Beispiele for (int i=1; i <= 10; i++)... // 1 2 3... 10 for (int i=10; i > 0; i )... // 10 9 8... 1 for (int i=1; i <= 256; i*=2)... // 1 2 4 8... 256 for (int i=1, int j=10; i < j; i++,j )... // (1,10) (2,9)... (5,6) for (;;)... // Endlosschleife for (;!gefunden;)... // entspricht while(!gefunden)... Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 56
while-schleife Kopfgesteuerte Schleife while (<Bedingung>) <Befehl oder Programmblock> Bedingung wird jeweils vor Ausführung des folgenden Befehls/Programmblocks ausgewertet Abweisende Schleife: wird die Bedingung vor der ersten Ausführung nicht erfüllt, wird der Schleifentext gar nicht ausgeführt Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 57
while-schleife: Beispiel (C) #include <stdio.h> int main() { int min,max; int sum = 0; printf( Kleinere Zahl = ); scanf( %i, &min); printf( Größere Zahl = ); scanf( %i, &max); printf( Summe aller Zahlen von %i bis %i ist, min,max); while(min <= max) { sum = sum + min; min++; printf( %i. \n, sum); return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 58
while-schleife: Beispiel (C++) #include <iostream> using namespace std; int main() { int min,max; int sum = 0; cout << Kleinere Zahl = ; cin >> min; cout << Größere Zahl = ; cin >> max; cout << Summe aller Zahlen von << min << bis << max << ist ; while(min <= max) { sum = sum + min; min++; cout << sum <<. << endl; return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 59
while-schleife: PAP Bedingung ja Anweisungen nein Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 60
while-schleife: Struktogramm solange Bedingung wahr Anweisunge(n) Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 61
do-while-schleife Fußgesteuerte Schleife do <Befehl oder Programmblock> while (<Bedingung>); Bedingung wird jeweils nach Ausführung des Schleifenteils überprüft Nicht-abweisende Schleife: der Schleifentext wird mindestens immer einmal ausgeführt, bevor die Bedingung am Ende überprüft wird Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 62
do-while-schleife: Beispiel (C) #include <stdio.h> int main() { int summand; int sum = 0; do { printf( Aktuelle Zwischensumme : %i \n, sum); printf( Nächster Summand (0 für Abbruch) = ); scanf( %i, &summand); sum = sum + summand; while (summand!= 0); return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 63
do-while-schleife: Beispiel (C++) #include <iostream> using namespace std; int main() { int summand; int sum = 0; do { cout << Aktuelle Zwischensumme : << sum << endl; cout << Nächster Summand (0 für Abbruch) = ; cin >> summand; sum = sum + summand; while (summand!= 0); return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 64
do-while-schleife: PAP Anweisungen ja Bedingung nein Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 65
do-while-schleife: Struktogramm Anweisunge(n) solange Bedingung wahr Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 66
Schachtelung von Schleifen Schleifen gleicher oder unterschiedlicher Art können beliebig geschachtelt werden Beispiel in C #include <stdio.h> int main() { int hoehe; printf( Höhe des Weihnachtsbaums = ); scanf( %i, &hoehe); for (int i=hoehe; i > 0; i-) { for (int j=i/2+1;j>0;j-) printf( ); for (int j=hoehe-i+1;j>0;j-) printf( * ); printf( \n ); return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 67
Schachtelung von Schleifen: Beispiel (C++) #include <iostream> using namespace std; int main() { int hoehe; cout << Höhe des Weihnachtsbaums = ; cin >> hoehe; for (int i=hoehe; i > 0; i-) { for (int j=i/2+1;j>0;j-) cout << ; for (int j=hoehe-i+1;j>0;j-) cout << * ; cout << endl; return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 68
Steueranweisung in Schleifen Spezielle Steueranweisung zur Kontrolle des Schleifenablaufs break: Abbruch der Schleifenausführung, Programm wird nach dem Schleifentext fortgesetzt (entsprechend schon bei Mehrfachverzweigung mit switch verwendet) continue: Abbruch des aktuellen Schleifendurchlaufs, d.h. Code bis zum Ende des Schleifenblocks wird ignoriert, und mit dem nächsten Iterationsschritt (Anfang der Schleife) fortgesetzt Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 69
Schleifen mitbreak: Beispiel (C) #include <stdio.h> #include <stdlib.h> #include <time.h> #define MIN 1 #define MAX 100 #define MAX_VERSUCHE 20 int main() { srand(time(null)); // Initialisierung Zufallszahlen int gesucht = MIN+rand()%(MAX-MIN+1); printf( Zahlenraten zwischen %i und %i \n,min,max); printf( Gesuchte Zahl = %i \n,gesucht); int versuch = 0;... Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 70
Schleifen mitbreak: Beispiel (C) /2... while(versuch < MAX_VERSUCHE) { versuch++; int test = MIN+rand()%(MAX-MIN+1); printf( Versuch %i : %i \n, versuch,test); if (test == gesucht) { printf( Gefunden! \n ); break; return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 71
Schleifen mitbreak: Beispiel (C++) #include <iostream> #include <cstdlib> #include <ctime> #define MIN 1 #define MAX 100 #define MAX_VERSUCHE 20 using namespace std; int main() { srand(time(null)); int gesucht = MIN+rand()%(MAX-MIN+1); cout << Zahlenraten zwischen << MIN << und << MAX << endl; cout << Gesuchte Zahl = << gesucht << endl; int versuch = 0;... Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 72
Schleifen mitbreak: Beispiel (C++) /2... while(versuch < MAX_VERSUCHE) { versuch++; int test = MIN+rand()%(MAX-MIN+1); cout << Versuch << versuch << : << test << endl; if (test == gesucht) { cout << Gefunden! << endl ; break; return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 73
Schleifen mitcontinue: Beispiel (C) #include <stdio.h> #include <stdlib.h> #include <time.h> #define MIN 1 #define MAX 10 int main() { srand(time(null)); int gesucht = MIN+rand()%(MAX-MIN+1); printf( Zahlenraten zwischen %i und %i \n,min,max); int test;... Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 74
Schleifen mitcontinue: Beispiel (C) /2... bool gefunden=false; while(!gefunden) { printf( Geratene Zahl = ); scanf( %i,&test); if (test < MIN test > MAX) { printf( Zahl ist außerhalb des Bereichs! \n ); continue; if (test == gesucht) break; printf( Leider falsch geraten. \n ); printf( Gefunden! \n ); return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 75
Schleifen mitcontinue: Beispiel (C++) #include <iostream> #include <cstdlib> #include <ctime> #define MIN 1 #define MAX 10 using namespace std; int main() { srand(time(null)); int gesucht = MIN+rand()%(MAX-MIN+1); cout << Zahlenraten zwischen << MIN << und << MAX «end int test;... Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 76
Schleifen mitcontinue: Beispiel (C++) /2... bool gefunden=false; while(!gefunden) { cout << Geratene Zahl = ; cin >> test; if (test < MIN test > MAX) { cout << Zahl ist außerhalb des Bereichs! << endl; continue; if (test == gesucht) break; cout << Leider falsch geraten. << endl; cout << Gefunden! << endl; return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 77
Ausnamebehandlung in C++ In C++ spezieller Mechanismus zur Ausnahmehandlung (Exception Handling) über Steueranweisungen try { <Befehlssequenz> catch (<Ausnahmedeklaration>) { <Fehlerbehandlung> Wird imtry-block direkt oder indirekt, d.h. in einer aufgerufenen Funktion, eine Ausnahme signalisiert, wird die Programmausführung automatisch unterbrochen Passt die Ausnahme zur Aussnahmedeklaration der catch-anweisung, wird zur Fehlerbehandlung der Code im catch-block ausgeführt Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 78
Ausnamebehandlung in C++ /2 Erfordert explizites Signalisieren ( werfen throw) der Ausnahme als Ausdruck typisierter Wert throw <Ausdruck>; Im einfachsten Fall literaler Wert throw 42; Ausnahme kann z.b. im Code einer Bibliothek geworfen werden, deren Quelltext bei Verwendung der Funktionalität nicht vorliegt trotzdem Behandlung des Problems möglich, ohne dass das Programm beendet werden muss Besondere Bedeutung in C++ : Ausnahmen als Objekte von speziellen Exception-Klassen signalisert Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 79
try-catch Ausnahmebehandlung: Beispiel #include <iostream> using namespace std; float kehrwert(float zahl) { if (zahl == 0) throw (char*) Division durch null! ; return 1/zahl;... Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 80
try-catch Ausnahmebehandlung: Beispiel /2... int main() { try { float x; cout << x = ; cin >> x; float y = kehrwert(x); cout << Kehrwert ist << y << endl; catch (char* ausnahme) { cout << Fehler aufgetreten: << endl; cout << ausnahme << endl; return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 81
try-catch Ausnahmebehandlung: Beispiel /2 Ausnahmen verschiedenen Typs können durch Sequenz verschiedenercatch-blöcke abgefangen werden catch (...) fängt beliebige Fehler ab try {... catch (char* ausnahme) { cout << Fehler aufgetreten: << endl; cout << ausnahme << endl; catch (int i) { cout << Fehler aufgetreten, Nr: << i << endl; catch (...) { cout << Sontiger Fehler. << endl; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 82
Zusammenfassung: Steueranweisung Bedingte Ausführung if: einfache bedingte Ausführung if-else: mit Alternative Schachtelung und Sequenz von Verzweigungen switch-case: Sprungtabelle für Mehrfachverzweigung Schleifen for: Zählschleife while: kopfgesteuerte Schleife do-while: fußgesteuerte Schleife Steuerung mitbreak undcontinue Ausnahmebehandlung try undcatch: Behandeln ( Fangen ) von Ausnahmen throw: Signalisieren ( Werfen ) von Ausnahmen Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 2 83