next up previous contents
Nächste Seite: Verfeinerung Aufwärts: Anweisungsentwurf mit Struktogrammen Vorherige Seite: Fallunterscheidung   Inhalt


Schleifen

Als Schleifen bezeichnen wir die Wiederholungsanweisungen. Das sind Anweisungen, bei denen durch gewisse Bedingungen gesteuert wird, wie oft eine Anweisung ausgeführt wird. Schleifen gehören zu den wichtigsten Konstrukten der imperativen Programmierung. Sie nutzen die Fähigkeit des Computers, gegebene Anweisungen schnell und zuverlässig millionenfach zu wiederholen. Schleifen bergen aber auch das Risiko, Fehler zu enthalten, deren Ursachen schwierig zu entdecken sind. Wir besprechen zuerst die drei wichtigsten Schleifenarten und danach Vorsichtsmaßregeln beim Programmieren von Schleifen.

Die Schleife mit Eintrittsprüfung (kopfgesteuerte oder abweisende Schleife, pre-checked loop) prüft zunächst die Eintrittsbedingung. Das Ergebnis der Prüfung entscheidet, ob die nachfolgenden Anweisungen des Schleifenkörpers (engl. body) ausgeführt oder übersprungen werden soll. Nach einem Ausführen des Schleifenkörpers erfolgt ein Rücksprung zur Überprüfung der Eintrittsbedingung, die jetzt als Fortsetzungsbedingung wirkt. Der Körper der Schleife kann aus einer einzigen oder auch aus mehreren Anweisungen bestehen. Die Überprüfung vor jeder Ausführung bedingt, daß der Schleifenkörper möglicherweise übersprungen, also kein einziges Mal ausgeführt wird. Zu diesem Schleifentyp zählen die Zähl- und DO WHILE-Schleifen im Fortran95-Standard (siehe Kap. 4).

Beispiel: Lesen und Zählen von positiven Meßwerten bis zum ersten nicht positiven Wert (Schlußsignal).

Als Struktogramm schreibt man solche Schleifen:

anzahl = 0  
E(T): Meßwert  
Meßwert $>$ 0  
  anzahl = anzahl + 1  
  E(T): Meßwert  
A(B): anzahl  

Der linke freibleibende Streifen deutet den Rücksprung zur Überprüfung der Eintrittsbedingung oder das mögliche Überspringen des Schleifenkörpers an.

Bei der Schleife mit Austrittsprüfung (endgesteuerte oder nichtabweisende Schleife, post-checked loop) wird zuerst der Schleifenkörper ausgeführt, danach die Austritts- oder Abbruchbedingung überprüft. Das Ergebnis der Prüfung entscheidet, ob die Schleife verlassen wird oder ein Rücksprung zum Beginn des Schleifenkörpers erfolgt. Die Überprüfung am Ende der Schleife bedingt, daß der Schleifenkörper in jedem Fall mindestens einmal ausgeführt wird.

Beispiel: Die Anweisung

\fbox{ Auswahlbuchstaben einlesen }

läßt sich als Struktogramm verfeinern zu

  A(B): Aufforderung
  E(T): Zeichen
Zeichen ist gültiger Auswahlbuchstabe

Die Zählschleife ist eine besondere Form der Schleife mit Eintrittsprüfung. Die Bedingung ist durch einen Zählbereich gegeben, den eine Lauf- oder Zählvariable systematisch durchlaufen soll. Für jeden gültigen Wert des Zählbereichs soll der Schleifenkörper einmal ausgeführt werden. Zählbereiche sind zunächst einmal Bereiche der ganzen Zahlen, beispielsweise ,,von 1 bis 3`` oder ,,von -5 bis -1``, wobei der Zuwachs ohne weitere Angabe +1 ist. Der Zuwachs kann aber beliebige (auch negative) ganzzahlige Werte annehmen, z.B. ,,von -6 bis +2 mit Zuwachs +2``.

Andere Zählbereiche oder aufzählbare Bereiche hängen von der verwendeten Programmiersprache ab. So ist in Pascal ,,die Buchstaben von A bis Z`` möglich. In Fortran95 können jedoch nur ganze Zahlen verwendet werden. Der Zuwachs ist stets +1, falls nichts anderes angegeben wird; er kann auch eine reelle Zahl sein: ,,von 2.47 bis -13.6 mit Zuwachs -4.227`` .

Das Vorzeichen des Zuwachses ist wichtig, da es anzeigt, ob der Schleifenzähler aufwärts (Zuwachs positiv) oder abwärts (Zuwachs negativ) durchlaufen wird. Steht nämlich ,,von 1 bis n`` da, und n ist null, so brauchen wir die Klarstellung, ob es sich um ,,1 bis n mit Zuwachs -1`` handelt -- dann wird der Schleifenkörper zweimal ausgeführt oder um ,,1 bis n mit Zuwachs +1`` -- dann wird der Schleifenkörper übersprungen.

Der Zählbereich wird für die Laufvariable i, wobei ,,i von n bis m mit Zuwachs k`` gehen soll, als

$i = n, m, k$
geschrieben.

Wie bereits erwähnt, sind solche Schleifen in Fortran95 Schleifen mit Eintrittsbedingung, da der Zählindex vor den Durchlaufen der Zählschleife überprüft wird.

Beispiel: Berechnen und Drucken des Skalarproduktes s der beiden Vektoren $ a
= (a_1 , a_2 , a_3 )$ und $ b = (b_1 , b_2 , b_3 )$ nach der Formel $s = \Sigma_i a_i b_i $.

$ s = 0.0 $  
$ i = 1,3,1 $  
  $ s = s + a_i b_i $  
   
A(B): s  

Die Vorsichtsmaßnahmen beim Programmieren von Schleifen sollen helfen, die folgenden simplen Fragen sicher zu beantworten:

Die Wichtigkeit der Initialisierung sehen wir an zwei der drei obigen Beispiele: Bevor mit dem Abzählen von Meßwerten begonnen werden kann, muß die Variable auf null gesetzt werden; das Gleiche gilt für die Variable s, bevor die Aufsummierung des Skalarprodukts beginnen kann.

Um die Korrektheit einer Schleife zu beweisen, gibt es die Methode der Programm-Verifikation. Dabei läßt sich mittels geschickt ausgewählter Zusicherungen (engl. assertions) für bestimmte Stellen des Programms zusammen mit den dazwischen liegenden Anweisungen die Korrektheit in der Art eines mathematischen Beweises folgern. Wir können hier auf diese für ein gründliches Informatikstudium unerläßliche Methode nicht eingehen.

In ähnlicher Weise läßt sich auch die Terminierung zeigen. Diese muß eigens bewiesen werden, denn eine Schleife -- beispielsweise das Suchen in einer Tabelle -- kann das korrekte Ergebnis liefern und dennoch endlos weiterlaufen.


next up previous contents
Nächste Seite: Verfeinerung Aufwärts: Anweisungsentwurf mit Struktogrammen Vorherige Seite: Fallunterscheidung   Inhalt
Lars Tornow 2003-04-02