kontrollanweisungen auswahlanweisungen, iterationsanweisungen, blöcke, sprunganweisungen

123
Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Upload: liesl-kelling

Post on 06-Apr-2015

110 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Kontrollanweisungen

Auswahlanweisungen, Iterationsanweisungen,

Blöcke, Sprunganweisungen

Page 2: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Kontrollfluss

o bisher linear (von oben nach unten)

o Für interessante Programme braucht man “Verzweigungen” und “Sprünge”

Page 3: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Kontrollfluss

o bisher linear (von oben nach unten)

o Für interessante Programme braucht man “Verzweigungen” und “Sprünge”

Ausgabe s

Eingabe ni := 1 , s := 0

s := s + ii ≤

n ? i := i + 1

Berechnung von 1 + 2 + … + n:

nein

ja

Page 4: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Auswahlanweisungen

realisieren “Verzweigungen”

o if Anweisungo if-else Anwseisung

Page 5: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

if-Anweisung

o statement : beliebige Anweisung (Rumpf der if-Anweisung)

o condition : konvertierbar nach bool

if ( condition )

statement

Page 6: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

if-Anweisung

if ( condition )

statement

int a;std::cin >> a;if (a % 2 == 0) std::cout << "even";

Wenn condition Wert true hat, dann wird statement ausgeführt.

Page 7: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

if-else Anweisung

o condition : konvertierbar nach boolo statement1 : Rumpf des if-Zweiges o statement2 : Rumpf des else-

Zweiges

if ( condition )

statement1

else

statement2

Page 8: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

if-else Anweisung

if ( condition )

statement1

else

statement2

int a;std::cin >> a;if (a % 2 == 0) std::cout << "even";else std::cout << “odd";

Wenn condition Wert true hat, dann wird statement1 ausgeführt; andernfalls wird statement2 ausgeführt.

Page 9: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

if-else Anweisung

if ( condition )

statement1

else

statement2

int a;std::cin >> a;if (a % 2 == 0) std::cout << "even";else std::cout << “odd";

Einrückung!

Einrückung!

Layout:

Page 10: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Iterationsanweisungen

realisieren “Schleifen”

o for-Anweisungo while-Anweisungo do-Anweisung

Page 11: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Berechne 1 + 2 + … + n// Program: sum_n.cpp // Compute the sum of the first n natural numbers.

#include <iostream>

