Revision [66fda74]
Letzte Änderung am 2020-05-26 20:30:48 durch Oksana Neopagitova
ADDITIONS
<tr>
<td>
if(x > 0) sign = 1; <br/>
</td>
<td>
if(x > 0) sign = 1; <br/>
else sign = 0;
</td>
</tr>
DELETIONS
>><tr>
>>><td>
>> if(x > 0) sign = 1; <br/>
>>></td>
>>><td>
>>>if(x > 0) sign = 1; <br/>
>>> else sign = 0;
>>></td>
>></tr>
Revision [6f64dc6]
Bearbeitet am 2020-05-26 20:29:41 von Oksana Neopagitova
ADDITIONS
![image](/uploads/ProzProg5Kontrollstrukturen/BMBF_Logo_klein.jpg?width=200)

## Prozedurale Programmierung - Kapitel 5 - Kontrollstrukturen

_<span class="right">Inhalte von Dr. E. Nadobnyh</p>_


#### 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](/uploads/ProzProg5Kontrollstrukturen/pp21.gif?width=500)



#### Programmablauf

**Linearer Ablauf:**

![image](/uploads/ProzProg5Kontrollstrukturen/pp22.gif?width=350)

**Verzweigung:**

![image](/uploads/ProzProg5Kontrollstrukturen/pp23.gif?width=300)

**Wiederholung:**

![image](/uploads/ProzProg5Kontrollstrukturen/pp24.gif?width=350)



## 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(&#8222;%d&#8220;, 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](/uploads/ProzProg5Kontrollstrukturen/pp25.gif?width=300)



#### 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 <span style="text-decoration:underline;">Gültigkeitsbereich </span>(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 <span style="text-decoration:underline;">globale </span>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](/uploads/ProzProg5Kontrollstrukturen/pp26.gif?width=350)



## 5.2. Auswahlanweisungen


### if ... else-Anweisung

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

**Syntax (zwei Formen):**

![image](/uploads/ProzProg5Kontrollstrukturen/pp27.gif?width=350)

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

**Semantik** als Struktogramm (Nassi-Shneidermann-Diagramm):

![image](/uploads/ProzProg5Kontrollstrukturen/pp28.gif?width=400)

**Beispiel:**

%%(cpp)
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:

<table class="data" width="80%" style="border:0">
>><tr>
>>><td>
>> if(x > 0) sign = 1; <br/>
if(x < 0) sign = -1; <br/>
if(x
##### 0) sign = 0;
>>></td>
>>><td>
>>>if(x > 0) sign = 1; <br/>
else if(x < 0) sign = -1; <br/>
>>> else sign = 0;
>>></td>

>></tr>
</table>

Mehrdeutigkeit: zu welchem if gehört das else?
if(x > 0) if(x 0) r = 1; else r = 0;

Regel: else gehört immer zum letzten offenen if im gleichen Block. Im Zweifelsfall Blockklammern setzen.

&rArr; Demo 1. if



### switch-Anweisung

Eine switch-Anweisung (Verteiler) realisiert die Auswahl zwischen mehreren Alternativen.

**Syntax**:

![image](/uploads/ProzProg5Kontrollstrukturen/pp29.gif?width=350)

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](/uploads/ProzProg5Kontrollstrukturen/pp30.gif?width=400)


**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 :**

%%(cpp)
int tag; cin >> tag;
>>switch (tag)
>>{ case 6: cout "Samstag"; break;
>>> ...
>>>case 5: cout "Freitag"; break;
>>>default: cout "FEHLER";
>>}
%%

&rArr; Demo 2. switch


**switch-Besonderheiten**

1) Die switch&#8211;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](/uploads/ProzProg5Kontrollstrukturen/pp31.gif?width=500)



#### 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:**

%%(cpp)
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](/uploads/ProzProg5Kontrollstrukturen/pp32.gif?width=350)

Ein Rumpf ist eine Anweisung bzw. ein Block.

