Kap 4. Befehle und Struktogramme 4.1 Elementare Befehle Befehlstypen Beispiel aus dem Musterprogramm Zuweisung (eigentlich kein Befehl) x=a; Verzweigung Wiederholung/Schleife Block (zusammengesetzt) if ( a<=0 )// unzulaessige Eingabe while ( abs (x*x-a)>genauigkeit ) { } Ein-/Ausgabe (eigentlich kein Befehl) cin>>a; cout <<"\n a muss > 0 sein "; Sowohl Zuweisung als auch Ein-/Ausgabe sind Ausdrücke mit einem Wert !!! Operand Operator Operand x = a cin >> a Dr. Norbert Spangler / Programmieren I 25.10.2015 2 Elementare Befehle Die elementaren "Befehle" sind also Verzweigung Fallunterscheidungen Schleife Wiederholungen Block Ein Block ist aus anderen Befehlen zusammengesetzt „Ausdrücke“ wie Zuweisung oder Ein-/Ausgabe Anmerkung: Es kann jeder Ausdruck hingeschrieben werden also auch 1; a<5; In der Regel macht dies keinen Sinn. Dr. Norbert Spangler / Programmieren I 25.10.2015 3 4.2 Grafische Darstellung Zur Verdeutlichung der Logik eines Programmes sind grafische Darstellungen sehr hilfreich. Hierzu gibt es eine Reihe von Möglichkeiten und Tools: Flußdiagramme Struktogramme (*) UML (Unified Modeling Language) -> in P2 Ziele sind u.a. eine bessere Darstellung komplexer Abläufe Unterstützung bei der Entwicklung Dokumentation des Programms Dr. Norbert Spangler / Programmieren I 25.10.2015 4 Grafische Darstellung des Programmablaufs/Flussdiagramm Start a lesen a<= 0 nein Flußdiagramme sind einfach zu verstehen, werden aber schnell unübersichtlich. ja a unzulässig x=a Es gibt nur wenige (kleine) Symbole x=x-… nein Ergebn is genau ja Ergebnis ausgeben Ende Dr. Norbert Spangler / Programmieren I 25.10.2015 5 Grafische Darstellung des Programmablaufs/Struktogramm Struktogramme unterstützen sehr gut die Entwicklung komplexer Abläufe und sind daher eher ein Mittel zur Unterstützung des Entwurfs und nicht zur Dokumentation. Es gibt nur wenige Symbole und daher ist diese Technik sehr einfach. Sie sind ab sofort zu jedem Programm anzufertigen und vor Beginn des Praktikums zusammen mit dem Testplan abzugeben. Dr. Norbert Spangler / Programmieren I Wurzel berechnen Eingabe a a <= 0 Ja a muss >0 sein Nein x=a Solangex*x-a ungenau x*x-a x = x - ------2x Ausgabe x 25.10.2015 6 Grafische Darstellung des Programmablaufs/UML UML Unified Modeling Language Ist eine Sprache für die Modellierung von Programmen mit grafischen Symbolen für die verwendeten Begriffe. UML ist wesentlich komplexer (es gibt 13 Diagrammtypen) als die bisher genannten Beispiele und wird in späteren Vorlesungen angesprochen. Beispiele siehe unten (Quelle: Wikipedia) Dr. Norbert Spangler / Programmieren I 25.10.2015 7 4.3 Blöcke und Gültigkeitsbereiche Ein Block ist die Zusammenfassung mehrerer Befehle mittels eines Paars geschweifter Klammern: { hier kommen die Befehle des Blocks } Ein Block ist praktisch eine Aggregation von Befehlen zu „einem Befehl“. Er wird immer dort verwendet, wo nur ein Befehl stehen soll, wo man aber mehrere Befehle ausführen möchte. Dies wird in der Regel bei den Wiederholungen und Verzweigungen der Fall sein. Dr. Norbert Spangler / Programmieren I 25.10.2015 8 Gültigkeitsbereich In einem Block dürfen auch Variable deklariert werden, welche dann aber nur in diesem Block verwendet werden können! Unter dem Gültigkeitsbereich einer Variablen versteht man daher den Programmabschnitt, wo die Variable bekannt ist und wo sie verwendet werden kann. Der Bereich beginnt mit der Stelle innerhalb des Blocks, wo sie deklariert wird und endet am Ende dieses Blocks. Nach Beendigung des Blocks existiert diese Variable nicht mehr. Ihr Speicherplatz ist freigegeben. Derartige Variable nennt man lokale Variable. Sie sind im Stack abgelegt. { … Deklaration z.B. int i Gültigkeitsbereich } Dr. Norbert Spangler / Programmieren I 25.10.2015 9 Gültigkeitsbereich/globale Variable Globale Variable müssen außerhalb von geschweiften Klammern deklariert werden, also vor dem Programm. Damit sind sie überall bekannt, d.h. in jedem Block. // lokal/global #include <iostream> using namespace std; int i=2; void main() { int j=1; { int k=2; } } Globale Variable Lokale Variable Weil globale Variable überall bekannt sind und überall damit geändert werden können stellen sie ein Risiko dar und sollten üblicherweise nicht verwendet werden. Ausnahme etwa: globale Konstanten Dr. Norbert Spangler / Programmieren I 25.10.2015 10 Gültigkeitsbereich/Beispiel Der Name der Variablen // lokal/global #include <iostream> kann auch dem einer using namespace std; Variablen gleich sein, die int i=2;//global schon vorher deklariert void main() wurde. Damit "überdeckt { diese Variable die vorher int j=1;//Block 1 { deklarierte, solange man sich int j=2;//Block 2 in dem entsprechenden cout << i << j << endl; Gültigkeitsbereich im Block } befindet. cout << i << j << endl; } Was wird ausgegeben? Dr. Norbert Spangler / Programmieren I 25.10.2015 11 4.4 Zuweisungen Zuweisung sind aus Kapitel 3 bekannt. Sie stellen eigentlich einen Ausdruck dar !!! Beispiel flaeche=r*r*3.14159; i = i+1; Bzw. auch i+=1;//zusammengesetzte Zuweisung Aufbau Variable = Ausdruck L-Wert = R-Wert bzw. Variable op= Ausdruck Die Zuweisung ist ein Ausdruck der Form Operand – Operator – Operand. Der Wert des Ausdrucks ist der R-Wert. Dr. Norbert Spangler / Programmieren I 25.10.2015 12 Zuweisungen/Struktogramm flaeche = r*r*3.14159 Symbol: Rechteck !!!!!!! flaeche = r2*pi Inhalte sind beliebig zu beschreiben. Es muss kein C++ Code sein. Es kann also auch r2*π da stehen. x2 − a x = x− 2x C++ Code sollte aber daraus direkt ableitbar sein Anmerkung: Das Rechtecksymbol ist das allgemeine Symbol innerhalb der Struktogramme. Es kann jeder Befehl hineingeschrieben werden. Dr. Norbert Spangler / Programmieren I 25.10.2015 13 Sequenz i = i+1 j+=2 Ausgabe i und j Es dürfen auch mehrere Befehle in ein Rechteck, bzw. ein Block i = i+1 j+=2 Mehrere Rechtecke können direkt untereinander sein. Dies wird dann auch als Sequenz bezeichnet. Ausgabe i und j Dr. Norbert Spangler / Programmieren I 25.10.2015 14 4.5 Verzweigungen Verzweigungen dienen zur Fallunterscheidung, d.h. in Abhängigkeit von einer Bedingung (=boolscher Ausdruck mit dem Wert wahr oder falsch ) soll zwischen verschiedenen Möglichkeiten der weiteren Befehlsausführung entschieden werden wie z.B. - beim Wurzelziehen (Radikand <0 ) - beim Suchen ( Vergleich mit dem gesuchten Element) - bei der Eingabe (zulässig ja/nein). - Menue: der Anwender kann aus einer Reihe von Aktionen auswählen Es gibt 3 Arten von Verzweigungen Verzweigungen mit if-else switch Auswahloperator ? Dr. Norbert Spangler / Programmieren I 25.10.2015 15 Verzweigung mit if – else : Beispiele if ( x<y ) minimum=x; else minimum=y; cout<<minimum; Einrücken und Klammern if/else stehen in derselben Spalte. Die Klammern sollten auf Höhe von if / else stehen if ( x<y ) {//if-Block Die Befehle (des Blocks) im minimum=x; cout<<" das Minimum ist x"<<endl; if- bzw. else-Zweig sollten stets eingerückt werden: z.B. 4 Positionen } else {//else-Block minimum=y; cout<<" das Minimum ist y"<<endl; } cout<< “ Der Wert des Minimums ist “<<minimum<<endl; Dr. Norbert Spangler / Programmieren I 25.10.2015 16 Verzweigung mit if-else : Allgemein if ( Bedingung ) // if-else Anweisung1 else Anweisung2 Anweisung3//naechste Anweisung nach dem if-else Wirkungsweise Auswertung der Bedingung = boolescher Ausdruck falls true (d.h. nicht 0) : Führe Anweisung1 aus, dann kommt Anweisung3 falls false (d.h. 0 ) : Führe Anweisung2 aus, dann kommt Anweisung3 Anmerkung: -Mit Anweisung ist jeweils auch ein Block gemeint (siehe Musterprogramm) -Bedingung ist jeder Ausdruck, der wahr oder falsch ist -Der else-Zweig kann weggelassen werden. if ( Bedingung) //if ohne else Anweisung1 Anweisung3//naechste Anweisung Dr. Norbert Spangler / Programmieren I 25.10.2015 17 Struktogramm Dr. Norbert Spangler / Programmieren I 25.10.2015 18 Sequenz: 2 Rechtecke untereinander Dr. Norbert Spangler / Programmieren I 25.10.2015 19 Verschachtelung // Werte Stromimpuls #include <iostream> using namespace std; void main() { double t; cin >> t ; if ( t < 0 ) cout << " Wert ist " << 0 <<endl; else { if ( t < 1 ) cout << " Wert ist " << t <<endl; else { if ( t < 2 ) cout << " Wert ist " << 2-t <<endl; else cout << " Wert ist " << 0 <<endl; } } } Dr. Norbert Spangler / Programmieren I Verschachtelung t<0 ja nein t<1 ja nein Ausgabe 0 t<2 Ausgabe t ja nein Ausgabe 2-t Ausgabe 0 if-else Befehle müssen immer vollständig im if oder else Block eines „übergeordneten“ if-else Befehls enthalten sein Übliche Vorgehensweise: Von außen nach innen. 25.10.2015 20 Alternative: else-if-Kette // Werte Stromimpuls #include <iostream> using namespace std; void main() { double t; -1 -0,5 cin >> t ; if ( t < 0 ) cout << " Wert ist " << 0 <<endl; else if ( t < 1 ) cout << " Wert ist " << t <<endl; else if ( t < 2 ) cout << " Wert ist " << 2-t <<endl; else cout << " Wert ist " << 0 <<endl; 1,2 1 0,8 0,6 0,4 0,2 0 0 0,5 1 1,5 2 2,5 } if - else if - else if - … else Dr. Norbert Spangler / Programmieren I else if Kette 25.10.2015 21 else if Kette if ( Bedingung1) Anweisung1 else if (Bedingung2) Anweisung2 else if .... else Anweisungm Anweisungn Wirkungsweise Auswertung von Bedingung1 falls true : Führe Anweisung1 aus, dann Anweisungn falls false: Auswertung von Bedingung2 falls true : Führe Anweisung2 aus, dann Anweisungn falls false: ..... Dr. Norbert Spangler / Programmieren I 25.10.2015 22 Struktogramm ELSE-IF-Kette Verschachtelung t<0 ja nein t<1 ja nein Ausgabe 0 t<2 Ausgabe t ja nein Ausgabe 2-t Ausgabe 0 Wie Verschachtelung Dr. Norbert Spangler / Programmieren I 25.10.2015 23 IF-Sünden Sünde 1: Abfrage boolscher Größen bool a; …. if ( a==true)// a ist schon wahr oder falsch!!!! {} //kein Vergleich erforderlich bool b; …. if ( b==false) {} Besser: if ( a ) {} Besser: if ( !b ) {} Sünde 2: Namensvergabe bool keinFehler;// statt a wie oben … if ( keinFehler ) {} Dr. Norbert Spangler / Programmieren I bool fehler;// statt b wie oben … if ( !fehler ) {} 25.10.2015 24 Sünde 3: Vergleiche IF-Sünden bool gleich; int wert, eingabe; …. if (eingabe == wert) gleich=true; else gleich=false; bool ungleich; int wert,eingabe; …. if eingabe!=wert) ungleich=true; else ungleich=false; Besser: gleich = (eingabe==wert); Besser: ungleich = (eingabe!=wert); Sünde 4: 2xif verschachtelt aber nur ein else („Dangling else“) bool b1,b2, if (b1) if ( b2) cout<<"1"; else cout<<"2"; Wohin gehört das else ? Was passiert? Was ist gewollt? Besser: geschweifte Klammern setzen Dr. Norbert Spangler / Programmieren I 25.10.2015 25 Verzweigung mit Switch: Beispiel // Kleinrechner/switch void main() { int i,j; Rechner char op; cin >> i >> op >> j; switch (op) { case '+' : cout << i << op << j <<" = " << i+j << endl; break; case '-' : cout << i << op << j <<" = " << i-j << endl; break; case '*' : cout << i << op << j <<" = " << i*j << endl; break; case '/' : cout << i << op << j <<" = " << i/j << endl; break; case '%' : cout << i << op << j <<" = " << i%j << endl; break; default : cout << " unzulässiger Operator " << endl; } Dr. Norbert Spangler / Programmieren I } für Grundrechenarten + - * / und % 25.10.2015 26 Switch- allgemein switch ( ganzzahliger Wert ) { case konstante1: Befehl;Befehl;...Befehl; break; case konstante2: Befehl;Befehl;...Befehl; break; ..... default: Befehl;Befehl;...Befehl; } Einrücken/Klammern Analog Verzweigung Kann weggelassen werden In der Regel nicht sinnvoll. Kann weggelassen werden Nicht empfehlenswert !!!!! Empfehlung: als ganzzahzliger Wert ist der Typ char geeigneter als int/short etc., da es keine Eingabefehler geben kann. Dr. Norbert Spangler / Programmieren I 25.10.2015 27 switch Wirkungsweise Bestimmung des Werts (muss ganzzahliger Typ sein) Vergleich mit den ganzzahligen Konstanten (alle verschieden) Bei Übereinstimmung mit einer Konstanten->Verzweigung zur case – Marke. Ausführung der Befehle bis zum break, dann Verzweigung zum Ende (nach dem switch). Fehlt der break-Befehl wird mit dem darauf folgenden Befehl fortgesetzt !!!!! Stimmt der Wert mit keiner Konstanten überein wird bei default fortgesetzt, Sofern vorhanden (wenn nicht, findet keine Aktion statt). Dr. Norbert Spangler / Programmieren I 25.10.2015 28 Struktogramm switch op + Ausgabe i+j * Ausgabe / Ausgabe i-j Dr. Norbert Spangler / Programmieren I i*j % Ausgabe i/j sonst Ausgabe i modulo j Fehler meldung 25.10.2015 29 Gegenüberstellung Die else-if Kette ist universeller als switch. Sie kann mit beliebigen Bedingungen formuliert werden. Switch ist beschränkt auf den Vergleich ganzzahliger Ausdrücke (u.a. Aufzählungstyp !!), ist aber übersichtlicher, insbesondere wenn es viele Fälle sind, die logisch eher alle „gleichwertig“ sind. Switch ist besonders bei einer Menue-Auswahl empfehlenswert. Dr. Norbert Spangler / Programmieren I 25.10.2015 30 Verzweigung mit dem Auswahloperator Beispiel Form : Anstelle von (Bedingung) ? wert1: wert2; if ( x<y ) minimum = x; else minimum = y; Wirkung : Ist die Bedingung wahr, wird wert1 verwendet, sonst wert2. kann auch minimum = (x<y)? x : y; mit dem Auswahloperator ? verwendet werden (bedingte Bewertung). Der Auswahloperator wird bei größeren Ausdrücken schnell unübersichtlich wert=(t<0)?0:(t<1)?t:(t<2)?(2-t):0; Dr. Norbert Spangler / Programmieren I 25.10.2015 31 4.6 Schleifen (Wiederholungen) Schleifen dienen dazu, eine Gruppe von Befehlen zu wiederholen etwa bei - Der Eingabe einer Tabelle von Zahlen - Berechnung des Durchschnitts einer großen Menge von Zahlen - Der Bestimmung des Minimums/Maximus einer Menge von Messwerten - Der Suche eines Elements in einer Tabelle - Der Wahl einer Aktion durch den Anwender in einem Menue Diese Wiederholungen finden solange statt, wie eine Wiederholungsbedingung (WB ) gilt bzw. ein Ende noch nicht erreicht ist: -Noch Daten da -Noch nicht alle Zahlen untersucht (bei Maximum, Minimum, Suche) -Der Anwender hat keine Lust mehr WB ist üblicherweise ein Ausdruck vom Typ bool. Das Prinzip ist also ….. WB prüfen – Befehle ausführen – WB prüfen – …. C++ kennt 3 verschiedene Arten von Schleifen Dr. Norbert Spangler / Programmieren I 25.10.2015 32 Übersicht Schleifen while-Schleife (siehe Musterprogramm) while (WB) { Befehle } Arbeitsweise: WB – Befehle – WB – Befehle – WB … do-while-Schleife Einrücken/Klammer Analog Verzweigung do { Befehle } while (WB) Arbeitsweise: Befehle – WB – Befehle – WB – Befehle – WB … for-Schleife (Verallgemeinerung der while-Schleife) Übliche Arbeitsweise: Eine ganzzahlige Zählvariable durchläuft Werte von einem Anfangswert bis zu einem Endwert Dr. Norbert Spangler / Programmieren I 25.10.2015 33 While-Schleife while (WB) { Befehle } Arbeitsweise: WB – Befehle – WB – Befehle – WB … while ( Wiederholungsbedingung) Anweisung1 Anweisung2//naechste Anweisung Wirkung (*) Werte Bedingung aus falls true : Führe Anweisung1 aus Mache weiter bei (*) falls false: Führe Anweisung2 aus Kopfgesteuerte Schleife Dr. Norbert Spangler / Programmieren I 25.10.2015 34 Struktogramm/Allgemein Dr. Norbert Spangler / Programmieren I 25.10.2015 35 Modellierung einer while-Schleife 1) Identifizierung der Wiederholungsbedingung (WB) der Schleife (ev. Negation einer Abbruchbedingung) 2) Identifizierung aller Befehle, die wiederholt werden wie z.B.: nächste Daten lesen – neue Summe berechnen – zählen – ... 3) Ermittlung, ob die Schleife immer mindestens einmal durchlaufen wird falls ja: do while -> später andernfalls: while 4) Existenz von Befehlen unter 3) prüfen, welche WB ändern. Ansonsten ist es eine unendliche Schleife. Dr. Norbert Spangler / Programmieren I 25.10.2015 36 Beispiel a) Musterprogramm b) Aufgabe: es sollen positive Zahlen eingelesen und deren Summe berechnet werden. Bei Eingabe einer Zahl <=0 endet die Verarbeitung. Wiederholungsbedingung (WB) : eingelesene Zahl > 0 Befehle in der Schleife : aktuelle Summe bestimmen, neue Zahl lesen Mindestens einmal: nein, wenn die erste Zahl <= 0 ist -> while-Schleife Änderung WB : ja da neue Zahl gelesen wird Dr. Norbert Spangler / Programmieren I 25.10.2015 37 Beispiel While-Schleife summe = 0 erste zahl lesen zahl>0 summe=summe+zahl zahl lesen summe weiter verarbeiten double summe=0.0, zahl; cin>>zahl; while ( zahl>0 ) { summe+=zahl; cin>>zahl; } //summe ist berechnet Übliche Vorgehensweise, wenn eine unbekannte Anzahl von Daten zu lesen ist: 1. Lesen (genauer Leseversuch) direkt vor der Schleife 2. WB: Kontrolle der Eingabe 3. am Ende der Schleife: nächster Lesebefehl Dr. Norbert Spangler / Programmieren I 25.10.2015 38 do while Schleife do { Befehle } while (WB) Arbeitsweise: Befehle – WB – Befehle – WB – Befehle – WB … do Anweisung1 while ( Wiederholungsbedingung) Anweisung2 Wirkung (*) Führe Anweisung1 aus Werte WB (boolscher Ausdruck) aus falls true : Mache weiter bei (*) falls false: Führe Anweisung2 aus In einer do while Schleife wird die Anweisung in der Schleife mindestens 1 mal ausgeführt !!!! Fußgesteuerte Schleife Modellierung analog while-Schleife Dr. Norbert Spangler / Programmieren I 25.10.2015 39 Struktogramm Dr. Norbert Spangler / Programmieren I 25.10.2015 40 Beispiel: Do-While Die Do-While-Schleife ist eher selten. Typische Anwendungen sind Aktionen, wo erst danach entschieden werden kann, ob die Aktion zu wiederholen ist. Ein Beispiel wäre die Eingabe einer Zahl, die zwischen 1 und 100 sein soll. do { cout<<“Zahl eingeben“<<endl; cin>>zahl; } while ( zahl<=0 || zahl>100 )//Kontrolle Allgemein Dr. Norbert Spangler / Programmieren I 25.10.2015 41 for-Schleife- ein Beispiel Es sollen n ganze Zahlen gelesen und aufsummiert werden. n ist ebenfalls einzulesen. Hier steht die Anzahl der Wiederholungen zu Beginn der Schleife fest. int n,summe=0,zahl; cin>>n; for ( int zaehler=1; zaehler<=n; zaehler++) { cin>>zahl; summe+=zahl; } Einrücken/Klammer analog Verzweigung Wirkung Initialisierung(1 mal) : zaehler wird deklariert und 1 gesetzt * WB prüfen: ist zaehler<=n wie While-Schleife Befehle: zahl lesen und aufsummieren wie While-Schleife Reinitialisierung: zaehler erhöhen weiter bei * Dr. Norbert Spangler / Programmieren I 25.10.2015 42 for-Schleife allgemein for (Anweisung1;Wiederholungsbedingung;Anweisung3) Anweisung2 Anweisung4//naechste Anweisung Wirkung Führe Anweisung1(=Initialisierung) aus (ev. mehrere durch Komma getrennt, Deklarationen sind üblich) int zaehler=1 (*) Werte die Wiederholungsbedingung aus-> also kopfgesteuert Falls true : Führe Anweisung2 (Schleifenbefehle) aus Führe Anweisung3 (=Reinitialisierung) aus (ev. mehrere durch Komma getrennt) Weiter bei (*) zaehler<=n zaehler++ Falls false: Weiter mit dem ersten Befehl nach der Schleife Anweisung4 Dr. Norbert Spangler / Programmieren I 25.10.2015 43 Struktogramm/vereinfacht Die For-Schleife ist kopfgesteuert. Daher ist das Symbol identisch zur While-Schleife. Hinweis: Der structorizer schlägt hier ein anderes Symbol vor, welches üblicherweise als „Endlosschleife“ verwendet wird. Wir werden es hier nicht verwenden!! Dr. Norbert Spangler / Programmieren I 25.10.2015 44 Modellierung von for-Schleifen (Zählschleifen) 1. 2) 3) 4) 5) Prinzipielles Vorgehen bei üblichen einfachen Schleifen Bestimmung des Zählers und seines Anfangswertes, der Anzahl der Wiederholungen bzw. des Wertes wo die Schleife endet Initialisierung: Zähler= Anfangswert Wiederholungsbedingung: Zähler < =Endwert oder Zähler<Wert Reinitialisierung: Zähler um 1 erhöhen Identifizierung aller Befehle, die wiederholt werden wie z.B.: nächste Daten lesen – neue Summe berechnen ... Die Möglichkeiten einer for-Schleife sind aber wesentlich weitreichender als hier dargestellt. Dr. Norbert Spangler / Programmieren I 25.10.2015 45 Struktogramm/Beispiel For-Schleife summe = 0 n lesen zaehler von 1 bis n zahl lesen summe=summe+zahl summe weiter verarbeiten Dr. Norbert Spangler / Programmieren I 25.10.2015 46 For-Schleife: Variationen Für eine Schleife über geraden Zahlen ändert man die Reinitialisierung for (int i=0 ; i<n ; i=i+2) { .... } Für eine „Rückwärtsschleife“ formuliert man beispielsweise wie folgt for (int k=m ; k>0 ; k=k-1)//Alternative k-{ .... } Eine Schleife über „relle Zahlen“ for (double x=0.0, x<=1; x+=0.01) { .... } Mehrere Befehle, durch Komma getrennt, bei Initialisierung und Reinitialisierung for (int i=1, k=100; i<n && k > 0; i=i+1,k=k-1) { .... } Eine Endlosschleife for (; ;) //Alternative while(1) oder while(true) { .... } Dr. Norbert Spangler / Programmieren I 25.10.2015 47 For-Schleife/ohne Zähler Die for-Schleife ist ein sehr mächtiger Befehl, der prinzipiell jede Wiederholung modellieren kann. Dies ist dann oft sehr trickreich, aber meist schwer lesbar/verständlich. for (Datei oeffnen, hole erste Daten ; kein Dateiende ; lese naechste Daten) { verarbeite Daten } Initialisierung: Wiederholungsbedingung: Schleifenbefehle: Reinitialisierung: Datei oeffnen, ersten Datensatz lesen (Versuch) Leseversuch geglückt, Daten sind da Daten verarbeiten naechste Daten lesen (Versuch) Es ist lesbarer, dies mittels einer While-Schleife zu realisieren. Datei oeffnen; Erste Daten holen; while( kein Dateiende) { Daten verarbeiten; naechste Daten lesen; } Dr. Norbert Spangler / Programmieren I 25.10.2015 48 Schleifen: geänderter Ablauf break : Der Befehl break beendet sofort die aktuelle Schleife, in welcher dieser Befehl steht. Es geht mit dem ersten Befehl nach der Schleife weiter. while (true) // keine Endebedingung – unendliche Schleife { if ( … ) break; } continue : Der Befehl continue beendet die Befehle innerhalb der Schleife und setzt mit der Überprüfung der Wiederholungsbedingung bzw. Reinitialisierung bei for-Schleifen fort.. for ( int i=0;i<1000;i++) { if ( … ) continue; } Dr. Norbert Spangler / Programmieren I 25.10.2015 49 4.7 Ein-/Ausgabe Die Ein- und Ausgabe in C++ erfolgt üblicherweise mittels cin und cout. Dies sind jedoch keine Befehle sondern Objekte von Stream-Klassen. Die (Stream-)Klassen werden im Zusammenhand mit der Objektorientierung im Sommersemester behandelt. Die aus C stammenden Funktionen printf/scanf werden nicht betrachtet. Dr. Norbert Spangler / Programmieren I 25.10.2015 50 Ein-/Ausgabe mit cin/cout Es können ein aber auch mehrere Daten mit einem Aufruf bearbeitet werden. Formatierungen sind mittel I/O-Manipulatoren möglich. cin>>x; cin>>a>>b>>c; cout<<i; cout<<"Ergebnis "<<i<<endl; cout<<setw(10)<<setprecision(5)<<fixed<<d<<endl;//mit Manipulatoren Dr. Norbert Spangler / Programmieren I 25.10.2015 51 Weitere Ein-/Ausgabebefehle character c1;// Variable fuer Zeichen put schreibt ein Zeichen cout.put(c1); get liest das nächste Zeichen, welches auch ein Whitespace-Zeichen sein kann! cin.get(c1); read/write Lesen und Schreiben von character-arrays (später) cin.read(c,10) bzw. cout.write(c,10) für jeweils 10 Zeichen getline Lesen von Zeichen in eine Variable vom Typ String bis zum Auftreten eines Begrenzungszeichens. getline(cin,name) Stringvariable name / Begrenzungszeichen newline getlinie(cin,name,'#') Stringvariable name / Begrenzungszeichen # Dr. Norbert Spangler / Programmieren I 25.10.2015 52 4.8 Sonstige Befehle return Ausdruck Beendigung einer Funktion mit dem Wert des Ausdrucks als Funktionswert-> Kap. Funktionen return beendigung einer Funktion vom Typ void exit(n) Beendigung des Programms :Fehlercode n (ganze Zahl) goto marke Verzweigung zu einer Marke / soll nicht verwendet werden „schlechter Programmierstil“ Dr. Norbert Spangler / Programmieren I 25.10.2015 53 4.9 Beispiel for Es sollen n Zahlen eingelesen und ihr Maximum berechnet werden. Zusätzlich ist die Nummer der eingelesenen Zahl, welche,das Maximum ist, zu bestimmen. n ist voher einzulesen. Achtung: bei Maximum/Minimumsuche als Anfangswert immer das erste Element wählen Testplan Nr. Fall 1 2 3 4 5 6 Dr. Norbert Spangler / Programmieren I Eingabe n Zahlen Keine Zahl 0 Eine Zahl 1 5 Normal/Anfang 3 8 5 1 Normal/Mitte 3 5 8 1 Normal/Ende 3 5 18 Gleiche Zahlen 3 8 1 8 Ergebnis Nummer Max Meldung 1 5 1 8 2 8 3 8 1 8 25.10.2015 54 Beispiel for void main() Initialisierung : i=2 (Zählvariable auf den Anfangswert setzen) { Wiederholungsbedingung: i<=n (Zählvariable abfragen) int n; Reinitialisierung: i=i+1 (Zählvariable hochzählen cout<<"n einlesen "; cin >>n; if ( n<=0 ) cout<<" keine Zahlen gelesen "<<endl; else { int zahl, nummer=1; cin>>zahl; int maximum=zahl; for ( int i=2 ; i<=n ; i++ ) // Zaehlvariable in der Schleife deklarieren { cin>>zahl; if ( zahl>maximum ) { maximum=zahl; nummer=i; } } cout<<"Maximum "<<maximum<<" = "<<nummer<<". Zahl"<<endl; } Dr. Norbert Spangler / Programmieren I 25.10.2015 55 } 4.10 Beispiele/while In einem Programm sollen positive ganze Zahlen eingelesen und deren Durchschnitt berechnet werden. Das Programm endet, wenn eine negative Zahl oder 0 eingegeben wird. Danach sind Durchschnitt und Anzahl der gelesenen Zahlen am Bildschirm auszugeben. Achtung: Hier ist die Anzahl der Wiederholungen zu Beginn der Schleife nicht bekannt -> While-Schleife empfohlen Dr. Norbert Spangler / Programmieren I 25.10.2015 56 Beispiele/while // Lesen von positiven Zahlen #include <iostream> Welche Testfälle sollte man wählen? using namespace std; Welche Schwächen hat dieses void main() Programm? { int anzahl=0,eingabezahl; float summe=0.0; // Erste Zahl eingeben cout << " Bitte positive Zahl eingeben " << endl; cout << " Abbruch mit 0 " << endl; cin >> eingabezahl; //Schleife while (eingabezahl>0) { anzahl=anzahl+1;//zaehler erhoehen summ=summe+eingabezahl;//summe bestimmen cout << " Bitte naechste Zahl eingeben/Abbruch mit 0 " << endl; cin >> eingabezahl; } //Ergebnis ausgeben cout << " Der Durchschnitt ist : " << summe/anzahl << endl; cout << " Es wurden "<<anzahl<<" Zahlen gelesen"<<endl; } Dr. Norbert Spangler / Programmieren I 25.10.2015 57 Beispiele/while Ein guter vorher erstellter Testplan hätte die Schwächen des Programms aufgedeckt. Der Fall n=0 sollte noch nach der Schleife abgefangen werden. Testplan Nr. Fall 1 2 3 Eingabe Ergebnis Zahlen Durchschnitt Anzahl Keine Zahl 0 ????????? 0 Eine Zahl 2.2 0 2.2 1 Normalfall 1 0.3 2 0 1,1 3 Dr. Norbert Spangler / Programmieren I 25.10.2015 58 Beispiele/while // Lesen von positiven Zahlen #include <iostream> using namespace std; void main() Durch die { int anzahl=0,eingabezahl; Berücksichtigung des float summe=0.0; Testfalls "keine // Erste Zahl eingeben cout << " Bitte positive Zahl eingeben " << endl; Zahlen" ( Testplan ! ) cout << " Abbruch mit 0 " << endl; ergibt sich ein cin >> eingabezahl; //Schleife geänderter while (eingabezahl>0) Programmcode. { anzahl=anzahl+1; summ=summe+eingabezahl; cout << " Bitte naechste Zahl eingeben/Abbruch mit 0 " << endl; cin >> eingabezahl; } //Ergebnis ausgeben if ( anzahl==0 ) cout<<" keine Zahlen gelesen"<<endl; else { cout << " Der Durchschnitt ist : " << summe/anzahl << endl; cout << " Es wurden "<<anzahl<<" Zahlen gelesen"<<endl; } } Dr. Norbert Spangler / Programmieren I 25.10.2015 59 4.11 Beispiel do while Der Anwender soll eine Zahl n>0 eingeben. void main() { int n; do { cout<<endl; cout<<" Zahl > 0 eingeben "; cin>>n; } while(n<=0) // jetzt geht’s weiter } Nachteil: Der Anwender bekommt keinen Hinweis, dass seine letzte Eingabe fehlerhaft war. Aber: Do While Schleifen kommen eher selten vor. Dr. Norbert Spangler / Programmieren I 25.10.2015 60 4.12 Übung Schleife und switch Es soll in einem Auswahlmenue der Anwender gefragt werden, welche Aktion er durchführen will bzw. ob er die Durchführung von Aktionen abbrechen will. Als Aktionen sollen der Einfachheit die Aktionen Ausgabe " Aktion A" … Ausgabe " Aktion F" vorgegeben sein. Erstellen Sie ein entsprechendes Programm. Tipp: Lesen sie Zeichen (char) ein für die Wahl des Menuepunktes und keine Zahlen. Sie ersparen sich Fehleingaben. Dr. Norbert Spangler / Programmieren I 25.10.2015 61 Übung Schleife und switch Testplan Nr. 1 2 3 4 5 6 7 Fall Wahl A Wahl B Wahl C Wahl D Wahl E Wahl F Ende Eingabe A B C D E F X Ergebnis Aktion A: Ausgabe A Aktion B: Ausgabe B Aktion C: Ausgabe C Aktion D: Ausgabe D Aktion E: Ausgabe E Aktion F: Ausgabe F Programmende Struktogramm und Programm zur Übung Dr. Norbert Spangler / Programmieren I 25.10.2015 62 4.13 Vorgehensweise Struktogramme Von außen nach innen TOP DOWN Einzelne Rechtecke erst mit Stichwort zusammenfassend beschreiben und dann detaillieren Dr. Norbert Spangler / Programmieren I 25.10.2015 63 4.14 echte Klausurerlebnisse
© Copyright 2024 ExpyDoc