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.