ich war hier: ProzProg5Kontrollstrukturen

Version [22667]

Dies ist eine alte Version von ProzProg5Kontrollstrukturen erstellt von RonnyGertler am 2013-03-28 16:17:54.

 

 (image: http://wdb.fh-sm.de/uploads/QualipaktLehre/BMBF_Logo_klein.jpg)

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


 (image: http://ife.erdaxo.de/uploads/ProzProg5Kontrollstrukturen/pp21.gif)


Programmablauf


Linearer Ablauf:

 (image: http://ife.erdaxo.de/uploads/ProzProg5Kontrollstrukturen/pp22.gif)

Verzweigung:

 (image: http://ife.erdaxo.de/uploads/ProzProg5Kontrollstrukturen/pp23.gif)

Wiederholung:

 (image: http://ife.erdaxo.de/uploads/ProzProg5Kontrollstrukturen/pp24.gif)


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:

 (image: http://ife.erdaxo.de/uploads/ProzProg5Kontrollstrukturen/pp25.gif)


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.

 (image: http://ife.erdaxo.de/uploads/ProzProg5Kontrollstrukturen/pp26.gif)


5.2. Auswahlanweisungen


if ... else-Anweisung


Eine if-Anweisung (Verzweigung, bedingte Anweisung) realisiert die Auswahl zwischen zwei Alternativen.

Syntax (zwei Formen):

 (image: http://ife.erdaxo.de/uploads/ProzProg5Kontrollstrukturen/pp27.gif)

Ein Rumpf ist eine Anweisung bzw. ein Block. Der Ausdruck (Bedingung) liefert ein bool-Ergebnis.

Semantik als Struktogramm (Nassi-Shneidermann-Diagramm):

 (image: http://ife.erdaxo.de/uploads/ProzProg5Kontrollstrukturen/pp28.gif)

Beispiel:

if (a < b)  max = b;
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:

 (image: http://ife.erdaxo.de/uploads/ProzProg5Kontrollstrukturen/pp29.gif)

1) Ein Rumpf ist eine Anweisung bzw. ein Block.
2) Der Ausdruck muss ganzzahlig sein.
3) k1 bis kN sind Literale.



Semantik als Struktogramm:

 (image: http://ife.erdaxo.de/uploads/ProzProg5Kontrollstrukturen/pp30.gif)


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";
    }


⇒ 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

 (image: http://ife.erdaxo.de/uploads/ProzProg5Kontrollstrukturen/pp31.gif)


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 &#8217;a&#8217;:  case &#8217;e&#8217;: case &#8217;i&#8217;: case &#8217;o&#8217;: case &#8217;u&#8217;:
          case &#8217;A&#8217;: case &#8217;E&#8217;: case &#8217;I&#8217;: case &#8217;O&#8217;: case &#8217;U&#8217;:
          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:

 (image: http://ife.erdaxo.de/uploads/ProzProg5Kontrollstrukturen/pp32.gif)

Ein Rumpf ist eine Anweisung bzw. ein Block.

Semantik als Struktogramm:

 (image: http://ife.erdaxo.de/uploads/ProzProg5Kontrollstrukturen/pp33.gif)

Beispiel:

double x = exp(1);
 for(int i = 1;  i < 20;  i++)
{      
     cout << setprecision(i) << x << endl;
}


⇒ Demo 3. for


for –Schleife in Details


1. Als Ergebnis des Bedingungsausdruckes (Ausdruck2) wird ein bool-Wert erwartet. Der Bedingungsausdruck wird bei jeder Wiederholung neu ausgewertet.

2. Die for-Schleife wird zum Durchzählen einer Laufvariable (Zählvariable, Schleifenzähler) mit bekannter Anzahl von Schleifendurchläufen empfohlen.

3. Alle drei Ausdrücke im Kopf der Schleife sind optional, nicht aber die trennenden Semikolons.

Beispiel der Endlosschleife: for( ; ; ) ;

4. Die Laufvariable wird oft im Ausdruck1 definiert und gilt dann lokal innerhalb der Schleife jedoch nicht mehr nach der Schleife.

5. Der Rumpf kann mehrmals oder niemals ausgeführt werden.


Komma-Operator


Der Komma-Operator (Auflistungs-Operator) erlaubt die Verwendung von mehreren Ausdrücken an Stellen, an denen nur ein Ausdruck stehen darf. Hauptsächlich wird er im ersten und letzten Ausdruck des Steuerkopfes der for-Anweisung verwendet.

Der Mißbrauch des Komma-Operators zeigt den schlechten Programmierstil, z.B.:

for(int i=1; i<20; cout<<setprecision(i)<<x<<endl, i++);


Der Wert des durch den Komma-Operator gebildeten Gesamtausdrucks ist gleich dem Wert des rechten Teil-Ausdrucks.

Fehlerhaftes Beispiel:
for(float x=-1;  x<1;  x+=0,5) cout << x << endl;



while-Schleife


Kopfgesteuerte Schleife.

Syntax:

 (image: http://ife.erdaxo.de/uploads/ProzProg5Kontrollstrukturen/pp34.gif)

Ein Rumpf ist eine Anweisung bzw. ein Block.

Semantik mit dem Struktogramm:

 (image: http://ife.erdaxo.de/uploads/ProzProg5Kontrollstrukturen/pp35.gif)

Der Rumpf kann mehrmals oder niemals ausgeführt werden.

Beispiel:

int summe = 0;    
int zahl = 1;
while (zahl <= 100)  
{     summe += zahl;  
       zahl++;  
}

























CategoryProzProg
Diese Seite wurde noch nicht kommentiert.
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki