Theorieteil 1 zu Folge 4

for-Schleifen

1. Einführung und Begründung für for-Schleifen

In vielen Algorithmen müssen bestimmte Befehle oder Befehlsfolgen drei-, vier-, zehnmal oder öfters durchlaufen werden.

Wenn Sie den Hamster-Kurs bearbeitet haben, sollten Sie for-Schleifen ja eigentlich schon kennen. Und wenn Sie den Kurs nicht bearbeitet haben, weil Ihr Lehrer das nicht für nötig hielt, passen Sie jetzt besonders gut auf. Die "Hamster-Leute" können diesen Abschnitt ja überspringen.

Der Java-Hamster ist eine recht umfangreiche Klasse mit vielen Methoden. Graphisch wird der Hamster durch die Zeichnung eines Hamsters dargestellt, der in vier verschiedene Richtungen gucken kann: Nord, Süd, West und Ost. Der Hamster bewegt sich in einem so genannten Territorium. Das ist eine Fläche aus lauter quadratischen Feldern. Die meisten Felder sind leer, auf einigen Feldern liegen Körner, und auf manchen Feldern stehen undurchdringbare Wände. Auf einem bestimmten Feld steht der Hamster.

Von den Methoden des Hamsters wollen wir uns nun die vor()-Methode herausgreifen. Mit Hilfe der vor()-Methode bewegt sich der Hamster um genau ein Feld nach vorne. Was dabei "vorne" ist, hängt natürlich von der Richtung ab, in die der Hamster gerade schaut. Sieht er nach Osten (also nach rechts), so bewirkt der vor()-Befehl, dass sich der Hamster auf das benachbarte rechte Feld begibt, falls ein solches überhaupt existiert und falls keine Mauer den Weg versperrt. Ein anderer wichtiger Befehl heißt linksUm(); er bewirkt, dass sich der Hamster (eigentlich: das Hamster-Objekt) um 90° nach links dreht. Einen rechtsUm()-Befehl gibt es nicht. Wollen wir, dass sich der Hamster rechts herum dreht, so müssen wir schreiben:

linksUm();
linksUm();
linksUm();

Weil ein solcher rechtsUm()-Befehl immer wieder benötigt wird, schreiben wir uns auf Dauer natürlich eine Methode rechtsUm():

public void rechtsUm()
{
   linksUm();
   linksUm();
   linksUm();
}

So einfach ist das. Nachdem sich der Hamster aus Abbildung 1 nach rechts bewegt hat (also im Uhrzeigersinn), soll er fünf Felder vorwärts gehen, damit er die Körner fressen kann, die auf dem Feld unten links liegen. Also schreiben wir einfach:

vor();
vor();
vor();
vor();
vor();

Das sieht ja ganz einfach aus, ist auf Dauer aber etwas lästig. Sollen wir etwa zehnmal vor() hinschreiben, wenn der Hamster zehn Felder vorwärts gehen soll und zwanzigmal vor() bei 20 Feldern?

Betrachten Sie nun folgende Methode

public void geheVor(int n)
{
   for (int i=1; i <= n; i++)
      vor();
}

Da haben Sie Ihre erste for-Schleife! Und hier ist auch schon die zweite:

public void vorUndNimm(int n)
{
   for (int i=1; i <= n; i++)
   {
      vor();
      if (kornDa()) nimm();
   }
}

Diese Methode lässt den Hamster nicht nur n Felder vorwärts gehen, sondern der Hamster schaut auf jedem Feld nach, ob ein Korn vorhanden ist und nimmt dieses gegebenenfalls auf. Hier werden zwei Befehle pro Schleifendurchgang ausgeführt, nämlich der vor()-Befehl und die if-Abfrage. Daher müssen diese beiden Befehle in geschweiften Klammern zu einem Befehlsblock zusammengefasst werden. Aber mehr dazu gleich im Abschnitt "Syntax der for-Schleife".

In der Buchversion ist dieser Theorieteil wesentlich ausführlicher dargestellt als in dieser Webversion.

2. Analyse einer for-Schleife

2 Ein Beispiel für eine for-Schleife

In Abbildung 2 sehen Sie ein weiteres Beispiel für eine FOR-Schleife.