**Semantik als Struktogramm:**

![image](/uploads/ProzProg5Kontrollstrukturen/pp33.gif?width=400)

**Beispiel**:

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

&rArr; Demo 3. for



#### for &#8211;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.:

%%(cpp)
for(int i=1; i<20; coutsetprecision(i)xendl, i++);
%%

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

<span style="text-decoration:underline;">Fehlerhaftes </span>Beispiel:
%%(cpp)
for(float x=-1; x<1; x+=0,5) cout x endl;
%%



### while-Schleife

Kopfgesteuerte Schleife.

**Syntax**:

![image](/uploads/ProzProg5Kontrollstrukturen/pp34.gif?width=350)

Ein Rumpf ist eine Anweisung bzw. ein Block.

**Semantik**mit dem Struktogramm:

![image](/uploads/ProzProg5Kontrollstrukturen/pp35.gif?width=400)

Der Rumpf kann mehrmals oder niemals ausgeführt werden.

**Beispiel:**

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



### do ... while-Schleife

Fußgesteuerte Schleife

**Syntax:**
>>>>
![image](/uploads/ProzProg5Kontrollstrukturen/pp36.gif?width=350)

Ein Rumpf ist eine Anweisung bzw. ein Block.

**Semantik**mit dem Struktogramm:

![image](/uploads/ProzProg5Kontrollstrukturen/pp37.gif?width=400)

Der Rumpf wird in jedem Fall wenigstens <span style="text-decoration:underline;">einmal </span>ausgeführt.
>>>
**Beispiel**:

%%(cpp)
int summe = 0; int zahl = 1;
>> do
>> { summe += zahl;
>>>> zahl++;
>> }
>> while (zahl <= 100);
%%
>>


#### Geschachtelte Schleifen

Ein Rumpf einer Schleife ist selbst eine beliebige Anweisung, z.B. untergeordnete, innere Schleife. Übergeordnete Schleife wird als äußere Schleife bezeichnet. Schleifen können beliebig tief geschachtelt werden.

Beispiel. Das folgende Programm erzeugt eine Multiplikationstabelle:

%%(language-ref)
for(int i=1; i<=10; i++)
{ coutsetw(2)i<<" |";
>> for(int j=1; j<=10; j++)
>> { cout<<" "setw(3)i*j;
>> }
>> coutendl;
}
%%

&rArr; Demo 4. geschachtelt



#### Verwendung von Schleifen

Alle Schleifensarten sind gleichwertig: jede könnte durch eine andere ersetzt werden. Sinnvoll ist allerdings eine differenzierte Auswahl:

1. Verwendung der while-Schleife, wenn die Anzahl der Iterationen unbekannt ist und auch Null Durchläufe möglich sind.

2. Verwendung der do...while-Schleife, wenn die Anzahl der Iterationen unbekannt ist und mindestens ein Durchlauf nötig ist.

3. Bevorzugung der for-Schleife insbesondere dann, wenn die Anzahl der Iterationen bekannt ist.

Besondere Aufmerksamkeit ist bei Verwendung der do...while -Schleife geboten. Empirische Untersuchungen haben gezeigt, dass bei der Verwendung der do-Schleife etwa 50% mehr Fehler auftreten als bei Verwendung der while-Schleife.



### Die break-Anweisung

kann in allen Schleifen verwendet werden, um die aktuelle Iteration vorzeitig zu beenden.

**Beispiel:**

%%(cpp)
while (true)
{ . . .
>> if ( . . . ) break;
>> . . .
}
%%

kann auch in switch-Anweisungen verwendet werden.



### Die continue-Anweisung

führt einen Sprung zum Rumpf-Ende aus, um dann mit dem nächsten Schleifendurchlauf fortzufahren.

Beispiel. Die folgenden Varianten sind äquivalent:

![image](/uploads/ProzProg5Kontrollstrukturen/pp38.gif?width=500)



