11
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 inweise: ie in diesem Kapitel beschriebenen Kontrollstrukturen werden im E-Book auf den eiten 73-84 behandelt. ich bitte Sie, dieses Skript und/oder die entsprechenden Se m E-Book durchzuarbeiten. Bei der Wiederaufnahme des Vorlesungsbetriebs werden iese Themen nicht mehr behandelt und als bekannt vorausgesetzt. elbstverständlich bekommen Sie Fragen zu den hier behandelten Themen in der orlesung beantwortet.

Programmieren 1 – Kontrollstrukturen Teil 2

  • Upload
    kenyon

  • View
    77

  • Download
    0

Embed Size (px)

DESCRIPTION

Programmieren 1 – Kontrollstrukturen Teil 2. Reiner Nitsch Homepage mit Skript und Materialien zu PG1: www.fbi.h-da.de/~r.nitsch. Hinweise: Die in diesem Kapitel beschriebenen Kontrollstrukturen werden im E-Book auf den - PowerPoint PPT Presentation

Citation preview

Page 1: Programmieren 1 – Kontrollstrukturen Teil 2

FB InformatikProf. Dr. R.Nitsch

Programmieren 1 – Kontrollstrukturen Teil 2

Reiner Nitsch

Homepage mit Skript und Materialien zu PG1:www.fbi.h-da.de/~r.nitsch

Hinweise:Die in diesem Kapitel beschriebenen Kontrollstrukturen werden im E-Book auf den Seiten 73-84 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.

Page 2: Programmieren 1 – Kontrollstrukturen Teil 2

FB InformatikProf. Dr. R.Nitsch

22.04.23 2

char Optiondo { 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 w1, w2, . . . ergibt. Der unter dem entsprechenden wi stehende Strukturblock Si wird ausgeführt.S1 S2 … Sn

w1 w2 …

A

wn

Es gibt folgende Variante, bei der der Strukturblock S unter 'sonst' aufgeführt wird, falls A nicht einen der wi ergibt:

C++ kann das nur bedingt:

switch ( A ) {case w1: S1;case w2: S2;case wn: Sn;default: S;}

Optional; muss nichtletzte Marke sein.

muss ganzzahliger Ergebnis-Typ sein

Beispiel: Menüsteuerung

break;break;break;break;

break verzweigt hinter das Ende der switch-Anweisung

optional

S1 S2 … S

w1 w2sonst…

A

break;break;

break;

Page 3: Programmieren 1 – Kontrollstrukturen Teil 2

FB InformatikProf. Dr. R.Nitsch

22.04.23 3

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 ingnoriertund 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.

Page 4: Programmieren 1 – Kontrollstrukturen Teil 2

FB InformatikProf. Dr. R.Nitsch

22.04.23 4

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

SC++ 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

SchleifenvariableRü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;

Page 5: Programmieren 1 – Kontrollstrukturen Teil 2

FB InformatikProf. Dr. R.Nitsch

22.04.23 5

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 notwendigenlokalen Variablen!

2. Algorithmus schreiben und Prüfbedingung festlegen.

3. Prüfen des Algorithmus mit Extremwerten: wert = 1 wert > 1 ; z.B wert = 2 ok

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 Sc ist nur im Strukturblock S definert!Gültigkeitsbereich von c endet mit '}'

> 0

char c = ' ';while ( c != '*' ) { char c; cin>>c; cout<<c;}

Diese Schleifeendet nie!

Page 6: Programmieren 1 – Kontrollstrukturen Teil 2

FB InformatikProf. Dr. R.Nitsch

22.04.23 6

Schleife mit fester Wiederholungsanzahl /80-84/ - for

Eigentlich überflüssig, aber von Programmierern gern benutzt

Solange Bedingung Bwahr (≠0) ist

S

SV initialisieren

SV verändern Richtung Ziel

C++ Syntax

for ( SVinit; B; SVincrement)S;

ist äquivalent zu

SVinitwhile (B) { S SVincrement}

Beispiel: Quadratzahltabelle

for ( int i = 1; i <= 3; i++ ) cout << i << i*i << endl;

1 24

3

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

1 12 43 9

Ausgabe

S

Page 7: Programmieren 1 – Kontrollstrukturen Teil 2

FB InformatikProf. Dr. R.Nitsch

22.04.23 7

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: 5 4 3 2 1

Ausgabe: 7 14 21 28 35

Ausgabe: 10 8 6 4 2

Page 8: Programmieren 1 – Kontrollstrukturen Teil 2

FB InformatikProf. Dr. R.Nitsch

22.04.23 8

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 notwendigenlokalen Variablen!

2. Algorithmus schreiben und Prüfbedingung festlegen.

3. Prüfen des Algorithmus mit Extremwertenund 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

Page 9: Programmieren 1 – Kontrollstrukturen Teil 2

FB InformatikProf. Dr. R.Nitsch

22.04.23 9

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

Page 10: Programmieren 1 – Kontrollstrukturen Teil 2

FB InformatikProf. Dr. R.Nitsch

22.04.23 11

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

Page 11: Programmieren 1 – Kontrollstrukturen Teil 2

FB InformatikProf. Dr. R.Nitsch

22.04.23 12

So, das war´s erst mal!