Version [22666]
Dies ist eine alte Version von ProzProg5Kontrollstrukturen erstellt von RonnyGertler am 2013-03-28 15:57:46.
Prozedurale Programmierung - Kapitel 5 - Kontrollstrukturen
Inhalte von Dr. E. Nadobnyh
Grundbegriffe
Anweisungen sind Berechnungen (Befehle), die ausgeführt werden, um Daten zu verarbeiten.
Kontrollstrukturen (Steuerstrukturen, Kontrollanweisungen) definieren die Reihenfolge, in der Anweisungen durchgeführt werden. Jede Kontrollstruktur ist selbst eine Anweisung.
Es gibt vier grundlegende Kontrollstrukturen:
1. Sequenz (Folge),
2. Auswahl (Alternative, Verzweigung, Selektion),
3. Schleife (Zyklus, Wiederholung) und
4. Unterprogramm (Aufruf).
Die Mächtigkeit einer Programmiersprache zeigt sich beim Einsatz von Kontrollstrukturen, die in Abhängigkeit von Variablenwerten Abweichungen von linearen Folgen der Anweisungen ermöglichen.
Überblick
Programmablauf
Linearer Ablauf:
Verzweigung:
Wiederholung:
5.1. Sequenzen
1. Eine Sequenz ist eine Reihenfolge von
a) einfachen Anweisungen,
b) Kontrollstrukturen und
c) Blöcken,
welche der Reihe nach abgearbeitet werden.
2. Einfache Anweisung besteht aus:
a) einer Zuweisung, z.B.: a=a+1;
b) einem Aufruf, z.B.: printf(„%d“, a+1); oder
c) einem Ausdruck dem ein Semikolon folgt, z.B.: a++;
Besonderheiten:
a) Eine leere Anweisung besteht nur aus dem Semikolon.
b) Ein Ausdruck ist eine Folge von Operatoren und Operanden, z.B.: a+4;
c) Jede Zuweisung ist in C/C++ ein Ausdruck, z.B.:
a=b=c;
Block
Ein Block ist eine Zusammenfassung von mehreren Anweisungen und Vereinbarungen, die in geschweiften Klammern eingeschlossen sind.
Synonyme: Verbundanweisung, unbenannter Block, Anweisungsblock, zusammengesetzte Anweisungen.
Ein Block ist syntaktisch äquivalent zu einer einfachen Anweisung. Beispiele für Blöcke sind Körper von Funktionen oder Kontrollstrukturen if, else, while, for.
Blöcke sind hierarchisch bzw. baumartig organisiert. Es gibt Sequenzen von Blöcken und geschachtelte Blöcke. Beispiel:
Gültigkeitsbereich
Ein Block kann Namen-Vereinbarungen enthalten, z.B. Variablen-Definitionen. Diese Variablen werden als lokale (auto) Variablen bezeichnet. Ihre Namen gelten nicht im gesamten Programm, sondern nur in bestimmten Gültigkeitsbereichen.
Der Gültigkeitsbereich (scope) eines Namens ist der unmittelbar umgebende Block und alle tiefer geschachtelte Blöcke.
Ein Name kann ab der Stelle der Definition bis zum Ende des Blocks benutzt werden, aber nicht vorher. Variablen werden beim Verlassen des Blocks, in dem sie definiert sind, zerstört. Der Wert geht verloren und kann nicht mehr restauriert werden.
Variablen werden als globale bezeichnet, wenn sie außerhalb eines Blocks definiert sind.
Gültigkeitsbereich. Beispiel
Gültigkeitsbereich von a und g sind beide Blöcke. Gültigkeitsbereich von b ist nur der innere Block.
5.2. Auswahlanweisungen
if ... else-Anweisung
Eine if-Anweisung (Verzweigung, bedingte Anweisung) realisiert die Auswahl zwischen zwei Alternativen.
Syntax (zwei Formen):
Ein Rumpf ist eine Anweisung bzw. ein Block. Der Ausdruck (Bedingung) liefert ein bool-Ergebnis.
Semantik als Struktogramm (Nassi-Shneidermann-Diagramm):
Beispiel:
if (a < b) max = b;
else max = a;
else max = a;
Geschachtelte Alternativen
Beide Rümpfe können ihrerseits neue, untergeordnete Alternativen sein, d.h. mehrere if-else-Anweisungen können geschachtelt werden.
Beispiel: Berechnung des Vorzeichens einer Zahl x. Ergebnis sign soll +1 für positive Zahlen, -1 für negative Zahlen und 0 für Null erhalten.
Folgende Varianten sind äquivalent:
if(x > 0) sign = 1; if(x < 0) sign = -1; if(x == 0) sign = 0; |
if(x > 0) sign = 1; else if(x < 0) sign = -1; else sign = 0; |
Mehrdeutigkeit: zu welchem if gehört das else?
if(x > 0) if(x
Eine switch-Anweisung (Verteiler) realisiert die Auswahl zwischen mehreren Alternativen.
Syntax:
1) Ein Rumpf ist eine Anweisung bzw. ein Block.
2) Der Ausdruck muss ganzzahlig sein.
3) k1 bis kN sind Literale.
Semantik als Struktogramm:
switch-Ablauf
1. Der Ausdruck in switch wird ausgewertet.
2. Der Ausdruckswert wird mit allen Literalen verglichen.
3. Falls passendes Literal gefunden wird, wird entsprechender Rumpf ausgeführt.
4. Ansonsten wird default-Rumpf ausgeführt.
5. break verlässt die switch-Konstruktion.
Beispiel. Wochentag als Nummer :
int tag; cin >> tag;
switch (tag)
{ case 6: cout << "Samstag"; break;
...
case 5: cout << "Freitag"; break;
default: cout<< "FEHLER";
}
switch (tag)
{ case 6: cout << "Samstag"; break;
...
case 5: cout << "Freitag"; break;
default: cout<< "FEHLER";
}
⇒ Demo 2. switch
switch-Besonderheiten
1) Die switch–Anweisung ist eine Verallgemeinerung der bedingten Anweisung
2) Die Anordnungsreihenfolge ist beliebig.
3) default-Anweisung ist optional. Wenn default fehlt, wird keine Anweisung ausgeführt.
4) Gleiche Literale sind unzulässig. Compiler prüft und erkennt Duplikate.
5) Eine echte Mehrfachauswahl wird durch die switch-Anweisung erst zusammen mit der break-Anweisung realisiert.
6) break sind optional. Ohne break werden auch andere Rümpfe ausgeführt, welche nach dem ausgewählten Rumpf folgen.
switch-Anweisung mit und ohne break
Mehrfache Literale
Eine Alternative kann mit mehreren Literalen begonnen werden. Das ist dann nützlich, wenn bei unterschiedlichen Werten die gleiche Alternative betreten werden soll.
Beispiel:
char c;
...
switch (c)
{ case ’a’: case ’e’: case ’i’: case ’o’: case ’u’:
case ’A’: case ’E’: case ’I’: case ’O’: case ’U’:
cout << "c ist ein Vokal" << endl;
break;
default: cout << "c ist kein Vokal" << endl;
}
...
switch (c)
{ case ’a’: case ’e’: case ’i’: case ’o’: case ’u’:
case ’A’: case ’E’: case ’I’: case ’O’: case ’U’:
cout << "c ist ein Vokal" << endl;
break;
default: cout << "c ist kein Vokal" << endl;
}
5.3. Schleifen
for-Schleife
for-Schleife ist eine kopfgesteuerte Schleife (Zählschleife) mit freier Wahl der Schrittweite.
Syntax:
Ein Rumpf ist eine Anweisung bzw. ein Block.
Semantik als Struktogramm:
Beispiel:
double x = exp(1);
for(int i = 1; i < 20; i++)
{
cout << setprecision(i) << x << endl;
}
for(int i = 1; i < 20; i++)
{
cout << setprecision(i) << x << endl;
}
CategoryProzProg