Schleifen

4.1 WHILE-Schleife:
4.1.1 Was ist eine Schleife?
Bisher ist NIKI beim Programmieren immer darauf angewiesen, dass der Programmierer weiß, wo eine Wand steht. Wenn wir ein vor zu viel oder zu wenig schreiben, kommt früher oder später ein Fehler. Wäre es dann nicht schön, wenn man eine Anweisung schreiben könnte, in der steht, dass NIKI so lange vorwärts gehen soll, bis er selbst eine Wand sieht? Die Antwort: JA! Und genau dafür gibt es Schleifen. Wir werden erst im folgenden Kapitel wirklich mit Schleifen arbeiten, da wir dort die Sensoren kennen lernen. Aber in diesem Kapitel werden wir erst einmal unser Augenmerk auf die beiden Typen von Schleifen werfen.

4.1.2 Aufbau der WHILE-Schleife
Zuerst wollen wir uns einmal das Grundgerüst der WHILE-Schleife ansehen, bevor wir dann erklären:

WHILE { Bedingung } DO { Anweisung }

Übersetzen wir doch mal diese eine Zeile: SOLANGE die Bedingung nicht erfüllt ist, TUE, was in der Anweisung steht. Das bedeutet, dass, solange vor NIKI keine Wand ist, er vor gehen kann. Aber im Beispiel ist immer nur der Singular vorhanden: eine Bedingung und eine Anweisung. Kann man nicht mehrere Bedingungen und Anweisungen stellen? Aber sicher. Beginnen wir zuerst mit mehreren Anweisungen. Wir wissen schon, dass man bei Prozeduren BEGIN und END verwendet. Warum wohl? Natürlich: Es wird von der Prozedur erwartet, dass sie mehrere Befehle enthält. So gehen wir also auch in der WHILE-Schleife vor:

WHILE { Bedingung } DO
BEGIN
 { Anweisung 1 }
 { Anweisung 2 }
 ...
 { Anweisung n }
END;


Soweit, so klar. Aber jetzt kommt's dicke: Bedingungen können leider nicht zwischen BEGIN und END gequetscht werden. Sie werden miteinander verknüpft. Ist ja auch logisch: wenn wir einen Bedingungssatz bilden, verknüpfen wir auch die Bedingungen miteinander. Also: SOLANGE keine Wand vor NIKI ist ODER rechts keine Wand steht, TUE, was in der/den Anweisung(en) steht. Ob das Beispiel wirklich sinnvoll ist, soll nicht die Frage sein. Es geht ja nur ums Verknüpfen. Was wir brauchen sind also logische Operatoren.

4.1.3 Logische Operatoren
Was ist denn das? Ein logischer Operator kann vieles sein, jedoch insbesondere:

AND
OR
NOT


Also: UND, ODER und NICHT sind logische Operatoren. Aber wohin mit ihnen? Schauen wir uns mal folgendes Beispiel an:

WHILE { Bedingung 1 } AND NOT { Bedingung 2 } OR { Bedingung 3 } DO { Anweisung }

Also: solange Bedingung 1 erfüllt ist und Bedingung 2 nicht oder wahlweise Bedingung 3 wohl erfüllt ist, soll die Anweisung ausgeführt werden. Auch hier ist es möglich, mehrere Anweisungen zwischen BEGIN und END zu schreiben. Jedoch muss man beim Verwenden logischer Operatoren vorsichtig sein, ob wirklich das passiert, was man will, und nicht dass, was man programmiert hat. Das Beispiel oben kann vom Compiler fehlinterpretiert werden, etwa so: Wenn (1 UND 2) ODER 3 anstatt Wenn 1 UND (2 ODER 3)! Also ist es am Besten, sparsam umzugehen mit AND, OR und NOT.

4.2 REPEAT-UNTIL-Schleife:
4.2.1 Aufbau der REPEAT-UNTIL-Schleife
Der Aufbau der REPEAT-UNTIL-Schleife unterscheidet sich wesentlich von dem der WHILE-Schleife. Auch die Funktionsweise ist nicht die selbe. Schauen wir uns das Ganze einmal an:

REPEAT { Anweisung } UNTIL { Bedingung }

Also: Nach REPEAT kommt sofort die Anweisung, danach UNTIL und dann die Bedingung. Aber was, wenn ich mehr als eine Anweisung brauche? Naheliegend wäre hier die Verwendung von BEGIN und END, aber ausnahmsweise falsch. BEGIN und END werden oft als Klammer bezeichnet. Aber bei der REPEAT-UNTIL-Schleife ist die Klammer schon gesetzt: Alles, was zwischen REPEAT und UNTIL steht, wird ausgeführt, und zwar solange, bis die Bedingung erfüllt ist. Ein Beispiel:

REPEAT
 { Anweisung 1 }
 { Anweisung 2 }
 ...
 { Anweisung n }
UNTIL { Bedingung }


Eine Auflistung von Bedingungen geschieht genau wie bei der WHILE-Schleife durch logische Operatoren. Daher gibt es auch hier kein Beispiel.

4.2.2 Unterschiede zur WHILE-Schleife
Der erste optische Unterschied ist, dass in der REPEAT-UNTIL-Schleife zuerst die Anweisungen kommen und dann erst die Auflistung der Bedingungen. Aber das ist nicht nur ein optischer Unterschied: NIKI geht nämlich "chronologisch" im Programmcode vor. Das bedeutet, dass er in jedem Fall mindestens einmal die Anweisung(en) ausführt und dann erst prüft, ob er fortfahren kann.
Ein weiterer Unterschied ist, dass in der REPEAT-UNTIL-Schleife kein BEGIN und END verwendet werden. REPEAT und UNTIL sind Klammern für sich und benötigen keine weitere.
Wenn man sich also nicht sicher ist, ob die Bedingung direkt am Anfang erfüllt ist, sollte man die WHILE-Schleife nutzen. Ist man sich jedoch sicher, kann man beide Schleifen nutzen.