kontrollanweisungen auswahlanweisungen, iterationsanweisungen, blöcke, sprunganweisungen
TRANSCRIPT
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”
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
Auswahlanweisungen
realisieren “Verzweigungen”
o if Anweisungo if-else Anwseisung
if-Anweisung
o statement : beliebige Anweisung (Rumpf der if-Anweisung)
o condition : konvertierbar nach bool
if ( condition )
statement
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.
if-else Anweisung
o condition : konvertierbar nach boolo statement1 : Rumpf des if-Zweiges o statement2 : Rumpf des else-
Zweiges
if ( condition )
statement1
else
statement2
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.
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:
Iterationsanweisungen
realisieren “Schleifen”
o for-Anweisungo while-Anweisungo do-Anweisung
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;}
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
for-Anweisung
for ( init-statement condition; expression )
statement
for (unsigned int i = 1; i <= n; ++i)
s += i;
Deklarationsanweisung:
for-Anweisung
for ( init-statement condition; expression )
statement
for (unsigned int i = 1; i <= n; ++i)
s += i;
Ausdruck vom Typ bool:
for-Anweisung
for ( init-statement condition; expression )
statement
for (unsigned int i = 1; i <= n; ++i)
s += i;
Ausdruck vom Typ unsigned int:
for-Anweisung
for ( init-statement condition; expression )
statement
for (unsigned int i = 1; i <= n; ++i)
s += i; // Rumpf
Ausdrucksanweisung:
for-Anweisung: Semantik
o init-statement wird ausgeführt.
for ( init-statement condition; expression )
statement
for-Anweisung: Semantik
o init-statement wird ausgeführt.o condition wird ausgewertet.
o true : Iteration beginnt.
for ( init-statement condition; expression )
statement
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
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
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
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
for-Anweisung: Beispiel
for (unsigned int i = 1; i <= n; ++i)
s += i;
Annahme: n == 2 s == 0
for-Anweisung: Beispiel
for (unsigned int i = 1; i <= n; ++i)
s += i;
Annahme: n == 2 s == 0
i == 1
for-Anweisung: Beispiel
for (unsigned int i = 1; i <= n; ++i)
s += i;
Annahme: n == 2 s == 0
i == 1 i <= 2 ?
for-Anweisung: Beispiel
for (unsigned int i = 1; i <= n; ++i)
s += i;
Annahme: n == 2 s == 0
i == 1 true
for-Anweisung: Beispiel
for (unsigned int i = 1; i <= n; ++i)
s += i;
Annahme: n == 2 s == 0
s == 1 i == 1 true
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
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 ?
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
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
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
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 ?
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
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
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 !”
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.
Der kleine Gauss (1777-1855)
o Die Lösung von Gauss:o gesuchte Zahl ist 1 + 2 + 3 + ... + 98 + 99 + 100
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
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
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
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
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
Endlosschleifen
o sind leicht zu produzieren:
for ( ; ; ) ;
Leere condition hat Wert true
Endlosschleifen
o sind leicht zu produzieren:
for ( ; ; ) ;
Leere expression hat keinen Effekt
Endlosschleifen
o sind leicht zu produzieren:
for ( ; ; ) ;
Null-Anweisungen
Endlosschleifen
o sind leicht zu produzieren:
for (e; v;e)r;
Null-Anweisungen
Endlosschleifen
o sind leicht zu produzieren:
o …aber nicht automatisch zu erkennen.
for (e; v;e)r;
Null-Anweisungen
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.
Beispiel: Primzahltest
n ≥ 2 ist Primzahl genau dann, wennkein d in {2,…,n-1 } ein Teiler von n
ist.
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);
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!
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);
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);
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;}
Blöcke
o gruppieren mehrere Anweisungen zu einer neuen Anweisung
Blöcke
o gruppieren mehrere Anweisungen zu einer neuen Anweisung
o Beispiele:o int main(){…}
{ statement1 statement2 … statementN }
Block (Rumpf der main-Funktion)
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";
}
Sichtbarkeit
Deklaration in einem Block ist ausserhalb
des Blocks nicht “sichtbar”.
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
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;
}
Deklarative Region...
...einer Deklaration:
Programmteil, in dem diese vorkommt:
Deklarative Region...
...einer Deklaration:
Programmteil, in dem diese vorkommt:
o Block{
int i = 2;
}
Deklarative Region...
...einer Deklaration:
Programmteil, in dem diese vorkommt:
o Blocko Kontrollanweisungfor (unsigned int i = 0; i < 10; ++i) s += i;
Deklarative Region...
...einer Deklaration:
Programmteil, in dem diese vorkommt:
o Blocko Kontrollanweisungo Funktionsrumpf
int main() { int i = 2; return 0;}
Potentieller Gültigkeitsbereich
...einer Deklaration:Programmteil, in dem diese
potentiellsichtbar ist (ab Deklaration bis Ende
derdeklarativen Region):
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;}
Gültigkeitsbereich...
...einer Deklaration:o Programmteil, in
dem diese sichtbar ist (d.h. benutzt werden kann)
Gültigkeitsbereich...
...einer Deklaration:o Programmteil, in
dem diese sichtbar ist (d.h. benutzt werden kann)
o Meistens gleich dem potentiellem Gültig-keitsbereich...
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;}
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).
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;}
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;}
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
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)
Automatische Speicherdauer
int i = 5;for (int j = 0; j < 5; ++j) { std::cout << ++i; // outputs int k = 2; std::cout << --k; // outputs }
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}
while-Anweisungen
o statement : beliebige Anweisung (Rumpf der while-Anweisung)
o condition : konvertierbar nach bool
while ( condition )
statement
while-Anweisungen
o ist äquivalent zu
while ( condition )
statement
for ( ; condition ; )
statement
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
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;
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;
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
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
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
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
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
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
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
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
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
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
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, …
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.
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 << " ";}
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
Die Collatz-Folge
Erscheint die 1 für jedes n ?
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!
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 ) ;
do-Anweisung
o ist äquivalent zu
do
statement
while ( expression ) ;
for (bool firsttime = true; firsttime || expression; firsttime = false)
statement
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 ) ;
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);
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
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
break-Anweisung
o umschliessende Iterationsanweisung wird sofort beendet.
o nützlich, um Schleife “in der Mitte” abbrechen zu können
break;
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);
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);
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";}
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"; }}
continue-Anweisung
o Kontrolle überspringt den Rest des Rumpfes der umschliessenden Iterationsanweisung
o Iterationsanweisung wird aber nicht abgebrochen
continue;
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";}
Äquivalenz von Iterationsanweisungen
Wir haben gesehen:o while und do können mit Hilfe von for simuliert werden
Ä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)
Ä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!
Beispiel: for mittels while
Gegeben eine for-Anweisung
finde äquivalente while-Anweisung!
for ( init-statement condition; expression )
statement
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;}
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!
Auswahl der “richtigen” Iterationsanweisung
Ziele: Lesbarkeit, Prägnanz. Insbesondere
o wenige Anweisungeno wenige Zeilen Codeo einfacher Kontrollflusso einfache Ausdrücke
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.
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";}
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";
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";
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";