Optionen und weiterführende Links



In der Datenbank befinden sich derzeit 477 Specials. Alle Specials anzeigen...

Kreisverkehr

Kreisverkehr

Bisher wurde in unseren Codes jeder Befehl der Reihe nach höchstens einmal (in einem if auch schon mal keinmal) ausgeführt. Ihr könnt aber Code auch mehrfach ausführen lassen - mit Schleifen.

Es gibt zwei Typen von Schleifen: Bei den einen steht von vorneherein fest, wie oft der Code in ihnen ausgeführt wird. Bei der zweiten wird eine Bedingung überprüft: Solange die erfüllt ist, wird der Code in der Schleife wiederholt. Der Prototyp der zweiten Variante ist die while-Schleife.

'while' ist das englische Wort für 'solange'. Damit ist die Arbeitsweise eigentlich schon erklärt

zahl = 1:
while (zahl <= 5)
  {
  print "Dies ist der "+zahl+"te Schleifendurchlauf!";
  zahl++;
  }

erzeugt die Ausgabe

Dies ist der 1te Schleifendurchlauf!
Dies ist der 2te Schleifendurchlauf!
Dies ist der 3te Schleifendurchlauf!
Dies ist der 4te Schleifendurchlauf!
Dies ist der 5te Schleifendurchlauf!

Der eine print-Befehl erzeugt also fünf Ausgaben, eben weil er fünf mal abgearbeitet wird.

Der Code im Block der while-Schleife (dem sogenannten Schleifenrumpf) wird so lange ausgeführt, bis die angegebene Bedingung nicht mehr erfüllt ist. In unserem Beispiel wird also so lange ausgegeben und 'zahl' erhöht, bis (zahl <= 5) nicht mehr wahr ist. Diese Bedingung bildet zusammen mit dem Schlüsselwort 'while' den Schleifenkopf.

Vermutlich ist Euch nicht entgangen, daß in diesem Beispiel natürlich von vorneherein feststeht, wie oft die Schleife durchlaufen wird. Ich hatte die while-Schleife jedoch als Beispiel für Schleifen angekündigt, bei denen dies nicht feststeht. Dazu folgendes Beispiel

var befehl = input(); // hole den ersten Befehl
while (befehl != "quit") // solange nicht mit 'quit' beendet
  {
  // führe den Befehl aus
  execute(befehl);
  // hole neuen Befehl
  befehl = input();
  }

Hier wird Befehl um Befehl eingelesen und ausgeführt, bis der Befehl 'quit' kommt. Dann wird nämlich (befehl != "quit") false, und die Schleife wird beendet.

In einer Schleife gibt es im wesentlichen drei wichtige Elemente

Initialisierung
Häufig müssen vor einer Schleife eine oder mehrere Variablen initialisiert werden. Das kann beispielsweise so aussehen, daß der Zähler auf 0 gesetzt wird (erstes Beispiel) oder zum ersten Mal ein Befehl eingelesen wird (zweites Beispiel). Sinn ist einfach, beim ersten Prüfen der Abbruchbedingung einen definierten Zustand zu haben.
Abbruchbedingung
Es ist manchmal etwas knifflig, die Abbruchbedingung zu formulieren. Da stellen sich Fragen wie == oder >=, bis MAX_ZAHL, MAX_ZAHL+1 oder MAX_ZAHL-1, ... Aber mit ein bischen Erfahrung sind solche Probleme recht schnell gelöst. Hier hilft auch oft der Bleistift-Test (dazu später mehr).
Zählerinkrementierung
Damit ist die Veränderung einer Variablen gemeint, die in der Abbruchbedingung geprüft wird. Ist diese beispielsweise 'i < 10', in der Schleife fehlt aber das 'i++;', landet Ihr in einer Endlosschleife (die nie verlassen wird). Auch erfahrenen Programmierern passieren solche Fehler, Ihr solltet es also bei Eurer Fehlersuche im Hinterkopf behalten.

Eine zweite wichtige Schleifenkonstruktion ist die for-Schleife. Sie wird meist für Schleifen mit bekannter Durchlaufzahl benutzt

for (i=0; i < 10; i++)
  {
  print i;
  }

Hier sind Initialisierung, Abbruchbedingung und Inkrement im Schleifenkopf zusammengefaßt

for (initialisierung; bedingung; inkrement)
  {
  ...
  }

Es ist natürlich auch möglich, eine for-Schleife zu schreiben, bei der die Anzahl der Durchläfe nicht vorher feststeht. Das obige Beispiel würde als for-Schleife etwa so aussehen

for (befehl = input(); befehl != "quit"; befehl = input())
  {
  excecute(befehl);
  }

Diese Version ist zwar etwas kürzer, aber nicht unbedingt übersichtlicher. In bestimmten Fällen kann man in einer for-Schleife auch die Initialisierung und/oder das Inkrement weglassen. Das geht dann, wenn der restliche Code diese Aufgaben gleich miterledigt. Ich erwähne das hier hauptsächlich, damit Ihr beim Lesen fremder Codes nicht im Regen steht bei so etwas

for (;i<10;i++)
  ...
for (i=0;i<10;)
  ...
for (;i<10;)
  ...

Wie bei einem if-Konstrukt, könnt Ihr auch eine Schleife mit 'break' abbrechen. 'break' springt sofort zum Code, der direkt hinter der Schleife steht. Ein ähnliches Konzept hat continue. Dieser Befehl beendet aber nicht die ganze Schleife, sondern nur den aktuellen Durchgang.

In vielen Sprachen gibt es neben while- und for-Schleifen noch andere Schleifenarten. Als Beispiele hier nur die Stichworte 'do ... while(Bedingung)', 'do ... until(Bedingung)' oder 'foreach' genannt. Aber alle diese Konstrukte lassen sich mit passend gebauten while-Schleife ersetzen, so daß ich hier nicht näher auf sie eingehen werde. Im Bedarfsfall steht Euch auch hierzu das Manual der jeweiligen Sprache zur Verfügung.



Special vom: 16.01.2003
Autor dieses Specials: Henning Kockerbeck
Die weiteren Unterseiten dieses Specials:
Die reine Lehre - HTML
Stilvoll - CSS
Kleiner Grundkurs Programmieren
Jetzt wird's dynamisch - JavaScript
Die andere Seite der Dynamik - PHP
Neue Gefilde - XML
Weiterführende Links
Zurück zur Hauptseite des Specials


?>