Dieser Teil führt in die Kontrollstrukturen von C++ ein. Eine Kontrollstruktur definiert, wie die einzelnen Anweisungen ausgeführt werden, z.b.



Ähnliche Dokumente
Einführung in die Programmierung

Vom Problem zum Programm

Einführung in die Programmierung

Angewandte Mathematik und Programmierung

Erwin Grüner

Übersicht Programmablaufsteuerung

Fallunterscheidung: if-statement

Programmieren I. Kontrollstrukturen. Heusch 8 Ratz Institut für Angewandte Informatik

C/C++ Programmierung

Grundlagen der Programmierung Prof. H. Mössenböck. 3. Verzweigungen

Steueranweisungen. Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/

Kontrollstrukturen, Strukturierte Programmierung

Klausur in Programmieren

Projektverwaltung Problem Lösung: Modulare Programmierung

Einführung in die C++ Programmierung für Ingenieure

Java-Programmierung mit NetBeans

Übungen zu C++ Kapitel 1

Informatik Repetitorium SS Volker Jaedicke

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Einführung in die Programmierung (EPR)

25 kann ohne Rest durch 5 geteilt werden! ist wahr

Praktikum Ingenieurinformatik. Termin 2. Verzweigungen (if-else), printf und scanf, while-schleife

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7

5. Tutorium zu Programmieren

Programmierung in C. Grundlagen. Stefan Kallerhoff

Entwurf von Algorithmen - Kontrollstrukturen

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Programmierkurs Java

Einführung in die C-Programmierung

1 Vom Problem zum Programm

Modellierung und Programmierung 1

Hochschule München, FK 03 FA SS Ingenieurinformatik

Kontrollstrukturen und Funktionen in C

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Zum Abschluss wird gezeigt, wie aus einem C++ Quell-Programm ein ausführbares Programm erzeugt wird. 1. Installation von NetBeans...

Übungen Programmieren 1 Felix Rohrer. Übungen

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Zusammengesetzte Datentypen -- Arrays und Strukturen

Einführung in die C++ Programmierung für Ingenieure

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Diana Lange. Generative Gestaltung Operatoren

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

50. Mathematik-Olympiade 2. Stufe (Regionalrunde) Klasse Lösung 10 Punkte

C-Probeklausur (Informatik 1; Umfang: C, Teil 1; SS07)

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

Professionelle Seminare im Bereich MS-Office

Dr. Monika Meiler. Inhalt

Delegatesund Ereignisse

Graphic Coding. Klausur. 9. Februar Kurs A

Zur drittletzten Zeile scrollen

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Einführung in die Java- Programmierung

FB Informatik. Fehler. Testplan

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Repetitionsaufgaben Wurzelgleichungen

2. Semester, 2. Prüfung, Lösung

P r o g r a m m a b l a u f s t e u e r u n g

Grundlagen der Informatik 4. Kontrollstrukturen I

Grundlagen der Informatik 5. Kontrollstrukturen II

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Mathematischer Vorbereitungskurs für Ökonomen

Klausur in Programmieren

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

Anleitung zur Erstellung von Serienbriefen (Word 2003) unter Berücksichtigung von Titeln (wie Dr., Dr. med. usw.)

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Klausur in Programmieren

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Zeichen bei Zahlen entschlüsseln

7 Rechnen mit Polynomen

Tutorium Rechnerorganisation

Whitebox-Tests: Allgemeines

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

PHP 5.4 ISBN Stephan Heller, Andreas Dittfurth 1. Ausgabe, September Grundlagen zur Erstellung dynamischer Webseiten GPHP54

Dokument Lob erstellen

Primzahlen und RSA-Verschlüsselung

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Klausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 13. April 2007, Uhr Bearbeitungszeit: 105 Minuten

Zählen von Objekten einer bestimmten Klasse

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 16

Gliederung Programmiersprachen. Programmiersprachen Einführung in C. Kontrollstrukturen. Verzweigung mit IF. Beispiel: Zahlenklassifizieren

Beispiel(unten ist der Spielfeldrand):

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

Betragsgleichungen und die Methode der Fallunterscheidungen

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Wir arbeiten mit Zufallszahlen