Eine for-Schleife besteht aus dem Schleifenkopf und dem Schleifenkörper. Der Schleifenkopf steuert die for-Schleife, und der Schleifenkörper enthält die Befehle, die wiederholt werden sollen. Betrachten wir zunächst den Schleifenkopf.

Der Schleifenkopf besteht aus dem Schlüsselwort for, dann kommt die Initialisierung der Laufvariable, die Überprüfung der Schleifenbedingung und eine Anweisung, die am Ende eines jeden Schleifendurchgangs ausgeführt werden sollen. Diese drei Anweisungen bzw. Tests sind durch rund Klammern zusammengefasst und durch Semikolons voneinander getrennt.

1. Initialisierung der Laufvariable

Bei der ersten Anweisung handelt es sich um die Initialisierung der Laufvariable. Die Laufvariable - in Abbildung 2 heißt sie i - ist der Zähler für die bereits durchgeführten Schleifendurchgänge. Am besten setzt man diesen Zähler auf 1.

2. Überprüfung der Schleifenbedingung

Die Schleifenbedingung wird vor jedem Schleifendurchlauf überprüft. Ist das Ergebnis dieses Testes TRUE, so wird die FOR-Schleife durchlaufen. Ist das Ergebnis aber FALSE, so wird die Schleife beendet - unter Umständen sogar noch vor dem ersten Schleifendurchlauf.

3. Anweisung für das Schleifenende

Diese Anweisung wird am Ende eines jeden Schleifendurchlaufs ausgeführt. Bei den meisten for-Schleifen erhöht man hier die Laufvariable um den Wert 1:

   for (int i = 1; i <= 10; i++) 
      vor();

Diese FOR-Schleife führt genau 10 mal den vor()-Befehl aus. Die folgende FOR-Schleife zeigt uns einige neue Punkte:

   for (int a = 20; a <= 30; a = a - 3) 
   {  
      vor(); 
      nimm()
   }
  • Erstens muss die Laufvariable nicht unbedingt i heißen.
  • Zweitens muss die Laufvariable am Anfang nicht den Wert 1 haben.
  • Drittens kann die Laufvariable auch dekrementiert werden.
  • Viertens kann die Laufvariable um beliebige Werte inkrementiert oder dekrementiert werden.
  • Fünftens kann man bei solchen Schleifen leicht Fehler machen. Die Bedingung a <= 30 ist nämlich stets erfüllt, und daher erhalten wir eine so genannte Endlosschleife.

Man kann FOR-Schleifen auch schachteln. Das sieht dann so aus:

   for (int k = 20; k >=2; k = k-2)
   {  
      for (int j = 1; j <=k; j++) vor();
      linksUm();
   }

Der Hamster würde in der inneren FOR-Schleife eine bestimmte Zahl k von Felder vorwärts gehen. Wie groß k jeweils ist, wird durch die äußere FOR-Schleife vorgegeben. Wenn der Hamster k Felder nach vorn gegangen ist, dreht er sich nach links. Dann läuft die äußere FOR-Schleife erneut ab, allerdings ist k jetzt um 2 kleiner als vorher, so dass der Hamster einen kürzeren Weg zurücklegt. Wenn das Territorium groß genug ist und der Startplatz des Hamsters richtig gewählt wurde, müsste er auf diese Weise einen spiralförmigen Weg zurücklegen.

3. Schlussbemerkungen und Aufgabe

Jetzt sollte Ihnen klar geworden sein, wie for-Schleifen aufgebaut sind und welchen großen Vorteil die for-Schleifen bieten. Und damit sich dieser Theorieteil für Sie auch punktemäßig lohnt, kommt gleich noch eine leichte Aufgabe

Übung 4.5 (3 Punkte)

Zeichnen Sie das Syntaxdiagramm für eine for-Schleife!

Wenn Sie nicht wissen, was ein Syntaxdiagramm ist, schauen Sie doch bitte bei den if-else-Bedingungen nach. Hier wurde der Begriff Syntaxdiagramm erklärt.

Zurück zu Folge 4: Autofahren

Diese HTML-Seite wurde erstellt von Ulrich Helmich am 27. Mai 2005 mit Golive 6.