1/23 Informationsverarbeitung Einführung in das Programmieren mit C++ Markus Uhlmann Institut für Hydromechanik Karlsruher Institut für Technologie www.ifh.kit.edu WS 2011/2012 Vorlesung 4 (alle Quelldateien im Paket)
2/23 4. VORLESUNG Kontrollstrukturen Advice: Avoid complicated expressions. B. Stroustrup
3/23 Fragen, die in dieser Vorlesung diskutiert werden Auswahlanweisungen Wie kann die Abfolge eines Programmes geändert werden? Mit welchen Operatoren können komplexe Bedingungen formuliert werden? Wie können bestimmte Programmteile wiederholt ausgeführt werden?
Allgemeines If-Elseif-Else Switch-Case 4/23 Auswahlanweisungen welche Anweisung ist für meinen Fall geeignet? eine Auswahlmöglichkeit zwei Auswahlmöglichkeiten mehr als zwei Auswahlmöglichkeiten einseitige Auswahl zweiseitige Auswahl mehrstufige Auswahl mehrseitige Auswahl if if/else if/else if... switch/case
Allgemeines If-Elseif-Else Switch-Case 5/23 if-anweisungen Syntax: if ( <Ausdruck> ) <Anweisung> Bsp: if ( x == 0 ) cout << "Wert x=0" ; die Bedingung <Ausdruck> wird ausgewertet falls Ergebnis true (wahr): <Anweisung> wird ausgeführt sonst (d.h. Ergebnis false falsch): <Anweisung> wird übersprungen
Allgemeines If-Elseif-Else Switch-Case 6/23 Gruppierung längerer Programmteile längere Programmteile können durch geschweifte Klammern gruppiert werden: { } (ohne Semikolon!) Gruppierung bewirkt Zusammenfassung zu einer Anweisung ermöglicht Auswahl/Überspringen mehrerer Einzelanweisungen Bsp: if ( x >= 0.0 ) { log_x = log( x ); wurzel_x = sqrt( x ); }
Allgemeines If-Elseif-Else Switch-Case Vergleichsoperatoren Vergleich von zwei arithmetischen Operanden Ausdruck x > y x < y x >= y x <= y x == y x!= y Relation x größer als y x kleiner als y x größer gleich y x kleiner gleich y x gleich y x ungleich y Verwechslungsgefahr zwischen == und Zuweisung: (x==y) vs. (x=y) (Quelltext 4.1) Vorsicht bei Prüfung der Gleichheit von Fliesskommazahlen (f==1.0) (Quelltext 4.2) 7/23
Allgemeines If-Elseif-Else Switch-Case 8/23 Logische Verknüpfungen Anwendung auf logische Operanden Ausdruck Relation x && y logisches und x y logisches oder!x Negation Verknüpfung liefert wiederum logischen Ausdruck erspart Verschachtelung von if-anweisungen (Quelltext 4.3) Bsp: if ( (alter > 2) && (alter < 12)) std::cout << "Kindertarif";
Allgemeines If-Elseif-Else Switch-Case 9/23 Mehr zu Bedingungen Arten von Bedingungen (<Ausdruck>) Vergleichsausdrücke (s. oben) Bsp: ( x>y ) implizite Bedingungen Bsp: ( x ) jeglicher Ausdruck, der sich in bool umwandeln lässt Ausdruck mit arithm. Typ: 0 false, sonst true Bsp: (Quelltext 4.4) int x, a = 3; if ( x = a ) //Nebeneffekt: Zuweisung an x std::cout << "a ungleich Null";
Allgemeines If-Elseif-Else Switch-Case 10/23 Mehr zur Priorität der Operatoren Komplexe Ausdrücke mit mehreren Operatoren C++ definiert strikte Regeln zur Priorität der Operatoren (sh. Anhang) (Quelltext 4.5) Erlernen aller Regeln oft nicht notwendig Praktische Empfehlung: Priorität Operator 1, /, % Multiplikation, Division, Restwert 2 +, Addition, Subtraktion Benutzung von Klammern für alle anderen Operatoren bessere Lesbarkeit
Allgemeines If-Elseif-Else Switch-Case 11/23 if-else-anweisungen Syntax: if ( <Ausdruck> ) <Anweisung1> else <Anweisung2> Zweiseitige Auswahl Bsp: if ( x == 0 ) y = 0.0; else y = 1.0 / x ; <Ausdruck> wird ausgewertet falls Ergebnis true : <Anweisung1> wird ausgeführt sonst (d.h. Ergebnis false ): <Anweisung2> wird ausgeführt es wird immer genau eine der Anweisungen ausgeführt
Allgemeines If-Elseif-Else Switch-Case 12/23 Verschachteltes if-else Bsp: 1 if (i>j) 2 if (i<0) 3 m=-i; 4 else //"if" zeile 2 5 m=i; 6 else //"if" zeile 1 7 m=j; else bezieht sich immer auf vorhergehendes if!
Allgemeines If-Elseif-Else Switch-Case 13/23 Verschachteltes if-else (2) Bsp1: 1 if (i>j) 2 if (i<0) 3 m=-i; 4 else //"if" zeile 2! 5 m=j; Bsp2: 1 if (i>j) 2 { 3 if (i<0) 4 m=-i; 5 } 6 else //"if" zeile 1! 7 m=j; Bsp1: else bezieht sich auf zweites if (falsch eingerückt!) Bsp2: Setzen von Gruppierung durch { } ändert Zuordnung
Allgemeines If-Elseif-Else Switch-Case 14/23 if-else if-anweisungen Syntax: if ( <Ausdruck1> ) <Anweisung1> else if ( <Ausdruck2> ) <Anweisung2>... Bsp: if ( x == 0 ) y = 0.0; else if ( x > 0.0) y = 1.0 / x ; else y = 1.0 / (-x) ; Mehrstufige Auswahl (Quelltext 4.6) Abfrage verschiedener Bedingungen für jede Anweisung Abarbeitung in Reihenfolge, bis zuerst wahr abschliessendes else ist optional erspart tief verschachtelte if else Anweisungen
Allgemeines If-Elseif-Else Switch-Case Switch-Case Anweisung Syntax: switch (<Ausdruck>) { case <Konstante1>: <Anweisung1> break; case <Konstante2>: <Anweisung2> break;... default: <AnweisungN> } Bsp: char zeichen; switch (zeichen) { case a : cout << "Buchstabe a."; break; case b : cout << "Buchstabe b."; break;... } Mehrseitige Auswahl (Quelltext 4.7) Abfrage einer Bedingungen, mit mehreren Alternativen Abarbeitung der Anweisungen nach Marke, bis break <Ausdruck> muss in Ganzzahl umwandelbar sein 15/23
While- For- Beispiel: π 16/23 Iterative Operationen: Wozu werden gebraucht? viele Aufgaben erfordern wiederholte Bearbeitung von Daten Iterationen sind eine Lösung (alternativ: Rekursion) Iterationen werden i.d.r. durch realisiert Bsp: Addieren einer Reihe von Zahlenwerten
While- For- Beispiel: π 17/23 While- Syntax: while ( <Ausdruck> ) <Anweisung> Bsp: (Quelltext 4.8) 1 int n = 10, i = 1, fak = 1; 2 while ( i <= n ) 3 {//berechnet Fakultaet von n 4 fak = fak * i; 5 ++i; 6 } solange <Ausdruck> true ergibt: <Anweisung> wird wiederholt ausgeführt falls anfänglich <Ausdruck> false : keine Ausführung kopfgesteuerte Schleife (Quelltext 4.9) Vorsicht Endlossschleifen (Bedingung immer wahr)
While- For- Beispiel: π 18/23 Do While- Syntax: do <Anweisung> while ( <Ausdruck> ); Bsp: (Quelltext 4.10) 1 int n = 10, i = 1, fak = 1; 2 do 3 {//berechnet Fakultaet von n 4 fak = fak * i; 5 ++i; 6 } 7 while ( i < n ); Prüfung der Bedingung nach Durchlauf analog zu while Schleife, außer: <Anweisung> wird immer mindestens einmal ausgeführt fussgesteuerte Schleife
While- For- Beispiel: π 19/23 For- Syntax: for (<Ausdruck1> ; <Ausdruck2> ; <Ausdruck3>) <Anweisung> Äquivalente While-Schleife: <Ausdruck1>; while ( <Ausdruck2> ){ <Anweisung> <Ausdruck3>; } Initialisierung: Abbruchkriterium: Inkrementierung: <Ausdruck1> <Ausdruck2> <Ausdruck3> praktische Abkürzung für häufige form (Quelltext 4.11) insbes. Verwendung bei vorbestimmter Wiederholungsanzahl zählergesteuerte
While- For- Beispiel: π 20/23 Beispiel für for- Bsp. mit for: (Quelltext 4.12) Bsp. mit while: (sh. oben) 1 int n = 10, fak = 1; 2 for ( int i=1; i <= n; i++ ) 3 {//berechnet fakultaet von n 4 fak = fak * i; 5 } 1 int n = 10, i = 1, fak = 1; 2 while ( i <= n ) 3 {//berechnet fakultaet von n 4 fak = fak * i; 5 ++i; 6 } mehrere Ausdrücke anstelle eines Ausdruckes: Kommaoperator Bsp: (i = 1, fak = 1) (Quelltext 4.13)
While- For- Beispiel: π 21/23 Beispielprogramm: numerische Berechnung von π 1 π = 0 4 N 1 + x 2 dx 4 1 + x 2 i=1 i }{{} g(x i ) x mit: x = 1 N, x i = (i 1 2 ) x Pseudocode Kommentar g(x) Festlegen des Parameters N Variable pi zu Null Initialisieren Berechnen von x Schleife mit Zähler i: 1 i N g(x) x Berechnen von xi Berechnen von g(xi ) Addieren von g(xi ) x zu pi Ausgabe von pi x x
While- For- Beispiel: π 22/23 Beispielprogramm: numerische Berechnung von π 1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 5 const int N = 1000;//Anzahl der Stuetzstellen: 6 // hoeherer Wert => hoehere Genauigkeit 7 int main() 8 { 9 double dx, xi, g_xi, pi_approx = 0.0; 10 double pi_ref = M_PI; //Referenzwert, definiert in "cmath" 11 double lgrenze = 0.0, rgrenze = 1.0; //Intervallgrenzen 12 13 dx=(rgrenze-lgrenze)/n; 14 for(int i=1;i<=n;i++) 15 { 16 xi=lgrenze+(i - 0.5)*dx; 17 g_xi=4.0/(1.0+xi*xi); 18 pi_approx = pi_approx + g_xi * dx; //hier Operator += moeglich 19 } 20 cout.precision(15); //Einstellung von 15 Nachkommastellen Ausgabe 21 cout << "pi (approx) = " << pi_approx << endl; 22 cout << "pi (ref) = " << pi_ref << endl; 23 cout.scientific; // Umstellen auf Ausgabe wissenschaftliche Notation 24 cout << "rel. Fehler = " << fabs(pi_approx-pi_ref)/pi_ref << endl; 25 return 0; 26 } (Quelltext 4.14)
23/23 Sprung zu einer markierten Programmzeile: goto Beendigung einer Funktion, Rückkehr: return Beendigung einer for, while, do, switch Anweisung: break Fortführung nächster durchlauf: continue (Quelltext 4.15) Sprünge führen zu unleserlichem Code! Selten notwendig.
1/3 Zusammenfassung Anhang Zusammenfassung Literatur Operatorpriorität Kontrollstrukturen in C++ Auswahlanweisungen: If Else If Else Switch Case Vergleichsoperatoren logische Operatoren : While/Do While For
2/3 Anhang Zusammenfassung Literatur Operatorpriorität Weiterführende Literatur S. Prata, C++ Primer Plus, Sams, 2005 S. Oalline, Practical C++ Programming, O Reilly, 2003 J. Liberty and B. Jones, Teach yourself C++ in 21 days, Sams publishing, 2005 R. Lischner, C++ in a Nutshell, O Reilly, 2003 Handbücher erhältlich am Rechenzentrum: (Weblink) RRZN, Die Programmiersprache C, 17. Auflage, 2008 RRZN, C++ für C Programmierer, 13. Auflage, 2005 Online Dokumentation zum C++ Standard (Weblink) (freie) Microsoft Software für Studenten am KIT: (Weblink)
3/3 Anhang Zusammenfassung Literatur Operatorpriorität Priorität der bisher behandelten Operatoren Priorität Operator Assoziation 1 ++, -- Inkrement/Dekrement (postfix) L R 2 ++, -- Inkrement/Dekrement (prefix) R L +, - Vorzeichen R L! logische Verneinung R L 3 *, /, % Multiplikation, Division, Restwert L R 4 +, - Addition, Subtraktion L R 5 <, <=, >, >= Vergleichsoperatoren (a) L R 6 ==,!= Vergleichsoperatoren (b) L R 7 && logisches und L R 8 logisches oder L R 9 = Zuweisung R L Assoziation: Richtung der Gruppierung bei Mehrfachop. Bsp1: x/y/z äquivalent (x/y)/z Bsp2: x=y=z äquivalent x=(y=z) ( links-nach-rechts ) ( rechts-nach-links )