Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

FB Informatik Prof. Dr. R.Nitsch Programmieren 1 – Kontrollstrukturen Teil 2 Reiner Nitsch Homepage mit Skript und Materialien zu PG1: www.fbi.h-da.de/~r.nitsch.

Ähnliche Präsentationen


Präsentation zum Thema: "FB Informatik Prof. Dr. R.Nitsch Programmieren 1 – Kontrollstrukturen Teil 2 Reiner Nitsch Homepage mit Skript und Materialien zu PG1: www.fbi.h-da.de/~r.nitsch."—  Präsentation transkript:

1 FB Informatik Prof. Dr. R.Nitsch Programmieren 1 – Kontrollstrukturen Teil 2 Reiner Nitsch Homepage mit Skript und Materialien zu PG1: Hinweise: Die in diesem Kapitel beschriebenen Kontrollstrukturen werden im E-Book auf den Seiten behandelt. ich bitte Sie, dieses Skript und/oder die entsprechenden Seiten im E-Book durchzuarbeiten. Bei der Wiederaufnahme des Vorlesungsbetriebs werden diese Themen nicht mehr behandelt und als bekannt vorausgesetzt. Selbstverständlich bekommen Sie Fragen zu den hier behandelten Themen in der Vorlesung beantwortet.

2 FB Informatik Prof. Dr. R.Nitsch char Option do { cout << "Moegliche Optionen: a/b/x\n" "Gib Option: "; cin >> Option; switch (Option) { case 'a': S1(); case 'b': S2(); case 'x': cout << "Programmende"; default: cout << "Option gibt es nicht!"; } } while (Option != 'x'); Kontrollstruktur – Mehrfache Auswahl mit switch – case /73/ In den beiden Diagrammen steht A für einen Ausdruck, der stets einen der (ganzzahligen) Werte w 1, w 2,... ergibt. Der unter dem entsprechenden w i stehende Strukturblock S i wird ausgeführt. S1S1 S2S2 …SnSn w1w1 w2w2 … A wnwn Es gibt folgende Variante, bei der der Strukturblock S unter ' sonst ' aufgeführt wird, falls A nicht einen der w i ergibt: C++ kann das nur bedingt: switch ( A ) { case w1: S1; case w2: S2; case wn: Sn; default: S; } Optional; muss nicht letzte Marke sein. muss ganzzahliger Ergebnis-Typ sein Beispiel: Menüsteuerung break; break verzweigt hinter das Ende der switch- Anweisung optional S1S1 S2S2 …S w1w1 w2w2 sonst … A break;