### 5.4. Empfehlungen zum Programmieren


#### Ziel der Empfehlungen

Ein syntaktisch und semantisch korrektes Programm kann Logikfehler enthalten und deswegen die nicht erwarteten Ergebnisse liefern.

Wir können Fehler in unseren Denkansätzen erkennen und versteckte Programmfehler teilweise vermeiden, wenn bei der Programmierung einige Empfehlungen eingehalten werden:

>>1) Lesbarkeit von Programmen,
>>2) Benutzerfreundliche Dialoge,
>>3) Schrittweise Verfeinerung,
>>4) Integrierte Dokumentation,
>>5) Verwendung der problemadäquaten Datentypen,
>>6) Fehlerüberprüfung.



#### Lesbarkeit von Programmen

Einige Empfehlungen und Forderungen werden in der strukturierten Programmierung entwickelt:

1) Programme werden für Menschen geschrieben. Programme sollen so dargestellt werden, dass ihr Ablauf einfach zu erfassen und zu verändern ist.

2) Die Verwendung von expliziten Sprüngen &#8222;goto&#8220; soll prinzipiell vermieden werden.

3) Alle Algorithmen lassen sich prinzipiell aus drei folgenden Konstrukten aufbauen:
>> a) Sequenz,
>> b) if-else-Auswahl und
>> c) while- Schleife.

4) Programme sollen grundsätzlich kommentiert werden.

5) Es ist schwierig, aber auch wichtig treffende, sinnvolle Namen für Funktionen, Variablen u.a. zu finden.

6) Besonders wichtig für die Lesbarkeit ist die saubere Formatierung des Programms bzw. Einrücken von Befehlsfolgen.

7) Die Vernachlässigung von diesen Empfehlungen kann fatale Folge haben, z.B.:

>> a) "Spaghetti-Codes&#8222; sind kaum wartbar;
>> b) Unstrukturierte Programme sind nach kurzer Zeit
>>> unleserlich selbst für den Autor.

&rArr; Demo 5. Strukturierung



#### Benutzerfreundliche Dialoge

Bei der Ausführung muss ein erklärender Text auf dem Bildschirm erscheinen:

1. In der Aufforderung zu einer Eingabe muss die Art der einzugebenden Daten und das erwartete Format beschrieben werden.

2. Bei der Ausgabe muss erklärt werden, welche Daten hier ausgegeben werden.

3. Der Benutzer soll über auftretende Fehler (unkorrekte Eingabe, fehlende Dateien usw. ) informiert werden und zu den möglichen Aktivitäten aufgefordert werden.
DELETIONS
![image](/uploads/ProzProg5Kontrollstrukturen/BMBF_Logo_klein.jpg?width=200)
# Prozedurale Programmierung - Kapitel 5 - Kontrollstrukturen
_<span class="right">Inhalte von Dr. E. Nadobnyh</p>_
#### 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](/uploads/ProzProg5Kontrollstrukturen/pp21.gif?width=500)
#### Programmablauf
**Linearer Ablauf:**

![image](/uploads/ProzProg5Kontrollstrukturen/pp22.gif?width=350)

**Verzweigung:**

![image](/uploads/ProzProg5Kontrollstrukturen/pp23.gif?width=300)
**Wiederholung:**

![image](/uploads/ProzProg5Kontrollstrukturen/pp24.gif?width=350)
## 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(&#8222;%d&#8220;, 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](/uploads/ProzProg5Kontrollstrukturen/pp25.gif?width=300)
#### 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 <span style="text-decoration:underline;">Gültigkeitsbereich </span>(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 <span style="text-decoration:underline;">globale </span>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](/uploads/ProzProg5Kontrollstrukturen/pp26.gif?width=350)
## 5.2. Auswahlanweisungen
### if ... else-Anweisung

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

