Seite 1 Einführung in die Programmierung mit C++ Teil II - Einführung in die strukturierte Programmierung 5. Kontrollstrukturen C++ Einführungskurs – 15.10.2007 – http://wiki.kip.uni-heidelberg.de/ti/Informatik-Vorkurs Anweisungen © TI Uni-HD Alle Rechte vorbehalten Seite 2 • leere Anweisung ; • zusammengesetzte Anweisung, Anweisungsblock { Anweisung; .. } • nach jeder einzelnen Anweisung folgt ein Strichpunkt • nach einem Anweisungsblock folgt kein Strichpunkt • Anweisungen in einem Block werden sequentiell abgearbeitet • Abarbeitung beginnt mit der ersten Anweisung des main-Blocks C++ Einführungskurs – 15.10.2007 – http://wiki.kip.uni-heidelberg.de/ti/Informatik-Vorkurs © TI Uni-HD Alle Rechte vorbehalten 1 Bedingte Anweisungen I Seite 3 • einfache Bedingungsabfrage if ( Ausdruck ) Anweisung; • wenn Ausdruck wahr dann Ausführung von Anweisung • C++ interpretiert jeden Wert ungleich 0 als wahr • Anweisungen können immer mitsamt Strichpunkt durch einen Block ersetzt werden if ( Ausdruck ) { Anweisung; .. } C++ Einführungskurs – 15.10.2007 – http://wiki.kip.uni-heidelberg.de/ti/Informatik-Vorkurs © TI Uni-HD Alle Rechte vorbehalten Bedingte Anweisungen II Seite 4 • Bedingungsabfrage mit Alternative if ( Ausdruck ) Anweisung_1; else Anweisung_2; • wenn Ausdruck wahr dann Ausführung von Anweisung_1, sonst Anweisung_2 • Vorsicht bei Schachtelung von if-else: Zugehörigkeit von else beachten! if ( Ausdruck_1 ) if ( Ausdruck_2 ) Anweisung_1; else Anweisung_2; Anweisung_3; oder? if ( Ausdruck_1 ) if ( Ausdruck_2 ) Anweisung_1; else Anweisung_2; Anweisung_3; • besser: geschweifte Klammern benutzen C++ Einführungskurs – 15.10.2007 – http://wiki.kip.uni-heidelberg.de/ti/Informatik-Vorkurs © TI Uni-HD Alle Rechte vorbehalten 2 Bedingte Anweisungen III Seite 5 • Mehrfachverzweigung switch ( Ausdruck ) { case Konstante_1: Anweisung_1_1; .. break; case Konstante_2: Anweisung_2_1; .. break; .. default: Anweisung_x_1; .. } C++ Einführungskurs – 15.10.2007 – http://wiki.kip.uni-heidelberg.de/ti/Informatik-Vorkurs © TI Uni-HD Alle Rechte vorbehalten Bedingte Anweisungen IV Seite 6 • zunächst Auswertung von Ausdruck • ergibt sich Ausdruck zu einer der Konstanten eines case-Zweiges dann Abarbeitung der darauf folgenden Anweisungen bis zur nächsten break-Anweisung • steht zwischen case-Zweigen kein break dann wird Abarbeitung einfach fortgesetzt! case-Zweige immer mit break beenden! • wir kein passender case-Zweig gefunden dann wird default-Zweig gewählt • default-Zweig ist optional C++ Einführungskurs – 15.10.2007 – http://wiki.kip.uni-heidelberg.de/ti/Informatik-Vorkurs © TI Uni-HD Alle Rechte vorbehalten 3 Schleifen I Seite 7 • kopfgesteuerte Schleife mit einfacher Bedingung while ( Ausdruck ) Anweisung; • so lange Ausdruck wahr ist wird Anweisung ausgeführt • wenn Anweisung nicht dazu führt, daß Ausdruck irgendwann falsch wird, dann Endlosschleife! C++ Einführungskurs – 15.10.2007 – http://wiki.kip.uni-heidelberg.de/ti/Informatik-Vorkurs Schleifen II © TI Uni-HD Alle Rechte vorbehalten Seite 8 • fußgesteuerte Schleife mit einfacher Bedingung do Anweisung; while ( Ausdruck ); • Anweisung wird mindestens einmal ausgeführt • so lange Ausdruck wahr ist wird Anweisung wiederholt ausgeführt C++ Einführungskurs – 15.10.2007 – http://wiki.kip.uni-heidelberg.de/ti/Informatik-Vorkurs © TI Uni-HD Alle Rechte vorbehalten 4 Schleifen III Seite 9 • flexible Schleife for ( Initialisierung; Bedingung; Inkrement ) Anweisung; • zunächst Ausführung von Initialisierung • so lange Bedingung wahr ist wird jedesmal zuerst Anweisung dann Inkrement ausgeführt • Beispiel const int groesse = 256; int feld[groesse]; for ( int i = 0; i < groesse; ++i ) feld[i] = 2 * i; C++ Einführungskurs – 15.10.2007 – http://wiki.kip.uni-heidelberg.de/ti/Informatik-Vorkurs © TI Uni-HD Alle Rechte vorbehalten Schleifen IV Seite 10 • frühzeitiges Fortsetzen while ( Ausdruck_1 ) { Anweisung_1; if ( Ausdruck_2 ) continue; Anweisung_2; } • wenn Ausdruck_2 wahr dann wird sofort mit nächstem Schleifendurchlauf begonnen; Anweisung_2 wird nicht ausgeführt • continue kann in allen Schleifentypen eingesetzt werden • bei geschachtelten Schleifen wird nur diejenige Schleife neu begonnen in deren unmittelbaren Kontext die entsprechende continue-Anweisung auftritt C++ Einführungskurs – 15.10.2007 – http://wiki.kip.uni-heidelberg.de/ti/Informatik-Vorkurs © TI Uni-HD Alle Rechte vorbehalten 5 Schleifen V Seite 11 • frühzeitiges Beenden while ( Ausdruck_1 ) { Anweisung_1; if ( Ausdruck_2 ) break; Anweisung_2; } • wenn Ausdruck_2 wahr dann wird Schleife sofort beendet, Anweisung_2 wird nicht ausgeführt • break kann in allen Schleifentypen eingesetzt werden • bei geschachtelten Schleifen wird nur diejenige Schleife beendet, in deren unmittelbaren Kontext die entsprechende break-Anweisung auftritt C++ Einführungskurs – 15.10.2007 – http://wiki.kip.uni-heidelberg.de/ti/Informatik-Vorkurs © TI Uni-HD Alle Rechte vorbehalten Sprünge Seite 12 • direkter Sprung Anweisung_1; goto Label; Anweisung_2; Label: Anweisung_3; • nach Anweisung_1 wird das Programm bei Label fortgesetzt, Anweisung_2 wird übersprungen und direkt Anweisung_3 ausgeführt • für Namen von Sprungzielen gelten selbe Regeln wie für andere Namen auch • Einsatz von goto führt sehr leicht zu unübersichtlichen, schlecht strukturierten Programmen und läßt sich selten rechtfertigen C++ Einführungskurs – 15.10.2007 – http://wiki.kip.uni-heidelberg.de/ti/Informatik-Vorkurs © TI Uni-HD Alle Rechte vorbehalten 6 Beispiel I Seite 13 • Vokale zählen #include <iostream> int main() { char buffer[256]; int a = 0, e = 0, i = 0, o = 0, u = 0, n = 0; std::cout << "Gib ein Wort ein: "; std::cin >> buffer; while ( buffer[n] != '\0' ) { // '\0' ist Ende-Zeichen switch ( buffer[n++] ) { case 'a': case 'A': a++; break; case 'e': case 'E': e++; break; case 'i': case 'I': i++; break; case 'o': case 'O': o++; break; case 'u': case 'U': u++; break; } } std::cout << a << " as, " << e << " es, " << i << " is, " << o << " os, " << u << " us" << std::endl; return 0; } C++ Einführungskurs – 15.10.2007 – http://wiki.kip.uni-heidelberg.de/ti/Informatik-Vorkurs © TI Uni-HD Alle Rechte vorbehalten Beispiel II Seite 14 • Feld sortieren #include <iostream> int main() { const int groesse = 10; int feld[groesse] = { 42, 1, 23, 7, 15, 11, 8, 99, 34, 0 }; // Feld sortieren for ( int i = 0; i < groesse - 1; ++i ) for ( int k = i + 1; k < groesse; ++k ) if ( feld[k] < feld[i] ) { int copy = feld[k]; feld[k] = feld[i]; feld[i] = copy; } // Feld ausgeben for ( int i = 0; i < groesse; ++i ) if ( i < groesse - 1 ) std::cout << feld[i] << ", "; else std::cout << feld[i] << std::endl; return 0; } C++ Einführungskurs – 15.10.2007 – http://wiki.kip.uni-heidelberg.de/ti/Informatik-Vorkurs © TI Uni-HD Alle Rechte vorbehalten 7