3 FB Informatik Prof. Dr. R.Nitsch Ziffern, Zwischenraum und andere Zeichen zählen void main () { char c; int whitespace(0), number(0), other(0); do { c = cin.get(); switch (c) { case ' ': case '\n': case '\t': whitespace++; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': number++; break; default: other++; break; } } while ( c!= ); --other; cout << "\nDie Eingabe enthielt" << endl << number << " Ziffern" << endl << whitespace << " Zwischenraumzeichen " << "und" << endl << other << " andere Zeichen." << endl; } Sentinel ist EOF (iostream) "End of File"; Wert = -1; Eingabe plattformabhängig (Windows: ctrl-Z). EOF muß am Zeilenanfang stehen. sonst wird es von cin ingnoriert und der Eingabepuffer gelöscht Liest genau ein Zeichen von Tastatur ein. Notwendig, weil cin Zwischenraumzeichen entfernt. In C++ können Zeichen in jedem Ganzzahltyp gespeichert werden, da sie intern als 1-byte-Ganzzahlen dargestellt werden. EOF Das newline-Zeichen am Ende jeder Eingabe darf nicht mitgezählt werden.

4 FB Informatik Prof. Dr. R.Nitsch Annehmende Schleife /77-79/ – do while Schleife mit nachfolgender Bedingungsprüfung: annehmende Schleife Zuerst wird S ausgeführt, danach wird B getestet. Ergibt dieser Test false, so wird der nächste Strukturblock verarbeitet. Liefert der Test true, so wird der vorliegende Strukturblock S erneut ausgeführt. B S C++ Syntax: do { //Anweisungen aus S } while (B); Mit B wird eine Bedingung (logischer Ausdruck) bezeichnet, S ist ein Strukturblock. Beispiel 1 int Counter::accumulate() { int nextVal; value = 0; do { nextVal = get_int("Gib Ganzzahl>0"); value += nextVal; } while ( nextVal >0 ); return value; } Unterschied zur annehmenden Schleife: S wird mindestens einmal ausgeführt! Empfehlung: Nur anwenden in begründeten Ausnahmefällen, z.B. wiederholte Benutzereingabe sentinel: nextVal<0 Schleifenvariable Rückgabewert initialisieren Schleifenvariable Richtung Ziel verändern "Nutzleistung" Vom Benutzer eingegebene positive Zahlen sollen aufsummiert werden. Achtung: Sentinelwert wird auch addiert! Was nun? value-=nextVal;

5 FB Informatik Prof. Dr. R.Nitsch Annehmende Schleife – do while Beispiel 2 void Counter::countdown() { // PRE: 0<=value if( value==0 ) throw std::runtime_error(); do { cout << value << endl; --value; } while (value ); cout << 0 << endl; assert (value == 0 ); } 1. Wichtig: Zuerst die Zusicherungen. Daraus ergeben sich die notwendigen lokalen Variablen! 2. Algorithmus schreiben und Prüfbedingung festlegen. 3. Prüfen des Algorithmus mit Extremwerten: wert = 1 wert > 1 ; z.B wert = 2 ok Frage: Ist das übersetzungsfähig? do { char c; cin >> c; } while ( c != '*' ); Compilermeldung: 'c': nichtdeklarierter Bezeichner Begründung: Speicherklasse von c ist "auto", d.h. c ist lokale Variable im Strukturblock S c ist nur im Strukturblock S definert! Gültigkeitsbereich von c endet mit '}' > 0 char c = ' '; while ( c != '*' ) { char c; cin>>c; cout<

6 FB Informatik Prof. Dr. R.Nitsch Schleife mit fester Wiederholungsanzahl /80-84/ - for Eigentlich überflüssig, aber von Programmierern gern benutzt Solange Bedingung B wahr (0) ist S SV initialisieren SV verändern Richtung Ziel C++ Syntax for ( SVinit; B; SVincrement) S; ist äquivalent zu SVinit while (B) { S SVincrement } Beispiel: Quadratzahltabelle for ( int i = 1; i <= 3; i++ ) cout << i << i*i << endl; SV Initialisierung! C++: Gültigkeitsbereich von i ist nur die for-Anweisung. d.h. for( int i=0; i<10; ++i ) { … } i = 0; quittiert der C++ Compiler mit Fehlermeldung: 'i': nichtdeklarierter Bezeichner Ausgabe S

7 FB Informatik Prof. Dr. R.Nitsch Einfache Beispiele für for - Anweisung a ) Dekrementieren der SV in Schritten von 1 for ( int i=5 ; i>=1 ; i-- ) { cout << i << ' '; } b ) Inkrementieren der SV in Schritten > 1 for ( int i=7 ; i<=35 ; i+=7 ) { cout << i << ' '; } c ) Dekrementieren der SV in Schritten > 1 for ( int i=10 ; i>=2 ; i-=2 ) { cout << i << ' '; } Ausgabe: Ausgabe: Ausgabe:

8 FB Informatik Prof. Dr. R.Nitsch Schleife mit fester Wiederholungsanzahl - for Beispiel: countdown void Counter::countdown() { if( value<=0 ) throw std::runtime_error(); for ( ; value ; --value ) cout << value << endl; assert (value == 0 ); } 1. Wichtig: Zuerst die Zusicherungen. Daraus ergeben sich die notwendigen lokalen Variablen! 2. Algorithmus schreiben und Prüfbedingung festlegen. 3. Prüfen des Algorithmus mit Extremwerten und ggf. Prüfbedingung/Algorithmus korrigieren : value = 1 value > 1 ; z.B value = 2 >0 cout << 0 << endl; Jeder der 3 Ausdrücke in for-Anweisung kann weggelassen werden: Beispiel for ( ; ; ) cout << "Wird nie fertig" besser for ( ; true ; ) S

9 FB Informatik Prof. Dr. R.Nitsch Schleife mit fester Wiederholungsanzahl - for Beispiel: GGT zweier Ganzzahlen mit for Lösung mit Pseudocode Vorbedingung? Nachbedingung? Schleifenvariable ggT mit Minimum beider Zahlen initialisieren Prüfen, ob beide Zahlen ohne Rest durch ggT teilbar sind Falls ja, Schleife verlassen und mit nächster Anweisung fortfahren Falls nein, ggT um eins vermindern Hausaufgabe

10 FB Informatik Prof. Dr. R.Nitsch Schleife mit fester Wiederholungsanzahl - for Beispiel: GGT zweier Ganzzahlen mit for int ggt( int zahl1, int zahl2 ) { if(zahl1<1 || zahl2<1) throw std::runtime_error("PRE error in ggt"); int ggT; for ( ggT = (zahl1

11 FB Informatik Prof. Dr. R.Nitsch Der Komma-Operator meist in for -Anweisung verwendet erlaubt dort mehrere Ausdrücke, wo syntaktisch nur 1 Ausdruck stehen darf hat den niedrigsten Vorrang wertet von links nach rechts aus Gesamtausdruck hat den Wert des ganz rechts stehenden Ausdrucks Beispiel 2 int i,j; int z = ( i=20, j=2*i); // i = 20, j = 40, z = 40 // kein guter Programmierstil! Beispiel 1 int i, j, summe(0); for ( i = 100, j=1; j < i; i--, j++ ) summe += i + j; cout << summe; // Addiert (1+100)+(2+99)+…+(50+51) = 5050 // Sinnvolle Anwendung des Kommaoperators // Summe der Zahlen von 1 bis 100 // wird berechnet Was leistet diese Anwendung? Warum muss hier geklammert werden? Welche Werte werden zugewiesen? Fehler: int j: Neudefinition

12 FB Informatik Prof. Dr. R.Nitsch So, das war´s erst mal!


Herunterladen ppt "FB Informatik Prof. Dr. R.Nitsch Programmieren 1 – Kontrollstrukturen Teil 2 Reiner Nitsch Homepage mit Skript und Materialien zu PG1: www.fbi.h-da.de/~r.nitsch."

Ähnliche Präsentationen


Google-Anzeigen