**Syntax (zwei Formen):**
![image](/uploads/ProzProg5Kontrollstrukturen/pp27.gif?width=350)
Ein Rumpf ist eine Anweisung bzw. ein Block. Der Ausdruck (Bedingung) liefert ein bool-Ergebnis.

**Semantik**als Struktogramm (Nassi-Shneidermann-Diagramm):

![image](/uploads/ProzProg5Kontrollstrukturen/pp28.gif?width=400)
**Beispiel:**
%%(cpp)
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:
<table class="data" width="80%" style="border:0">
>><tr>
>>><td>
>> if(x > 0) sign = 1; <br/>
if(x < 0) sign = -1; <br/>
if(x
##### 0) sign = 0;
>>></td>
>>><td>
>>>if(x > 0) sign = 1; <br/>
else if(x < 0) sign = -1; <br/>
>>> else sign = 0;
>>></td>
>></tr>
</table>
Mehrdeutigkeit: zu welchem if gehört das else?
if(x > 0) if(x 0) r = 1; else r = 0;
Regel: else gehört immer zum letzten offenen if im gleichen Block. Im Zweifelsfall Blockklammern setzen.

&rArr; Demo 1. if
### switch-Anweisung

Eine switch-Anweisung (Verteiler) realisiert die Auswahl zwischen mehreren Alternativen.
**Syntax**:
![image](/uploads/ProzProg5Kontrollstrukturen/pp29.gif?width=350)
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](/uploads/ProzProg5Kontrollstrukturen/pp30.gif?width=400)
**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 :**
%%(cpp)
int tag; cin >> tag;
>>switch (tag)
>>{ case 6: cout "Samstag"; break;
>>> ...
>>>case 5: cout "Freitag"; break;
>>>default: cout "FEHLER";
>>}
%%
&rArr; Demo 2. switch
**switch-Besonderheiten**

1) Die switch&#8211;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](/uploads/ProzProg5Kontrollstrukturen/pp31.gif?width=500)
#### 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:**
%%(cpp)
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](/uploads/ProzProg5Kontrollstrukturen/pp32.gif?width=350)
Ein Rumpf ist eine Anweisung bzw. ein Block.

**Semantik als Struktogramm:**
![image](/uploads/ProzProg5Kontrollstrukturen/pp33.gif?width=400)
**Beispiel**:

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

&rArr; Demo 3. for
#### for &#8211;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.:
%%(cpp)
for(int i=1; i<20; coutsetprecision(i)xendl, i++);
%%
Der Wert des durch den Komma-Operator gebildeten Gesamtausdrucks ist gleich dem Wert des rechten Teil-Ausdrucks.
<span style="text-decoration:underline;">Fehlerhaftes </span>Beispiel:
%%(cpp)
for(float x=-1; x<1; x+=0,5) cout x endl;
%%
### while-Schleife

Kopfgesteuerte Schleife.
**Syntax**:

![image](/uploads/ProzProg5Kontrollstrukturen/pp34.gif?width=350)
Ein Rumpf ist eine Anweisung bzw. ein Block.

**Semantik**mit dem Struktogramm:
![image](/uploads/ProzProg5Kontrollstrukturen/pp35.gif?width=400)
Der Rumpf kann mehrmals oder niemals ausgeführt werden.
**Beispiel:**
%%(cpp)
int summe = 0;
int zahl = 1;
while (zahl <= 100)
{ summe += zahl;
>> zahl++;
}
%%
### do ... while-Schleife

Fußgesteuerte Schleife
**Syntax:**
>>>>
![image](/uploads/ProzProg5Kontrollstrukturen/pp36.gif?width=350)
Ein Rumpf ist eine Anweisung bzw. ein Block.

**Semantik**mit dem Struktogramm:
![image](/uploads/ProzProg5Kontrollstrukturen/pp37.gif?width=400)
Der Rumpf wird in jedem Fall wenigstens <span style="text-decoration:underline;">einmal </span>ausgeführt.
>>>
**Beispiel**:
%%(cpp)
int summe = 0; int zahl = 1;
>> do
>> { summe += zahl;
>>>> zahl++;
>> }
>> while (zahl <= 100);
%%
>>
#### Geschachtelte Schleifen

