6.3 Logische Variablen und Operatoren

In allen Programmiersprachen und auch in Sonic Pi gibt es neben den numerischen auch logische Operationen. Ein wenig haben wir die auch schon kennengelernt. Die Logik ist ein Teilgebiet der Mathematik und Aristoteles war ihr früher und bedeuten(s)der Vertreter. Was hier im Folgenden beschrieben wird, geht auf ihn zurück.

Erst einmal muss man sich fragen: Wozu braucht man Logik in der Programmierung? Schauen wir uns den bisherigen Code an, so sehen wir, dass wir auch ohne Logik ausgekommen sind. Aber die Abläufe im Code waren auch alle gerade runter. Logik dient dazu, Verzweigungen einzubauen. Beispielsweise könnte man alle Töne unterhalb eines bestimmten Tons mit einem bestimmten Sound spielen, und alle Töne oberhalb mit einem anderen. Dazu muss man eine Zeile einbauen, die genau den Status oberhalb-unterhalb abfragt.

Ich will es mal als sogenannten Pseudocode formulieren:

wenn Tonhöhe kleiner als Grenzwert ist,
benutze Instrument 1
sonst
benutze Instrument 2

Pseudocode nennt man die umgangssprachliche Beschreibung eines Programms oder eines Programmteils. Dieser Code ist auf Deutsch und folgt nicht der Programmiersprache, zeigt aber die grundsätzliche Funktionalität.

Das Beispiel oben beginnt mit einer Bedingung „wenn Tonhöhe kleiner als Grenzwert ist“. Das Programm muss also eine Bedingung verstehen (interpretieren) und entscheiden können, ob diese Bedingung „wahr“ oder „falsch“ ist.

Ist diese Bedingung „wahr“, dann wird die Anweisung nach der Bedingung ausgeführt und dementsprechend das Instrument 1 benutzt. Die Zeile „benutze Instrument 1“ ist eine ganz normale Anweisung.
Ist diese Bedingung „falsch“, dann wird die Anweisung nach „sonst“ ausgeführt und dementsprechend das Instrument 2 benutzt.
Die Umsetzung ist in Code 11 dargestellt.

Die if-Abfrage besteht hier aus 3 Teilen:

if leitet die Entscheidung ein. Hinter „if“ muss die Bedingung folgen.

…Codeblock 1
else unterteilt die Anweisungen in 2 Blöcke mit Codezeilen: Diejenigen, die ausgeführt werden, wenn die Bedingung wahr ist (vor else) und die, die ausgeführt werden, wenn die Bedingung falsch ist (nach else)
…Codeblock 2
endif Beendet die beiden Anweisungsblöcke

Die Bedingung folgt dem „if“-Statement. Wird die Bedingung ausgewertet, dann kann sie 2 Zustände haben: wahr oder falsch. Eine Bedingung vergleicht 2 Größen miteinander, die vergleichbar sein können, beispielsweise 2 Zahlen. Die Zahlen können in Form einer Variablen vorliegen oder auch das Ergebnis eines Terms.

Zum Vergleichen von Zahlen gibt es 3 Operatoren:

1. Größer: >
2. kleiner: <
3. gleich: ==

Ganz wichtig: der Vergleichsoperator „==“ darf nicht mit dem Zuordnungsoperator „=“ verwechselt werden. Dummerweise gibt Sonic Pi keine Fehlermeldung aus, sondern ordnet den Wert dann einfach zu, wenn auf der linken Seite des Gleichheitszeichens eine Variable steht:

if wert = 9

ist also kein Vergleich, sondern die 9 wird der Variablen „wert“ zugeordnet. Unbedingt vermeiden!!
Zusätzlich zu den 3 genannten Vergleichsoperatoren gibt es 3 Erweiterungen:

4. Größer gleich: >=
5. kleiner gleich: <=
6. ungleich: !=

Manchmal wird gar kein „else“ benötigt. Das Programm soll unter einer bestimmten Bedingung etwas tun, und sonst nichts. Dann verkürzt sich die Struktur entsprechend zu:

if: leitet die Entscheidung ein. Hinter „if“ muss die Bedingung folgen.

endif Beendet den Anweisungsblock.

Manchmal benötigt man zusammengesetzte Bedingungen. Hier ein Beispiel aus dem täglichen Leben:
„Ich gehe Essen, wenn ich Geld habe und ein Restaurant finde.“
Ich gehe also nur unter 2 Bedingungen Essen, die beide erfüllt sein müssen:

1. wenn ich Geld habe;
2. wenn ich ein Restaurant finde;

In dem Beispiel werden die beiden Bedingungen durch ein „und“ verknüpft. Wären Sie durch ein „oder“ verknüpft, dann wäre es ausreichend, dass eine Bedingung erfüllt wäre, um Essen zu gehen. Beide Bedingungen zusammen würde natürlich auch gehen. Dieses Zusammenspiel von mehreren Bedingungen und die Umsetzung in Code wird im nächsten Kapitel eingehender erläutert.

################################
# Logic
# Hans Gruendel
# 4.4.2016
################################

tone = 70

if tone<60
use_synth :fm
else
use_synth :piano
end

play tone
Code 11. Bedingung und if Abfrage