Abfragen

6.1 IF-Abfrage:
6.1.1 Aufbau einer IF-Abfrage
Bevor wir uns den Aufbau einer IF-Abfrage ansehen, wollen wir erst einmal erfahren, was das überhaupt ist. Eine IF-Abfrage stellt etwas in Frage. Ist die Bedingung, die gestellt wird, wahr, so wird/werden eine oder mehrere Anweisung(en) ausgeführt. Also ist es in etwa wie bei der WHILE-Schleife, nur, dass diesmal keine Schleife vorliegt, sondern eine Abfrage. Der große Unterschied ist hierbei nur, dass eine Schleife die Anweisungen so lange ausführt, bis die Bedingung false ergibt. Eine Abfrage führt die Anweisungen nur einmal aus, und zwar nur dann, wenn die Bedingung true ergibt. Ergibt sie false, so wird die Anweisung nicht ausgeführt und es wird dort der Quelltext weiter durchgeführt, wo die Abfrage endet.
Nun zum Aufbau einer IF-Abfrage:

IF { Bedingung } THEN { Anweisung }
Die Bedingungen kann man wieder mit den logischen Operatoren verknüpfen, wie wir es schon bei den Schleifen hatten. Ein Bündel Anweisungen wird mit BEGIN und END zusammengefasst. Also hätten wir bei einer Abfrage etwa so etwas:

IF platz_belegt AND links_frei THEN
BEGIN
 WHILE platz_belegt DO nimm_auf;
 drehe_links;
 vor;
END;
Man merkt schon, dass man die Beispiele auch ins Deutsche übersetzen kann: WENN platz_belegt ist UND links_frei ist, DANN nimm_auf, SOLANGE WIE platz_belegt ist, drehe_links und gehe vor. An dem Beispiel oben sieht man außerdem noch, dass es durchaus auch möglich ist, eine Schleife in die IF-Abfrage mit einzubauen. Dabei muss es nicht einmal eine WHILE-Schleife sein. Es kann auch eine weitere Abfrage eingebaut werden, ganz nach Belieben.
So, jetzt haben wir also eine WENN-DANN-Abfrage geschaffen. Aber was ist mit dem SONST? Was, wenn die Bedingung nicht erfüllt ist? Ganz einfach: es passiert nichts. Es sei denn, man liest sich den nächsten Abschnitt durch!

IF-THEN-ELSE:
ELSE
Wie schon gesagt wollen wir auch ein SONST in unsere Abfrage einbauen. Das Grundgerüst sieht dabei so aus:

IF { Bedingung } THEN { Anweisung } ELSE { Anweisung2 }
Und jetzt kommt's dicke: Da IF und ELSE zusammen gehören, muss man aufpassen. Will man nälich mehrere Anweisungen einbauen, wenn die Bedingung erfüllt ist, muss man folgendes schreiben:
IF platz_belegt AND links_frei THEN
BEGIN
 WHILE platz_belegt DO nimm_auf;
 drehe_links;
 vor;
END
ELSE
BEGIN
 WHILE vorne_frei DO vor;
END;
Wichtig: hinter dem roten END wird KEIN Semikolon gesetzt!!! IF und ELSE gehören zusammen. Würde man hinter dem END ein Semikolon setzen, würde der Compiler einen Fehler melden! Das ist in NIKI die einzige Ausnahme, bei der hinter END nichts steht (weder Punkt nocht Semikolon).

6.2.2 Relevanz von ELSE
Wie schon gesagt, ELSE muss nicht gesetzt werden. Wird die Bedingung nicht erfüllt, wird sofort das ausgeführt, was hinter der Abfrage kommt. Ein Beispiel:

IF false THEN
BEGIN
 WHILE platz_belegt DO nimm_auf;
 drehe_links;
 vor;
END;
vor;
Hier sehen wir, dass die Bedingung in jedem Fall false ergibt. Ob das wirklich so eingegeben werden kann, weiß ich zwar nicht, aber in Object-PASCAL geht das ohne Weiteres. Im Beispiel wird also sofort die Anweisung vor ausgeführt, ohne etwas aufzunehmen, dann nach links zu drehen und dann ein weiteres Mal vor zu gehen. Man kann auch hier noch ein ELSE einbauen. Das würde dann aber in jedem Falle ausgeführt, da ja hier die Bedingung immer true ergibt! Das bedeutet also: ELSE ist die Negierung der Bedingung in der IF-Abfrage! Ein Beispiel, wie man ELSE umgehen kann:

IF platz_belegt AND links_frei THEN
BEGIN
 WHILE platz_belegt DO nimm_auf;
 drehe_links;
 vor;
END;
IF NOT platz_belegt AND NOT links_frei THEN
BEGIN
 WHILE vorne_frei DO vor;
END;
Und hier sehen wir auch den Vorteil von ELSE: es ist deutlich kürzer!!!