Ein Rumpf einer Schleife ist selbst eine beliebige Anweisung, z.B. untergeordnete, innere Schleife. Übergeordnete Schleife wird als äußere Schleife bezeichnet. Schleifen können beliebig tief geschachtelt werden.

Beispiel. Das folgende Programm erzeugt eine Multiplikationstabelle:
%%(language-ref)
for(int i=1; i<=10; i++)
{ coutsetw(2)i<<" |";
>> for(int j=1; j<=10; j++)
>> { cout<<" "setw(3)i*j;
>> }
>> coutendl;
}
%%
&rArr; Demo 4. geschachtelt
#### Verwendung von Schleifen

Alle Schleifensarten sind gleichwertig: jede könnte durch eine andere ersetzt werden. Sinnvoll ist allerdings eine differenzierte Auswahl:
1. Verwendung der while-Schleife, wenn die Anzahl der Iterationen unbekannt ist und auch Null Durchläufe möglich sind.
2. Verwendung der do...while-Schleife, wenn die Anzahl der Iterationen unbekannt ist und mindestens ein Durchlauf nötig ist.
3. Bevorzugung der for-Schleife insbesondere dann, wenn die Anzahl der Iterationen bekannt ist.

Besondere Aufmerksamkeit ist bei Verwendung der do...while -Schleife geboten. Empirische Untersuchungen haben gezeigt, dass bei der Verwendung der do-Schleife etwa 50% mehr Fehler auftreten als bei Verwendung der while-Schleife.
### Die break-Anweisung
kann in allen Schleifen verwendet werden, um die aktuelle Iteration vorzeitig zu beenden.
**Beispiel:**
%%(cpp)
while (true)
{ . . .
>> if ( . . . ) break;
>> . . .
}
%%
kann auch in switch-Anweisungen verwendet werden.
### Die continue-Anweisung

führt einen Sprung zum Rumpf-Ende aus, um dann mit dem nächsten Schleifendurchlauf fortzufahren.

Beispiel. Die folgenden Varianten sind äquivalent:
![image](/uploads/ProzProg5Kontrollstrukturen/pp38.gif?width=500)
### 5.4. Empfehlungen zum Programmieren
#### Ziel der Empfehlungen

Ein syntaktisch und semantisch korrektes Programm kann Logikfehler enthalten und deswegen die nicht erwarteten Ergebnisse liefern.

Wir können Fehler in unseren Denkansätzen erkennen und versteckte Programmfehler teilweise vermeiden, wenn bei der Programmierung einige Empfehlungen eingehalten werden:

>>1) Lesbarkeit von Programmen,
>>2) Benutzerfreundliche Dialoge,
>>3) Schrittweise Verfeinerung,
>>4) Integrierte Dokumentation,
>>5) Verwendung der problemadäquaten Datentypen,
>>6) Fehlerüberprüfung.
#### Lesbarkeit von Programmen

Einige Empfehlungen und Forderungen werden in der strukturierten Programmierung entwickelt:

1) Programme werden für Menschen geschrieben. Programme sollen so dargestellt werden, dass ihr Ablauf einfach zu erfassen und zu verändern ist.

2) Die Verwendung von expliziten Sprüngen &#8222;goto&#8220; soll prinzipiell vermieden werden.

3) Alle Algorithmen lassen sich prinzipiell aus drei folgenden Konstrukten aufbauen:
>> a) Sequenz,
>> b) if-else-Auswahl und
>> c) while- Schleife.

4) Programme sollen grundsätzlich kommentiert werden.
5) Es ist schwierig, aber auch wichtig treffende, sinnvolle Namen für Funktionen, Variablen u.a. zu finden.