Informatik. Studiengang Chemische Technologie. Michael Roth WS 2012/2013. Hochschule Darmstadt -Fachbereich Informatik-

Zahlenwinkel: Forscherkarte 1. alleine. Zahlenwinkel: Forschertipp 1

Zm Eingewöhnen Aufgabe 1 Schreiben Sie ein Programm, daß Ihren Namen in einem Fenster ausgibt.

Was meinen die Leute eigentlich mit: Grexit?

1 topologisches Sortieren

Excel Funktionen durch eigene Funktionen erweitern.

Erstellen von x-y-diagrammen in OpenOffice.calc

Media Teil III. Begriffe, Definitionen, Übungen

S/W mit PhotoLine. Inhaltsverzeichnis. PhotoLine

Transkript:

Kontrollstrukturen Dieser Teil führt in die Kontrollstrukturen von C++ ein. Eine Kontrollstruktur definiert, wie die einzelnen Anweisungen ausgeführt werden, z.b. sequentiell, bedingt oder wiederholt. Kontrollstrukturen steuern somit den Programmfluss. Den Abschluss bildet die Behandlung von Ausnahmen. Inhalt 1. Anweisungen und Blöcke... 3 1.1. Sequenz... 5 2. Entscheidungen... 7 2.1. if - else... 7 2.2. else if... 12 2.2.1. Fehlerquelle in Verbindung mit if... 14 2.3. Bedingte Bewertung... 15 Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 1/53

2.4. switch - case... 18 3. Schleifen... 21 3.1. while Schleifen... 21 3.2. do while Schleifen... 25 3.3. for Schleifen... 32 3.3.1. Äquivalenz von for und while... 35 3.4. Kommaoperator... 36 3.5. Sprünge... 37 3.5.1. break... 38 3.5.2. continue... 40 3.5.3. goto... 43 4. Ausnahmebehandlung... 46 4.1. Grundidee der Ausnahmebehandlung... 47 4.2. Ablauf im Fehlerfall... 48 4.3. Allgemeine Form... 48 4.4. Ausnahmebehandlung unterschiedlichen Typs... 51 Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 2/53

1. Anweisungen und Blöcke Einfache Anweisungen (statements) werden mit Semikolon abgeschlossen. Die "leere" Anweisung besteht aus nur einem Semikolon. Typische Beispiele: int a, b; // Deklaration von a und b a = b; // Zuweisung Summe = b + c; Zaehler++; // Inkrement-Anweisung push(27); // Funktionsaufruf ; // leere Anweisung Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 3/53