int main(){ // input std::cout << "Compute the sum 1+...+n for n =? "; unsigned int n; std::cin >> n;

// computation of sum_{i=1}^n i unsigned int s = 0; for (unsigned int i = 1; i <= n; ++i) s += i;

// output std::cout << "1+...+" << n << " = " << s << ".\n"; return 0;}

Page 12: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung

o init-statement : Ausdrucksanweisung, Deklarationsanweisung, Nullanweisung

o condition : konvertierbar nach boolo expression : beliebiger Ausdrucko statement : beliebige Anweisung

(Rumpf der for-Anweisung)

for ( init-statement condition; expression )

statement

Page 13: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung

for ( init-statement condition; expression )

statement

for (unsigned int i = 1; i <= n; ++i)

s += i;

Deklarationsanweisung:

Page 14: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung

for ( init-statement condition; expression )

statement

for (unsigned int i = 1; i <= n; ++i)

s += i;

Ausdruck vom Typ bool:

Page 15: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung

for ( init-statement condition; expression )

statement

for (unsigned int i = 1; i <= n; ++i)

s += i;

Ausdruck vom Typ unsigned int:

Page 16: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung

for ( init-statement condition; expression )

statement

for (unsigned int i = 1; i <= n; ++i)

s += i; // Rumpf

Ausdrucksanweisung:

Page 17: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Semantik

o init-statement wird ausgeführt.

for ( init-statement condition; expression )

statement

Page 18: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Semantik

o init-statement wird ausgeführt.o condition wird ausgewertet.

o true : Iteration beginnt.

for ( init-statement condition; expression )

statement

Page 19: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Semantik

o init-statement wird ausgeführt.o condition wird ausgewertet.

o false : for-Anweisung wird beendet.

for ( init-statement condition; expression )

statement

Page 20: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Semantik

o init-statement wird ausgeführt.o condition wird ausgewertet.

o true : Iteration beginnt.o statement wird ausgeführt.

for ( init-statement condition; expression )

statement

Page 21: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Semantik

o init-statement wird ausgeführt.o condition wird ausgewertet.

o true : Iteration beginnt.o statement wird ausgeführt.o expression wird ausgewertet.

for ( init-statement condition; expression )

statement

Page 22: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Semantik

o init-statement wird ausgeführt.o condition wird ausgewertet.

o true : Iteration beginnt.o statement wird ausgeführt.o expression wird ausgewertet.

o false : for-Anweisung wird beendet.

for ( init-statement condition; expression )

statement

Page 23: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Beispiel

for (unsigned int i = 1; i <= n; ++i)

s += i;

Annahme: n == 2 s == 0

Page 24: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Beispiel

for (unsigned int i = 1; i <= n; ++i)

s += i;

Annahme: n == 2 s == 0

i == 1

Page 25: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Beispiel

for (unsigned int i = 1; i <= n; ++i)

s += i;

Annahme: n == 2 s == 0

i == 1 i <= 2 ?

Page 26: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Beispiel

for (unsigned int i = 1; i <= n; ++i)

s += i;

Annahme: n == 2 s == 0

i == 1 true

Page 27: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Beispiel

for (unsigned int i = 1; i <= n; ++i)

s += i;

Annahme: n == 2 s == 0

s == 1 i == 1 true

Page 28: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Beispiel

for (unsigned int i = 1; i <= n; ++i)

s += i;

Annahme: n == 2 s == 0

s == 1 i == 1 true i == 2

Page 29: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Beispiel

for (unsigned int i = 1; i <= n; ++i)

s += i;

Annahme: n == 2 s == 0

s == 1 i == 1 true i == 2 i <= 2 ?

Page 30: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Beispiel

for (unsigned int i = 1; i <= n; ++i)

s += i;

Annahme: n == 2 s == 0

s == 1 i == 1 true i == 2 true

Page 31: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Beispiel

for (unsigned int i = 1; i <= n; ++i)

s += i;

Annahme: n == 2 s == 0

s == 1 i == 1 true s == 3 i == 2 true

Page 32: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Beispiel

for (unsigned int i = 1; i <= n; ++i)

s += i;

Annahme: n == 2 s == 0

s == 1 i == 1 true s == 3 i == 2 true i == 3

Page 33: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Beispiel

for (unsigned int i = 1; i <= n; ++i)

s += i;

Annahme: n == 2 s == 0

s == 1 i == 1 true s == 3 i == 2 true i == 3 i <= 2 ?

Page 34: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Beispiel

for (unsigned int i = 1; i <= n; ++i)

s += i;

Annahme: n == 2 s == 0

s == 1 i == 1 true s == 3 i == 2 true i == 3 false

Page 35: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Beispiel

for (unsigned int i = 1; i <= n; ++i)

s += i;

Annahme: n == 2 s == 0

s == 1 i == 1 true s == 3 i == 2 true i == 3 false s == 3

Page 36: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Der kleine Gauss (1777-1855)

o Mathe-Lehrer wollte seine Schüler mit folgender Aufgabe beschäftigen:

“berechne die Summe der Zahlen

1 bis 100 !”

Page 37: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Der kleine Gauss (1777-1855)

o Mathe-Lehrer wollte seine Schüler mit folgender Aufgabe beschäftigen:

“berechne die Summe der Zahlen 1 bis 100 !”

o Gauss war nach einer Minute fertig.

Page 38: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Der kleine Gauss (1777-1855)

o Die Lösung von Gauss:o gesuchte Zahl ist 1 + 2 + 3 + ... + 98 + 99 + 100

Page 39: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Der kleine Gauss (1777-1855)

o Die Lösung von Gauss:o gesuchte Zahl ist 1 + 2 + 3 + ... + 98 + 99 + 100o das ist die Hälfte von 1 + 2 + 3 + ... + 98 + 99 + 100

+ 100 + 99 +98 + ... + 3 + 2 + 1

Page 40: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Der kleine Gauss (1777-1855)

o Die Lösung von Gauss:o gesuchte Zahl ist 1 + 2 + 3 + ... + 98 + 99 + 100o das ist die Hälfte von 1 + 2 + 3 + ... + 98 + 99 + 100 + 100 + 99 +98 + ... + 3 + 2 + 1 = 101 +101+101+ ... +101 +101+101

100 mal

Page 41: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Der kleine Gauss (1777-1855)

o Die Lösung von Gauss:o gesuchte Zahl ist 1 + 2 + 3 + ... + 98 + 99 + 100o das ist die Hälfte von 1 + 2 + 3 + ... + 98 + 99 + 100 + 100 + 99 +98 + ... + 3 + 2 + 1 = 10100

Page 42: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Der kleine Gauss (1777-1855)

o Die Lösung von Gauss:o gesuchte Zahl ist 1 + 2 + 3 + ... + 98 + 99 + 100o das ist die Hälfte von 1 + 2 + 3 + ... + 98 + 99 + 100 + 100 + 99 +98 + ... + 3 + 2 + 1 = 10100

Antwort: 5050

Page 43: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

for-Anweisung: Terminierung

for (unsigned int i = 1; i <= n; ++i)

s += i;

Hier und meistens:o expression ändert einen Wert, der in

condition vorkommto nach endlich vielen Iterationen hat

condition Wert false: Terminierung

Page 44: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Endlosschleifen

o sind leicht zu produzieren:

for ( ; ; ) ;

Leere condition hat Wert true

Page 45: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Endlosschleifen

o sind leicht zu produzieren:

for ( ; ; ) ;

Leere expression hat keinen Effekt

Page 46: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Endlosschleifen

o sind leicht zu produzieren:

for ( ; ; ) ;

Null-Anweisungen

Page 47: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Endlosschleifen

o sind leicht zu produzieren:

for (e; v;e)r;

Null-Anweisungen

Page 48: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Endlosschleifen

o sind leicht zu produzieren:

o …aber nicht automatisch zu erkennen.

for (e; v;e)r;

Null-Anweisungen

Page 49: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Halteproblem

Satz (siehe VL von J. Hromkovic):

Es gibt kein C++ Programm, das fürjedes C++ Programm P und jede

EingabeI korrekt feststellen kann, ob dasProgramm P bei Eingabe von I

terminiert.

Page 50: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Beispiel: Primzahltest

n ≥ 2 ist Primzahl genau dann, wennkein d in {2,…,n-1 } ein Teiler von n

ist.

Page 51: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Beispiel: Primzahltest

n ≥ 2 ist Primzahl genau dann, wennkein d in {2,…,n-1 } ein Teiler von n

ist. unsigned int d;for (d = 2; n % d != 0; ++d);

Page 52: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Beispiel: Primzahltest

n ≥ 2 ist Primzahl genau dann, wennkein d in {2,…,n-1 } ein Teiler von n

ist. unsigned int d;for (d = 2; n % d != 0; ++d);

Rumpf ist die Null-Anweisung!

Page 53: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Beispiel: Primzahltest

n ≥ 2 ist Primzahl genau dann, wennkein d in {2,…,n-1 } ein Teiler von n ist.

Beobachtung 1: Nach der for-Anweisung gilt d ≤ n .

unsigned int d;for (d = 2; n % d != 0; ++d);

Page 54: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Beispiel: Primzahltest

n ≥ 2 ist Primzahl genau dann, wennkein d in {2,…,n-1 } ein Teiler von n ist.

Beobachtung 2: n ist Primzahl genau dann wenn d = n

.

unsigned int d;for (d = 2; n % d != 0; ++d);

Page 55: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Beispiel: Primzahltest// Program: prime.cpp// Test if a given natural number is prime.

#include <iostream>

int main (){ // Input unsigned int n; std::cout << "Test if n>1 is prime for n =? "; std::cin >> n;

// Computation: test possible divisors d unsigned int d; for (d = 2; n % d != 0; ++d);

// Output if (d < n) // d is a divisor of n in {2,...,n-1} std::cout << n << " = " << d << " * " << n / d << ".\n"; else // no proper divisor found std::cout << n << " is prime.\n"; return 0;}

Page 56: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Blöcke

o gruppieren mehrere Anweisungen zu einer neuen Anweisung

Page 57: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Blöcke

o gruppieren mehrere Anweisungen zu einer neuen Anweisung

o Beispiele:o int main(){…}

{ statement1 statement2 … statementN }

Block (Rumpf der main-Funktion)

Page 58: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Blöcke

o gruppieren mehrere Anweisungen zu einer neuen Anweisung

o Beispiele:o int main(){…}o

{ statement1 statement2 … statementN }

Block (Schleifenrumpf)

for (unsigned int i = 1; i <= n; ++i) {

s += i;

std::cout << "partial sum is " << s << " \n";

}

Page 59: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Sichtbarkeit

Deklaration in einem Block ist ausserhalb

des Blocks nicht “sichtbar”.

Page 60: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Sichtbarkeit

Deklaration in einem Block ist ausserhalb

des Blocks nicht “sichtbar”. int main (){ { int i = 2; } std::cout << i; // Fehler: undeklarierter Name return 0;}

block

Page 61: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Kontrollanweisung “=“ Block

Kontrollanweisungen verhalten sich in

diesem Zusammenhang wie Blöcke:

int main()

{

for (unsigned int i = 0; i < 10; ++i) s += i;

std::cout << i; // Fehler: undeklarierter Name

return 0;

}

Page 62: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Deklarative Region...

...einer Deklaration:

Programmteil, in dem diese vorkommt:

Page 63: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Deklarative Region...

...einer Deklaration:

Programmteil, in dem diese vorkommt:

o Block{

int i = 2;

}

Page 64: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Deklarative Region...

...einer Deklaration:

Programmteil, in dem diese vorkommt:

o Blocko Kontrollanweisungfor (unsigned int i = 0; i < 10; ++i) s += i;

Page 65: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Deklarative Region...

...einer Deklaration:

Programmteil, in dem diese vorkommt:

o Blocko Kontrollanweisungo Funktionsrumpf

int main() { int i = 2; return 0;}

Page 66: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Potentieller Gültigkeitsbereich

...einer Deklaration:Programmteil, in dem diese

potentiellsichtbar ist (ab Deklaration bis Ende

derdeklarativen Region):

Page 67: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Potentieller Gültigkeitsbereich

...einer Deklaration:Programmteil, in dem diese

potentiellsichtbar ist (ab Deklaration bis Ende

derdeklarativen Region):

{

int i = 2;

}

for (unsigned int i = 0; i < 10; ++i) s += i;

int main() { int i = 2; return 0;}

Page 68: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Gültigkeitsbereich...

...einer Deklaration:o Programmteil, in

dem diese sichtbar ist (d.h. benutzt werden kann)

Page 69: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Gültigkeitsbereich...

...einer Deklaration:o Programmteil, in

dem diese sichtbar ist (d.h. benutzt werden kann)

o Meistens gleich dem potentiellem Gültig-keitsbereich...

Page 70: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Gültigkeitsbereich...

...einer Deklaration:o Programmteil, in

dem diese sichtbar ist (d.h. benutzt werden kann)

o Meistens gleich dem potentiellem Gültig-keitsbereich...

o ...aber nicht immer!

#include <iostream>

int main(){ int i = 2;

for (int i = 0; i < 5; ++i) // outputs 0, 1, 2, 3, 4 std::cout << i;

// outputs 2 std::cout << i; return 0;}

Page 71: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Gültigkeitsbereich...#include <iostream>

int main(){ int i = 2;

for (int i = 0; i < 5; ++i) // outputs 0, 1, 2, 3, 4 std::cout << i;

// outputs 2 std::cout << i; return 0;}

Deklaration des gleichen Namens im potentiellen Gültigkeitsbereich einer Deklaration ist erlaubt (aber nicht empfohlen).

Page 72: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Gültigkeitsbereich...

...einer Deklaration:

o PotentiellerGültig-keitsbereich...

#include <iostream>

int main(){ int i = 2;

for (int i = 0; i < 5; ++i) // outputs 0, 1, 2, 3, 4 std::cout << i;

// outputs 2 std::cout << i; return 0;}

Page 73: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Gültigkeitsbereich...

...einer Deklaration:

o PotentiellerGültig-keitsbereich minus potentielle Gültig-keitsbereiche von Deklarationen des gleichen Namens darin

#include <iostream>

int main(){ int i = 2;

for (int i = 0; i < 5; ++i) // outputs 0, 1, 2, 3, 4 std::cout << i;

// outputs 2 std::cout << i; return 0;}

Page 74: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Automatische Speicherdauer

Lokale Variablen (Deklaration in Block)

o werden bei jedem Erreichen ihrer Deklaration neu “angelegt”, d.h.o Speicher / Adresse wird zugewieseno evtl. Initialisierung wird ausgeführt

Page 75: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Automatische Speicherdauer

Lokale Variablen (Deklaration in Block)o werden bei jedem Erreichen ihrer

Deklaration neu “angelegt”, d.h.o Speicher / Adresse wird zugewieseno evtl. Initialisierung wird ausgeführt

o werden am Ende ihrer deklarativen Region “abgebaut” (Speicher wird freigegeben, Adresse wird ungültig)

Page 76: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Automatische Speicherdauer

int i = 5;for (int j = 0; j < 5; ++j) { std::cout << ++i; // outputs int k = 2; std::cout << --k; // outputs }

Page 77: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Automatische Speicherdauer

int i = 5;for (int j = 0; j < 5; ++j) { std::cout << ++i; // outputs 6, 7, 8, 9, 10 int k = 2; std::cout << --k; // outputs 1, 1, 1, 1, 1}

Page 78: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while-Anweisungen

o statement : beliebige Anweisung (Rumpf der while-Anweisung)

o condition : konvertierbar nach bool

while ( condition )

statement

Page 79: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while-Anweisungen

o ist äquivalent zu

while ( condition )

statement

for ( ; condition ; )

statement

Page 80: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while-Anweisung: Semantik

o condition wird ausgewertet.o true : Iteration beginnt.

o statement wird ausgeführt.o false : while-Anweisung wird

beendet.

while ( condition )

statement

Page 81: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while-Anweisung: warum?

o bei for-Anweisung ist oft expression allein für den Fortschritt zuständig (“Zählschleife”)for (unsigned int i = 1; i <= n; ++i)

s += i;

Page 82: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while-Anweisung: warum?

o bei for-Anweisung ist oft expression allein für den Fortschritt zuständig (“Zählschleife”)

o Falls der Fortschritt nicht so einfach ist, kann while besser lesbar sein

for (unsigned int i = 1; i <= n; ++i)

s += i;

Page 83: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while-Anweisung: Beispiel

Collatz-Folge für eine natürliche Zahl n :

o n0 = n

ni-1 / 2, falls ni-1 gerade

o ni = ,i ≥1

3 ni-1 + 1, falls ni-1 ungerade

Page 84: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while-Anweisung: Beispiel

Collatz-Folge für eine natürliche Zahl n :

o n0 = n

ni-1 / 2, falls ni-1 gerade

o ni = ,i ≥1

3 ni-1 + 1, falls ni-1 ungeraden = 5: 5

Page 85: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while-Anweisung: Beispiel

Collatz-Folge für eine natürliche Zahl n :

o n0 = n

ni-1 / 2, falls ni-1 gerade

o ni = ,i ≥1

3 ni-1 + 1, falls ni-1 ungeraden = 5: 5, 16

Page 86: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while-Anweisung: Beispiel

Collatz-Folge für eine natürliche Zahl n :

o n0 = n

ni-1 / 2, falls ni-1 gerade

o ni = ,i ≥1

3 ni-1 + 1, falls ni-1 ungeraden = 5: 5, 16, 8

Page 87: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while-Anweisung: Beispiel

Collatz-Folge für eine natürliche Zahl n :

o n0 = n

ni-1 / 2, falls ni-1 gerade

o ni = ,i ≥1

3 ni-1 + 1, falls ni-1 ungeraden = 5: 5, 16, 8, 4

Page 88: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while-Anweisung: Beispiel

Collatz-Folge für eine natürliche Zahl n :

o n0 = n

ni-1 / 2, falls ni-1 gerade

o ni = ,i ≥1

3 ni-1 + 1, falls ni-1 ungeraden = 5: 5, 16, 8, 4, 2

Page 89: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while-Anweisung: Beispiel

Collatz-Folge für eine natürliche Zahl n :

o n0 = n

ni-1 / 2, falls ni-1 gerade

o ni = ,i ≥1

3 ni-1 + 1, falls ni-1 ungeraden = 5: 5, 16, 8, 4, 2, 1

Page 90: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while-Anweisung: Beispiel

Collatz-Folge für eine natürliche Zahl n :

o n0 = n

ni-1 / 2, falls ni-1 gerade

o ni = ,i ≥1

3 ni-1 + 1, falls ni-1 ungeraden = 5: 5, 16, 8, 4, 2, 1, 4

Page 91: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while-Anweisung: Beispiel

Collatz-Folge für eine natürliche Zahl n :

o n0 = n

ni-1 / 2, falls ni-1 gerade

o ni = ,i ≥1

3 ni-1 + 1, falls ni-1 ungeraden = 5: 5, 16, 8, 4, 2, 1, 4, 2

Page 92: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while-Anweisung: Beispiel

Collatz-Folge für eine natürliche Zahl n :

o n0 = n

ni-1 / 2, falls ni-1 gerade

o ni = ,i ≥1

3 ni-1 + 1, falls ni-1 ungeraden = 5: 5, 16, 8, 4, 2, 1, 4, 2, 1

Page 93: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while-Anweisung: Beispiel

Collatz-Folge für eine natürliche Zahl n :

o n0 = n

ni-1 / 2, falls ni-1 gerade

o ni = ,i ≥1

3 ni-1 + 1, falls ni-1 ungeraden = 5: 5, 16, 8, 4, 2, 1, 4, 2, 1, …

Page 94: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while-Anweisung: Beispiel

Collatz-Folge für eine natürliche Zahl n :

o n0 = n

ni-1 / 2, falls ni-1 gerade

o ni = ,i ≥1

3 ni-1 + 1, falls ni-1 ungeradeCollatz-Folge wird repetitiv, sobald die Zahl 1 erscheint.

Page 95: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while-Anweisung: Beispiel

// Inputstd::cout << "Compute the Collatz sequence for n =? ";unsigned int n;std::cin >> n; // Iterationwhile (n > 1) { // stop if 1 is reached if (n % 2 == 0) // n is even n = n / 2; else // n is odd n = 3 * n + 1; std::cout << n << " ";}

Page 96: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Die Collatz-Folgen = 27: 82, 41, 124, 62, 31, 94, 47, 142, 71, 214, 107,

322, 161, 484, 242, 121, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732, 866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1

Page 97: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Die Collatz-Folge

Erscheint die 1 für jedes n ?

Page 98: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Die Collatz-Folge

Erscheint die 1 für jedes n ?

o Man vermutet es, aber niemand kann es beweisen!

o Falls nicht, so ist die while-Anweisung zur Berechnung der Collatz-Folge für einige n theoretisch eine Endlosschleife!

Page 99: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

do-Anweisung

o statement : beliebige Anweisung (Rumpf der do-Anweisung)

o expression : konvertierbar nach bool o condition bei for, while erlaubt mehr...

do

statement

while ( expression ) ;

Page 100: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

do-Anweisung

o ist äquivalent zu

do

statement

while ( expression ) ;

for (bool firsttime = true; firsttime || expression; firsttime = false)

statement

Page 101: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

do-Anweisung: Semantik

o Iteration beginnt:o statement wird ausgeführt.

o expression wird ausgewertet.o true: o false: do-Anweisung wird beendet.

do

statement

while ( expression ) ;

Page 102: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

do-Anweisung: BeispielTaschenrechner: addiere Zahlenfolge (bei 0 ist

Schluss)

int a; // next input valueint s = 0; // sum of values so far do { std::cout << "next number =? "; std::cin >> a; s += a; std::cout << "sum = " << s << "\n";} while (a != 0);

Page 103: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Zusammenfassung

o Auswahl (bedingte Verzweigungen):o if- und if-else-Anweisung

o Iteration (bedingte Sprünge):o for-Anweisungo while-Anweisungo do-Anweisung

o Blöcke und Gültigkeit von Deklarationen

Page 104: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Sprunganweisungen

o realisieren unbedingte Sprüngeo sind wie while und do praktisch,

aber nicht unverzichtbaro sollten vorsichtig eingesetzt

werden: da wo sie den Kontrollfluss vereinfachen, anstatt ihn komplizierter zu machen

Page 105: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

break-Anweisung

o umschliessende Iterationsanweisung wird sofort beendet.

o nützlich, um Schleife “in der Mitte” abbrechen zu können

break;

Page 106: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

break-Anweisung: BeispielTaschenrechner: addiere Zahlenfolge (bei 0 ist Schluss)

int a; // next input valueint s = 0; // sum of values so far do { std::cout << "next number =? "; std::cin >> a;

s += a; // irrelevant in letzter Iteration std::cout << "sum = " << s << "\n";} while (a != 0);

Page 107: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

break-Anweisung: BeispielTaschenrechner: unterdrücke irrelevante Addition von 0

int a; // next input valueint s = 0; // sum of values so far do { std::cout << "next number =? "; std::cin >> a; if (a == 0) break; // Abbruch in der Mitte s += a; std::cout << "sum = " << s << "\n";} while (true);

Page 108: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

break-Anweisung: BeispielTaschenrechner: äquivalent und noch etwas einfacher:

int a; // next input valueint s = 0; // sum of values so far for (;;) { // forever... std::cout << "next number =? "; std::cin >> a; if (a == 0) break; // Abbruch in der Mitte s += a; std::cout << "sum = " << s << "\n";}

Page 109: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

break-Anweisung: BeispielTaschenrechner: Version ohne break (wertet a stets

zweimal aus und braucht zusätzlichen Block):

int a = 1; // next input valueint s = 0; // sum of values so far for (; a != 0;) { std::cout << "next number =? "; std::cin >> a; if (a != 0) {

s += a; std::cout << "sum = " << s << "\n"; }}

Page 110: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

continue-Anweisung

o Kontrolle überspringt den Rest des Rumpfes der umschliessenden Iterationsanweisung

o Iterationsanweisung wird aber nicht abgebrochen

continue;

Page 111: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

continue-Anweisung: Beispiel

Taschenrechner: ignoriere alle negativen Eingaben:

for (;;) { std::cout << "next number =? "; std::cin >> a; if (a < 0) continue; // springe zu } if (a == 0) break; s += a; std::cout << "sum = " << s << "\n";}

Page 112: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Äquivalenz von Iterationsanweisungen

Wir haben gesehen:o while und do können mit Hilfe von for simuliert werden

Page 113: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Äquivalenz von Iterationsanweisungen

Wir haben gesehen:o while und do können mit Hilfe von for simuliert werden

Es gilt aber:o alle drei Iterationsanweisungen

haben die gleiche “Ausdruckskraft” (Skript)

Page 114: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Äquivalenz von Iterationsanweisungen

Wir haben gesehen:o while und do können mit Hilfe von for simuliert werden

Es gilt aber:o alle drei Iterationsanweisungen

haben die gleiche “Ausdruckskraft” (Skript)

Nicht ganz so einfach!

Page 115: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Beispiel: for mittels while

Gegeben eine for-Anweisung

finde äquivalente while-Anweisung!

for ( init-statement condition; expression )

statement

Page 116: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while kann for simulieren

Gegeben eine for-Anweisung

finde äquivalente while-Anweisung!

Erster Versuch:

for ( init-statement condition; expression )

statement

init-statementwhile ( condition ) { statement expression;}

Page 117: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

while kann for simulieren

Gegeben eine for-Anweisung

finde äquivalente while-Anweisung!

Erster Versuch:

for ( init-statement condition; expression )

statement

init-statementwhile ( condition ) { statement expression;}

geht nicht, falls statement ein continue; enthält!

Page 118: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Auswahl der “richtigen” Iterationsanweisung

Ziele: Lesbarkeit, Prägnanz. Insbesondere

o wenige Anweisungeno wenige Zeilen Codeo einfacher Kontrollflusso einfache Ausdrücke

Page 119: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Auswahl der “richtigen” Iterationsanweisung

Ziele: Lesbarkeit, Prägnanz. Insbesondereo wenige Anweisungeno wenige Zeilen Codeo einfacher Kontrollflusso einfache Ausdrücke

Ziele sind oft nicht gleichzeitig erreichbar.

Page 120: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Auswahl der “richtigen” Iterationsanweisung: Beispiel

Ausgabe der ungeraden Zahlen in {0,...,100}:

Erster (korrekter) Versuch:

for (unsigned int i = 0; i < 100; ++i) { if (i % 2 == 0) continue; std::cout << i << "\n";}

Page 121: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Auswahl der “richtigen” Iterationsanweisung: Beispiel

Ausgabe der ungeraden Zahlen in {0,...,100}:

Weniger Anweisungen, weniger Zeilen:

for (unsigned int i = 0; i < 100; ++i) if (i % 2 != 0) std::cout << i << "\n";

Page 122: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Auswahl der “richtigen” Iterationsanweisung: Beispiel

Ausgabe der ungeraden Zahlen in {0,...,100}:

Weniger Anweisungen, einfacherer Kontrollfluss:

for (unsigned int i = 1; i < 100; i += 2) std::cout << i << "\n";

Page 123: Kontrollanweisungen Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen

Auswahl der “richtigen” Iterationsanweisung: Beispiel

Ausgabe der ungeraden Zahlen in {0,...,100}:

Weniger Anweisungen, einfacherer Kontrollfluss:

Das ist hier die “richtige” Iterationsanweisung !

for (unsigned int i = 1; i < 100; i += 2) std::cout << i << "\n";