6) Besonders wichtig für die Lesbarkeit ist die saubere Formatierung des Programms bzw. Einrücken von Befehlsfolgen.

7) Die Vernachlässigung von diesen Empfehlungen kann fatale Folge haben, z.B.:

>> a) "Spaghetti-Codes&#8222; sind kaum wartbar;
>> b) Unstrukturierte Programme sind nach kurzer Zeit
>>> unleserlich selbst für den Autor.

&rArr; Demo 5. Strukturierung
#### Benutzerfreundliche Dialoge

Bei der Ausführung muss ein erklärender Text auf dem Bildschirm erscheinen:

1. In der Aufforderung zu einer Eingabe muss die Art der einzugebenden Daten und das erwartete Format beschrieben werden.

2. Bei der Ausgabe muss erklärt werden, welche Daten hier ausgegeben werden.

3. Der Benutzer soll über auftretende Fehler (unkorrekte Eingabe, fehlende Dateien usw. ) informiert werden und zu den möglichen Aktivitäten aufgefordert werden.
***
CategoryProzeduraleProgrammierung
Revision [5b4075f]
Bearbeitet am 2017-08-16 14:53:35 von ClaudiaMichel
ADDITIONS
CategoryProzeduraleProgrammierung
DELETIONS
CategoryDelete
Revision [eca5c17]
Bearbeitet am 2016-09-27 12:40:00 von NicoleHennemann
ADDITIONS
CategoryDelete
DELETIONS
CategoryProzProg
Revision [8ad5570]
Die älteste bekannte Version dieser Seite wurde von RonnyGertler am 2013-03-28 16:42:48 erstellt
ADDITIONS
![image](/uploads/ProzProg5Kontrollstrukturen/BMBF_Logo_klein.jpg?width=200)
# Prozedurale Programmierung - Kapitel 5 - Kontrollstrukturen
_<span class="right">Inhalte von Dr. E. Nadobnyh</p>_
#### 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](/uploads/ProzProg5Kontrollstrukturen/pp21.gif?width=500)
#### Programmablauf
**Linearer Ablauf:**

![image](/uploads/ProzProg5Kontrollstrukturen/pp22.gif?width=350)

**Verzweigung:**

![image](/uploads/ProzProg5Kontrollstrukturen/pp23.gif?width=300)
**Wiederholung:**

![image](/uploads/ProzProg5Kontrollstrukturen/pp24.gif?width=350)
## 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(&#8222;%d&#8220;, 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](/uploads/ProzProg5Kontrollstrukturen/pp25.gif?width=300)
#### 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 <span style="text-decoration:underline;">Gültigkeitsbereich </span>(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 <span style="text-decoration:underline;">globale </span>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](/uploads/ProzProg5Kontrollstrukturen/pp26.gif?width=350)
## 5.2. Auswahlanweisungen
### if ... else-Anweisung

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

**Syntax (zwei Formen):**
![image](/uploads/ProzProg5Kontrollstrukturen/pp27.gif?width=350)
Ein Rumpf ist eine Anweisung bzw. ein Block. Der Ausdruck (Bedingung) liefert ein bool-Ergebnis.

**Semantik**als Struktogramm (Nassi-Shneidermann-Diagramm):

![image](/uploads/ProzProg5Kontrollstrukturen/pp28.gif?width=400)
**Beispiel:**
%%(cpp)
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:
<table class="data" width="80%" style="border:0">
>><tr>
>>><td>
>> if(x > 0) sign = 1; <br/>
if(x < 0) sign = -1; <br/>
if(x
##### 0) sign = 0;
>>></td>
>>><td>
>>>if(x > 0) sign = 1; <br/>
else if(x < 0) sign = -1; <br/>
>>> else sign = 0;
>>></td>
>></tr>
</table>
Mehrdeutigkeit: zu welchem if gehört das else?
if(x > 0) if(x 0) r = 1; else r = 0;
Regel: else gehört immer zum letzten offenen if im gleichen Block. Im Zweifelsfall Blockklammern setzen.

&rArr; Demo 1. if
### switch-Anweisung

Eine switch-Anweisung (Verteiler) realisiert die Auswahl zwischen mehreren Alternativen.
**Syntax**:
![image](/uploads/ProzProg5Kontrollstrukturen/pp29.gif?width=350)
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](/uploads/ProzProg5Kontrollstrukturen/pp30.gif?width=400)
**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 :**
%%(cpp)
int tag; cin >> tag;
>>switch (tag)
>>{ case 6: cout "Samstag"; break;
>>> ...
>>>case 5: cout "Freitag"; break;
>>>default: cout "FEHLER";
>>}
%%
&rArr; Demo 2. switch
**switch-Besonderheiten**