Ein Block (compound statement) ist eine Zusammenfassung von Anweisungen, die in geschweifte Klammern eingeschlossen sind. Die Deklarationen im Block gelten nur innerhalb des Blocks. Ein Block braucht nicht durch ein Semikolon abgeschlossen zu werden. Typische Beispiele: int a=3, b; { int x; // blocklokale Deklaration x = 2; cout >> a*x; if ( a>0 ) { // Block, der nur ausgeführt wird, wenn a>0 a++; cout << a; Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 4/53

1.1. Sequenz Die Anweisungen eines Programms werden in Aufschreibungsreihenfolge durchlaufen. Allgemeine Form: statement1; statement2; Zuerst wird statement1 ausgeführt, danach statement2. Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 5/53

Beispiele: int i; i = 18; i = i -6; cout << i << endl; Durch Flussdiagramme kann der Ablauf eines Programms verdeutlicht werden. Dazu wird jeder Anweisungsform eine Darstellung zugeordnet. Ein Flussdiagramm für eine Sequenz aus zwei Anweisungen ist: statement 1 statement 2 Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 6/53

2. Entscheidungen Soll eine Aktion nur ausgeführt werden, wenn gewisse Bedingungen zutreffen, also Entscheidungen programmiert werden sollen, können Verzweigungen verwendet werden. 2.1. if - else Allgemeine Form: if (expression) statement expression wird ausgewertet. Ist der Wert true, wird statement ausgeführt. if (expression) else statement_true statement_false expression wird ausgewertet. Ist der Wert true, wird statement_true ausgeführt, ansonsten statement_false. Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 7/53

Dieses Verhalten kann durch ein Struktogramm veranschaulicht werden: if (expression) expression else statement_true!= 0 0 statement_false statement_true statement_false Ein Flussdiagramm für diese Entscheidung ist: expression true statement_true false statement_false Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 8/53

Beispiel: $ cat verzweigung.cpp #include <iostream.h> main() { int x; cout << "Eingabe Interger: "; cin >> x; if ( x%2 == 0 ) cout << x << " ist gerade Zahl"; else cout << x << " ist ungerade Zahl"; cout << endl; $ Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 9/53

Das gleiche Programm in einer eher schwer lesbaren Form (besser nicht so programmieren): $ cat verzweigungunleserlich.cpp #include <iostream.h> main() { int x; cout << "Eingabe Interger: "; cin >> x; if (!(x%2) ) cout << x << " ist gerade Zahl"; else cout << x << " ist ungerade Zahl"; cout << endl; $ D.h. if (expression) ist gleichbedeutend mit if (expression!= 0) Anweisungen werden in einem Programm nacheinander hingeschrieben. Werden zwei if- Anweisungen nacheinander benötigt, so muss geregelt werden, zu welchem if ein else gehört. Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 10/53

Regel: Ein else gehört immer zum unmittelbar vorangehenden if; dabei ist die Blockstruktur zu beachten. Beispiel: richtig falsch richtig if (n>0) if (a>b) z = a; else z = b; if (n>0) if (a>b) z = a; else z = b; if (n>0) { if (a>b) z = a; else z = b; Wie sehen für die richtigen Darstellungen die Struktogramme aus? Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 11/53

2.2. else if Mehrfachverzeigungen können mit if-else-ketten programmiert werden. Allgemeine Form: if ( expression_1 ) statement_1 else if ( expression_2 ) statement_2 else if ( expression_3 ) statement_3 else statement_4 Sollte immer verwendet werden (ev. Fehlermeldung)! Beispiel (Notenberechnung): Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 12/53

$ cat mehrfachverzweigung.cpp #include <iostream.h> main() { int punkte; float note; cout << "Eingabe Punkte: "; cin >> punkte; if ( punkte <= 30 ) note = 5.0; else if ( punkte <= 50 ) note = 4.0; else if ( punkte <= 65 ) note = 3.0; else if ( punkte <= 80 ) note = 2.0; else note = 1.0; cout << "Note: " << note << endl; $ $ mehrfachverzweigung Eingabe Punkte: 52 Note: 3 $ Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 13/53

2.2.1. Fehlerquelle in Verbindung mit if Durch die Verwechslung des Vergleichsoperators mit dem Zuweisungsoperators entstehen Fehler: Zuweisung: a ist nun immer gleich b nur wenn b ungleich 0 ist, wird Text ausgegeben if (a = b) cout << a ist gleich b ; Gemeint war: if (a == b) cout << a ist gleich b ; Vergleich Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 14/53

Ein Semikolon zuviel kann bewirken, dass eine Anweisung immer ausgeführt wird: Das Semikolon schließt die if-anweisung ab. Der Text wird unabhängid vom erfüllt sein der Bedingung ausgegeben. if (a == b); cout << a ist gleich b ; 2.3. Bedingte Bewertung Ein Operator, mit dem Entscheidungen in Ausdrücken realisiert werden können ist die "bedingte Bewertung". Allgemeine Form: cond_expr? expression_true : expression_false zuerst wird cond_expr ausgewertet; dann wird in Abhängigkeit des Wertes der expression_true oder expression_false das Resultat des Ausdrucks. Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 15/53

Beispiel: Anweisung Ausdruck if (schaltjahr) tageimfebruar = 29; else tageimfebruar = 28; tageimfebruar = schaltjahr? 29 : 28; Beispiel (Ermittlung Schaltjahr): Ein Jahr ist ein Schaltjahr, wenn es ohne Rest durch 4 teilbar ist. Alle 100 Jahre fällt das Schaltjahr aus, es sei denn, die Jahreszahl ist durch 400 teilbar. Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 16/53

$ cat schaltjahr.cpp #include <iostream.h> main() { int jahr; bool schaltjahr; cout << "Eingabe Jahreszahl: "; cin >> jahr; $ if (jahr%4 == 0) { if (jahr%100 == 0) { if (jahr%400 == 0) { schaltjahr = true; else schaltjahr = false; else schaltjahr = true; else schaltjahr = false; cout << jahr << " ist " << (schaltjahr? "ein" : "kein") << " Schaltjahr." << endl; $ schaltjahr Eingabe Jahreszahl: 1996 1996 ist ein Schaltjahr. $ schaltjahr Eingabe Jahreszahl: 2000 2000 ist ein Schaltjahr. $ schaltjahr Eingabe Jahreszahl: 1900 1900 ist kein Schaltjahr. Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 17/53 $

2.4. switch - case Fallunterscheidungen können mittels der switch-anweisung realisiert werden. Allgemeine Form: switch ( expression ) { case const1: statements1 case const2: statements2 default: statements3 expression wird ausgewertet und zu der Stelle consti gesprungen, die mit dem expression-wert übereinstimmt, bzw. zu default, wenn es keine Übereinstimmung gibt. Bei reinen Fallunterscheidungen ist die letzte Anweisung von statement eine break- Anweisung, die bewirkt, dass das switch-statement terminiert. Dieses Verhalten kann durch ein Struktogramm veranschaulicht werden: Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 18/53

switch (expression) { case const1: statement1; break; case const2: statement2; break; case const3: statement3; break; default: statement4; c1 c2 c3 statement1 statement2 statement3 expression statement4 Beispiel (römische Ziffern): Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 19/53

$ cat switch.cpp #include <iostream.h> int main() { int a; char c; cout << "Zeichen: "; cin >> c; $ switch Zeichen: M $ switch(c) { case 'I' : a=1; break; case 'V' : a=5; break; case 'X' : a=10; break; case 'L' : a=50; break; case 'C' : a=100; break; case 'D' : a=500; break; case 'M' : a=1000; break; default : a=0; if (a > 0) cout << a; else cout <<"keine römische Ziffer!"; cout << endl; 1000 $ Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 20/53

3. Schleifen Sollen Aufgaben wiederholt ausgeführt werden, sind Schleifen-Anweisungen in C++ zu verwenden. Unterschieden werden mehrere Arten von Schleifen: Schleifen mit abweisendem Charakter (Prüfung bevor Aktionen ausgeführt werden), Schleifen mit nicht abweisendem Charakter und Schleifen, bei denen die Schrittweite vorher feststeht. 3.1. while Schleifen Eine Schleife mit abweisendem Charakter ist die while Schleife. Allgemeine Form: while ( expression ) statement Zuerst wird die Bedingung expression geprüft; ist sie zu true auswertbar, wird statement ausgeführt. Dann wird expression wieder geprüft. Also wird statement solange ausgeführt, bis expression false ist. Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 21/53

Das Struktogramm der Schleife: expression statement Das Verhalten einer Schleife lässt sich durch ein Flussdiagramm veranschaulichen: expression true statement false Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 22/53

Beispiel Aufgabe: Addieren einer einzulesende Folge von Zahlen mit Endemarke 0. $ cat aditionvonzahlenfolge.cpp #include <iostream.h> int main() { int eingabe=-1; int summe=0; while (eingabe!= 0) { cout << "Integer: "; cin >> eingabe; summe = summe + eingabe; $ aditionvonzahlenfolge.exe Integer: 1 Integer: 2 Integer: 3 Integer: 4 Integer: 5 Integer: 0 Summe:15 $ $ cout <<"Summe:" << summe << endl; Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 23/53

Achtung: Wenn man Schleifen verwendet, können leicht Programme entstehen, die nicht terminieren! Der Programmierfehler ist dann, dass man im Schleifenrumpf nicht dafür sorgt, dass die Schleifenbedingung jemals zu false auswertbar ist. Beispiel (Berechnung Quadratzahlen): $ cat unendlichschleife.cpp #include <iostream.h> main() { int i; cout << "Integer eingeben: "; cin >> i; while (i*i > 0) { cout << "i*i=" << i*i << endl; i--; $ Für welche Eingaben terminiert das Programm nicht? Hörsaalübung: Erweitern Sie das o.a. Programm, so dass es immer terminiert. Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 24/53

3.2. do while Schleifen Bei dieser Schleifenart wird zuerst eine Anweisung ausgeführt und erst danach geprüft, ob sie nochmals ausgeführt werden soll. Allgemeine Form: do statement while (expression) Zuerst wird wird statement ausgeführt. Dann wird die Bedingung expression geprüft; ist sie zu true auswertbar dann wird statement wieder ausgeführt. Das Struktogramm der Schleife: statement expression Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 25/53

Das Verhalten dieser Schleifenart lässt sich durch folgendes Flussdiagramm veranschaulichen: statement expression true false Eine do while Schleife kann stets in eine while Schleife umgeformt werden: do { statement while (expression); statement; while (expression) { statement; Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 26/53

Beispiel (Dialog, um nur Werte innerhalb eines gewünschten Bereichs zu erlauben): $ cat dowhile.cpp #include <iostream.h> main() { const double Minimum = 3; const double Maximum = 27; double Wert; do { // Dialog cout << "Bitte geben Sie einen Wert im Bereich " << Minimum << ".." << Maximum << " ein: "; cin >> Wert; while (Wert < Minimum Wert > Maximum); $ // Berechnung mit Wert im gültigen Bereich cout << "Wurzel von " << Wert << " ist " << sqrt(wert) << endl; $ dowhile Bitte geben Sie einen Wert im Bereich 3..27 ein: 1 Bitte geben Sie einen Wert im Bereich 3..27 ein: 3 Wurzel von 3 ist 1.73205 $ Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 27/53

Die bisherigen Kontrollstrukturen lassen sich auch Kombinieren, so ist z.b. auch eine Schleife in einer Schleife möglich. Beispiel (von Aufgabe über Flussdiagramm zum Programm) Aufgabe: Von dem Zahlenbereich 1 bis 9 soll für jede Zahl die Fakultät berechnet und ausgegeben werden. Verfahren: Ausgabe von n! für n zwischen 1 und 9 wobei n! := 1*2*3* *n. Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 28/53

Flußgramm: Start unten=1 oben=9 i=1 i<=oben true fak=1 j=1 berechen Fakultät von i false j<=i true fak=fak*j j=j+1 false print fak i=i+1 Ende Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 29/53

Programm: $ cat fakultaet.cpp #include <iostream.h> main() { const int unteregrenze=1; const int oberegrenze=9; int i=unteregrenze; $ while (i <= oberegrenze) { unsigned long fak = 1; int j = 1; while (j <= i) { fak = fak*j; j++; cout << "fak(" << i << ") = " << fak << endl; i++; // für alle Zahlen im Bereich // berechne Fakultät von i // Ausgabe Fakultät von i // nächste Zahl im Bereich Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 30/53

Hörsaalübung Entwickeln Sie ein Programm (maxminvonfloateingabe.cpp), das eine Folge von float-werten zwischen 10 und 1000 einliest und das Maximum und das Minimum ermittelt und ausgibt. Abbruchbedingung ist, dass ein negativer Wert eingegeben wird. Vorgehen: 1. Flussdiagramm durch Sie 2. C++ Kode von Ihnen 3. Vorführung an der Tafel durch Sie 4. Test und Bewertung durch mich Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 31/53

3.3. for Schleifen Steht die Anzahl der Wiederholungen vorher fest oder hat man feste Schrittweiten, so wird häufig die for Schleife eingesetzt. Allgemeine Form: for (init_stat; expression; step_stat) statement Zuerst wird init_stat ausgeführt; dabei werden i.a. Initialisierungen vorgenommen. Dann wird die Bedingung expression geprüft; ist sie zu true auswertbar dann wird statement wieder ausgeführt danach step_stat. Das Verhalten dieser Schleifenart lässt sich durch folgendes Flussdiagramm veranschaulichen: init_stat step_stat expression true statement false Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 32/53

Das Struktogramm dazu: init_stat expression statement step_stat Beispiel (ASCII Tabelle ausgeben): $ cat ascii.cpp #include <iostream.h> main() { const int unteregrenze=65; const int oberegrenze=70; $ for (int i = unteregrenze; i <= oberegrenze; i++) cout << i << " " << char(i) << endl; $ ascii 65 A 66 B 67 C 68 D 69 E 70 F $ Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 33/53

Achtung: Die Variable i kann nicht außerhalb des Schleifenrumpfs verwendet werden! Ältere Compiler erlauben dies zwar, Sie sollten dies dann trotzdem nicht verwenden, da diese Programme nicht portierbar sind, wenn in der Zielumgebung neue Compiler verwendet werden! $ cat ascii.cpp #include <iostream.h> main() { const int unteregrenze=65; const int oberegrenze=70; for (int i = unteregrenze; i <= oberegrenze; i++) cout << i << " " << char(i) << endl; cout << i << " " << endl; $ make ascii g++ ascii.cpp -o ascii ascii.cpp: In function `int main()': ascii.cpp:9: name lookup of `i' changed for new ANSI `for' scoping ascii.cpp:6: using obsolete binding at `i' make: *** [ascii] Error 1 $ Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 34/53

3.3.1. Äquivalenz von for und while Eine for Schleife entspricht einer while Schleife; es handelt sich eigentlich nur um eine Umformulierung, solange nicht continue (-> nächster Abschnitt) vorkommt. for (init_stat; expression; step_stat) statement init_stat; while (expression) { statement; step_stat; Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 35/53

3.4. Kommaoperator Der Kommaoperator wird meist in for Schleifen verwendet, um die Bewertungsreihenfolge festzulegen und den Resultatstyp zu bestimmen. Allgemeine Form: expr1, expr2 Zuerst wird expr1, dann expr2 bewertet. Das Resultat hat den Typ von expr2. Beispiel (Summe von 1 bis 10): #include <iostream.h> main() { int i, sum; kein Kommaoperator Kommaoperator for (i=1, sum=0; i<=10; sum += i, i++); cout << "Summe von 1 bis 10 ist " << sum << endl; Kommaoperator Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 36/53

Welche Ausgabe hat das foldende Program: #include <iostream> using namespace std; int main() { int x=1, y=2; cout << (x,y) << endl; Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 37/53

3.5. Sprünge Sprünge zu bestimmten Stellen im Programm sind ein Relikt aus der systemnahem Programmierung und haben in Hochsprachen in unterschiedlicher Form Einzug gehalten: kontrolliertes Verlassen von Schleifen (oft sinnvoll einsetzbar!) Sprünge zu definierbaren Marken (meist schlechter Programmierstil!) 3.5.1. break break haben wir bereits zum Verlassen von switch-alternativen gesehen. break in einer Schleife bewirkt, dass die Schleife verlassen wird. Allgemeine Form: break Die umgebene Schleife wird verlassen. Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 38/53

Verdeutlichung: while ( expression2 ) { statement1 if ( expression1 ) break; statement2 statement3 Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 39/53

3.5.2. continue Durch continue wird in Schleifen zur erneuten Überprüfung der Bedingung gesprungen. Allgemeine Form: continue Die Bedingung der Schleife wird erneut geprüft. Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 40/53

Verdeutlichung: while ( expression2 ) { statement1 if ( expression1 ) continue; statement2 statement3 Beispiel (Menü, das nur gezielt verlassen werden kann): Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 41/53

$ cat menue.cpp #include <iostream.h> #include <stdlib.h> main() { char auswahl, dummy; while (true) { system("clear"); cout << "u Uhrzeit" << endl; cout << "x Beenden" << endl; cout << "Wählen Sie: "; cin >> auswahl; $ if (auswahl == 'u') { // clear screen // Lesen Benutzereingabe // Menuepunkt Uhrzeit system("date"); cout << "Weiter mit bel. Zeichen und RETURN "; cin >> dummy; continue; if (auswahl == 'x') // Menuepunkt Beenden break; cout << "Falslche Ausgabe, bitte wiederholen" << endl; cout << "Weiter mit bel. Zeichen und RETURN "; cin >> dummy; cout << "Auf Wiedersehen!" << endl; Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 42/53

3.5.3. goto Mit der Anweisung goto kann zu einer beliebigen Marke gesprungen werden. Eine Marke muss dabei vorher definiert worden sein. Allgemeine Form der Markendefinition: name: name ist der Name einer Marke. Allgemeine Form der Sprungs: goto name Das Programm verzweigt zum Sprungziel, das durch name definiert ist. Bemerkung: Beim Programmieren kann immer auf goto verzichtet werden. Es gibt nur einige wenige Ausnahmen (im Bereich systemnahe Programmierung und Programmierung von Echtzeitanwendungen), bei denen goto sinnvoll einsetzbar ist. Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 43/53

for ( ) for ( ) for ( ) if (Katastrophe) goto fhelerbehebung; fehlerbehebung: um aus sehr tiefen Verschachtelungen sehr schnelle (zur Ausführungszeit) heraus zu kommen, kann es sinnvoll sein, ein goto zu verwenden (in C, in C++ gibt es bessere Alternative vgl. 4). Normalerweise sollte stets auf gotos verzichtet werden, da die Programme fehleranfällig und schwer wartbar bzw. erweiterbar sind! Im Praktikum sind gotos verboten! Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 44/53

Wie kann das nachfolgende Programm abgeändert werden, so dass anstelle einer while-schleife eine Marke und eine goto-anweisung verwendet werden? #include <iostream> using namespace std; int main() { int x; cin >> x; while (x) { cout << x*x << endl; x--; Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 45/53

4. Ausnahmebehandlung In Anwendungen tritt manchmal ein Fehler auf, d.h. das Programm macht nicht das, was der Benutzer eigentlich erwartet. Dabei sind folgende Fehlerarten unterscheidbar: 1. Bedienungsfehler der Benutzer verwendet das Programm nicht im Sinne der Bedienungsanleitung 2. Programmfehler im Programm wird nicht gemäß der Spezifikation reagiert 3. Umgebungsfehler der korrekte Ablauf des Programms kann nicht sichergestellt werden, weil die Umgebung nicht die Anforderungen erfüllt (Speicher, Plattenplatz etc) Je nach Fehlerart sind die Reaktionen und Fehlermeldungen unterschiedlich. Bedienfehler dürfen nie Programmabbrüche hervorrufen. Fehlbedienungen müssen dem Benutzer verständlich per Programm erläutert werden (vgl. letztes Menu). Programmierfehler müssen vom Programmierer behoben werden. Umgebungsfehler sollten nicht zu Programmabbrüchen führen dies kann aber nicht immer vermieden werden. Fehlbedienungen müssen einem Anwender verständlich per Programm erläutert werden. Um das o.a. Verhalten zu erreichen ist neben sauberem Programmentwurf und sorgfältigem Testen das Konzept der Ausnahmebehandlung einzusetzen. Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 46/53

4.1. Grundidee der Ausnahmebehandlung Ein Programm soll so strukturiert werden, dass es getrennte Bereiche im Kode gibt für o den normalen Ablauf und o den Ausnahmefall bzw. den Fehlerfall und kritische Bereiche besonders gekennzeichnet werden. Der kritische Programmblock wird versuchsweise ausgeführt: im Fehlerfall wird der normale Ablauf unterbrochen und zum Fehlerbehandlungsblock gesprungen ( Fehler goto ); tritt kein Fehler ein, wird der normale Ablauf bis zum Ende ausgeführt und der Fehlerblock ignoriert. Im Fehlerfall wird dabei ein Ausnahmeobjekt erzeugt, das im Fehlerbehandlungsblock auswertbar ist und Daten enthält, die zum Wiederaufsetzen oder zu Fehlermeldungen verwendbar sind. Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 47/53

4.2. Ablauf im Fehlerfall Der Ablauf kann wie folgt charakterisiert werden: 1. Eine Funktion (bis jetzt main) versucht (engl. try) den kritischen Block auszuführen. 2. Wenn ein Fehler festgestellt wird, wirft (engl. throw) sie eine Ausnahme (engl. exception) aus. 3. Die Ausnahme wird vom Fehlerbehandlungsblock aufgefangen (engl. catch). 4.3. Allgemeine Form Das folgende Schema zeigt, wie dies in C++ notiert wird: Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 48/53

// Programmcode // Programmcode unkritischer Bereich // Programmcode try { // Programmcode if (FehlerAufgetreten) throw "Info"; // Programmcode kritischer Bereich if (andererfehler) throw "andere Info"; // Programmcode catch (const char* Text) { // ggfs. Reparatur- // und Aufräumarbeiten Bereich der Fehlerbehandlung cout << Text << endl; if-abfrage auf Fehlerbedingung mit throw-anweisung an beliebiger Stelle im "normalen" Programmablauf throw kann Objekt eines beliebigen Datentyps auswerfen Sprung zu nächster passender catch-anweisung Auswahl anhand des Datentyps des Ausnahmeobjekts der Rest des "normalen" Ablaufs wird übersprungen Programmabbruch falls kein passender catch-block existiert Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 49/53

Beispiel (Wurzel einer negativen Zahl): #include <iostream.h> main() { float zahl; cout << "positive Zahl eingeben: "; try { cin >> zahl; if (zahl < 0) throw "keine positive Zahl!"; cout << "Wurzel von " << zahl << " ist " << sqrt(zahl) << endl; catch (const char * text) { cout << "Fehler: " << text << endl; $ try01 positive Zahl eingeben: 5 Wurzel von 5 ist 2.23607 $ $ try01 positive Zahl eingeben: -2 Fehler: keine positive Zahl! $ Bei Eingabe von -2 wird die Ausnahme keine positive Zahl geworfen und in den catch-block gesprungen. Mit dieser Technik ist eine bessere Alternative zu goto verwendbar, wenn aus tief verschachtelten Schleifen heraus eine Ausnahmebehandlung schnell aktiviert werden muss (vgl. goto sinnvoll ). Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 50/53

4.4. Ausnahmebehandlung unterschiedlichen Typs In einem try-block können unterschiedliche Ausnahmen geworfen werden, für jeden Datentyp aber höchstens eine. Dabei wird der erste passende catch-block ausgeführt: die Auswahl erfolgt anhand des Datentyps des Ausnahmeobjekts das Sprungziel ist durch den Datentyp definiert; wenn kein passender catch-block gefunden wird, wird in der Schachtelungsebene höher gesucht, bis einer gefunden wird oder falls keiner vorhanden ist, wird das Programm beendet. Dies ermöglicht eine differenzierte Fehlerbehandlung. Beispiel (unterschiedliche catch-blöcke): Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 51/53

#include <iostream.h> main() { const int maxvalue = 100; int zahl1, zahl2, ergebnis; cout << "2 Zahl eingeben: "; try { cin >> zahl1 >> zahl2; if (zahl1 > maxvalue) throw zahl1 - maxvalue; if (zahl2 > maxvalue) throw zahl2 - maxvalue; if (zahl2 == 0) throw "Nulldivision nicht möglich"; ergebnis = zahl1 / zahl2; cout << zahl1 << " / " << zahl2 << " = " << ergebnis << endl; catch (const int wert) { cout << "Fehler: Wert um " << wert << " zu gross!" << endl; catch (const char * text) { cout << "Fehler: " << text << endl; Auf die Problematik der Ausnahmebehandlung wird nochmals eingegangen, wenn die Sprachkonstrukte Funktion und Klasse bekannt sind. $ try02 2 Zahl eingeben: 18 6 18 / 6 = 3 $ try02 2 Zahl eingeben: 18 0 Fehler: Nulldivision nicht möglich $ try02 2 Zahl eingeben: 18 1001 Fehler: Wert um 901 zu gross! Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 52/53

Hörsaalübung Schreiben Sie ein C++-Programm, das Ihre Matrikel-Nummer einliest und deren Quersumme berechnet! Verwenden Sie Ausnahmebehandlungen, wenn eine ungültige Matrikelnummer eingegeben wurde (1<=MatrNr<=999999). Beispiel: Mat-Nr: 123123 Quersumme: 12 Programmieren I: Kontrollstrukturen.doc Prof. Dr. Alois Schütte 53/53