1) Die switch&#8211;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](/uploads/ProzProg5Kontrollstrukturen/pp31.gif?width=500)
#### 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:**
%%(cpp)
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](/uploads/ProzProg5Kontrollstrukturen/pp32.gif?width=350)
Ein Rumpf ist eine Anweisung bzw. ein Block.

**Semantik als Struktogramm:**
![image](/uploads/ProzProg5Kontrollstrukturen/pp33.gif?width=400)
**Beispiel**:

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

&rArr; Demo 3. for
#### for &#8211;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.:
%%(cpp)
for(int i=1; i<20; coutsetprecision(i)xendl, i++);
%%
Der Wert des durch den Komma-Operator gebildeten Gesamtausdrucks ist gleich dem Wert des rechten Teil-Ausdrucks.
<span style="text-decoration:underline;">Fehlerhaftes </span>Beispiel:
%%(cpp)
for(float x=-1; x<1; x+=0,5) cout x endl;
%%
### while-Schleife

Kopfgesteuerte Schleife.
**Syntax**:

![image](/uploads/ProzProg5Kontrollstrukturen/pp34.gif?width=350)
Ein Rumpf ist eine Anweisung bzw. ein Block.

**Semantik**mit dem Struktogramm:
![image](/uploads/ProzProg5Kontrollstrukturen/pp35.gif?width=400)
Der Rumpf kann mehrmals oder niemals ausgeführt werden.
**Beispiel:**
%%(cpp)
int summe = 0;
int zahl = 1;
while (zahl <= 100)
{ summe += zahl;
>> zahl++;
}
%%
### do ... while-Schleife

Fußgesteuerte Schleife
**Syntax:**
>>>>
![image](/uploads/ProzProg5Kontrollstrukturen/pp36.gif?width=350)
Ein Rumpf ist eine Anweisung bzw. ein Block.

**Semantik**mit dem Struktogramm:
![image](/uploads/ProzProg5Kontrollstrukturen/pp37.gif?width=400)
Der Rumpf wird in jedem Fall wenigstens <span style="text-decoration:underline;">einmal </span>ausgeführt.
>>>
**Beispiel**:
%%(cpp)
int summe = 0; int zahl = 1;
>> do
>> { summe += zahl;
>>>> zahl++;
>> }
>> while (zahl <= 100);
%%
>>
#### Geschachtelte Schleifen

Ein Rumpf einer Schleife ist selbst eine beliebige Anweisung, z.B. untergeordnete, innere Schleife. Übergeordnete Schleife wird als äußere Schleife bezeichnet. Schleifen können beliebig tief geschachtelt werden.

Beispiel. Das folgende Programm erzeugt eine Multiplikationstabelle:
%%(language-ref)
for(int i=1; i<=10; i++)
{ coutsetw(2)i<<" |";
>> for(int j=1; j<=10; j++)
>> { cout<<" "setw(3)i*j;
>> }
>> coutendl;
}
%%
&rArr; Demo 4. geschachtelt
#### Verwendung von Schleifen

Alle Schleifensarten sind gleichwertig: jede könnte durch eine andere ersetzt werden. Sinnvoll ist allerdings eine differenzierte Auswahl:
1. Verwendung der while-Schleife, wenn die Anzahl der Iterationen unbekannt ist und auch Null Durchläufe möglich sind.
2. Verwendung der do...while-Schleife, wenn die Anzahl der Iterationen unbekannt ist und mindestens ein Durchlauf nötig ist.
3. Bevorzugung der for-Schleife insbesondere dann, wenn die Anzahl der Iterationen bekannt ist.

Besondere Aufmerksamkeit ist bei Verwendung der do...while -Schleife geboten. Empirische Untersuchungen haben gezeigt, dass bei der Verwendung der do-Schleife etwa 50% mehr Fehler auftreten als bei Verwendung der while-Schleife.
### Die break-Anweisung
kann in allen Schleifen verwendet werden, um die aktuelle Iteration vorzeitig zu beenden.
**Beispiel:**
%%(cpp)
while (true)
{ . . .
>> if ( . . . ) break;
>> . . .
}
%%
kann auch in switch-Anweisungen verwendet werden.
### Die continue-Anweisung

führt einen Sprung zum Rumpf-Ende aus, um dann mit dem nächsten Schleifendurchlauf fortzufahren.

Beispiel. Die folgenden Varianten sind äquivalent:
![image](/uploads/ProzProg5Kontrollstrukturen/pp38.gif?width=500)
### 5.4. Empfehlungen zum Programmieren
#### Ziel der Empfehlungen

Ein syntaktisch und semantisch korrektes Programm kann Logikfehler enthalten und deswegen die nicht erwarteten Ergebnisse liefern.

Wir können Fehler in unseren Denkansätzen erkennen und versteckte Programmfehler teilweise vermeiden, wenn bei der Programmierung einige Empfehlungen eingehalten werden:

>>1) Lesbarkeit von Programmen,
>>2) Benutzerfreundliche Dialoge,
>>3) Schrittweise Verfeinerung,
>>4) Integrierte Dokumentation,
>>5) Verwendung der problemadäquaten Datentypen,
>>6) Fehlerüberprüfung.
#### Lesbarkeit von Programmen

Einige Empfehlungen und Forderungen werden in der strukturierten Programmierung entwickelt:

1) Programme werden für Menschen geschrieben. Programme sollen so dargestellt werden, dass ihr Ablauf einfach zu erfassen und zu verändern ist.

2) Die Verwendung von expliziten Sprüngen &#8222;goto&#8220; soll prinzipiell vermieden werden.

3) Alle Algorithmen lassen sich prinzipiell aus drei folgenden Konstrukten aufbauen:
>> a) Sequenz,
>> b) if-else-Auswahl und
>> c) while- Schleife.

4) Programme sollen grundsätzlich kommentiert werden.
5) Es ist schwierig, aber auch wichtig treffende, sinnvolle Namen für Funktionen, Variablen u.a. zu finden.

6) Besonders wichtig für die Lesbarkeit ist die saubere Formatierung des Programms bzw. Einrücken von Befehlsfolgen.

7) Die Vernachlässigung von diesen Empfehlungen kann fatale Folge haben, z.B.:

>> a) "Spaghetti-Codes&#8222; sind kaum wartbar;
>> b) Unstrukturierte Programme sind nach kurzer Zeit
>>> unleserlich selbst für den Autor.

&rArr; Demo 5. Strukturierung
#### Benutzerfreundliche Dialoge

Bei der Ausführung muss ein erklärender Text auf dem Bildschirm erscheinen:

1. In der Aufforderung zu einer Eingabe muss die Art der einzugebenden Daten und das erwartete Format beschrieben werden.

2. Bei der Ausgabe muss erklärt werden, welche Daten hier ausgegeben werden.

3. Der Benutzer soll über auftretende Fehler (unkorrekte Eingabe, fehlende Dateien usw. ) informiert werden und zu den möglichen Aktivitäten aufgefordert werden.
***
CategoryProzProg