PureBasic: Bedingungen
Bisher waren die kleinen Beispielprogramme sehr undynamisch, soll heißen, sie haben von oben nach unten die Befehle abgearbeitet. Es gibt jedoch sogenannte Kontrollstrukturen, mit denen man den Ablauf dynamischer gestalten kann.
; Listing 9: If-Else-Klausel
EnableExplicit
Define x.i
OpenConsole()
x = Val(Input())
If x < 3
PrintN("x ist kleiner als 3")
ElseIf x = 4
PrintN("x ist genau 4")
Else
PrintN("x ist größer als 4")
EndIf
Delay(2000)
Ausgabe:
2 x ist kleiner als 3 4 x ist genau 4 5 x ist größer als 4
Wenn man das Programm kompiliert und ausführt, erwartet es die Eingabe einer ganzen Zahl. Je nachdem, ob man nun einer Zahl kleiner 3, genau 4 oder eine andere eintippt, erhält man eine andere Ausgabe. Man erhält dieses Verhalten durch sogenannte If-Else-Klauseln, die nach logischen Prinzipien auf die Werte reagieren. Die Schlüsselwörter (also Wörter, die die Sprache an sich ausmachen und keine Befehle, Konstanten oder Variablen sind, sondern zu ihrer Realisierung vonnöten sind) sind dabei wörtlich aus dem Englischen zu übersetzen: Wenn (If) x kleiner als 3 ist..., ansonsten, wenn (ElseIf) x genau 4 ist..., ansonsten (Else)...
Das "kleiner als"-Zeichen (<) und das "ist gleich"-Zeichen (=) sind sogenannte Vergleichsoperatoren, d.h. sie vergleichen zwei Werte. Werte können hierbei vieles sein: Variablen, Konstanten, Strings, Zahlenwerte. Es gibt natürlich auch ein "größer als"-Zeichen (>), ein "ist ungleich"-Zeichen (<>) und ein "größer oder gleich"- bzw. "kleiner oder gleich"-Zeichen (>= bzw. <=).
Wichtig ist, zu verstehen, dass die Vergleiche von oben nach unten durchgeführt werden, wenn jedoch ein Vergleich zutrifft (man sagt er ist wahr, ansonsten ist er falsch), z.B. im ersten Fall x wirklich kleiner als 3 ist, werden die Befehle unter dem Vergleich durchgeführt und die anderen Vergleiche ignoriert, d.h. das Programm springt sofort in der Programmausführung unter EndIf.
Logische Verknüpfungen
BearbeitenIf-Else-Klauseln helfen also dabei, ein Programm dynamischer zu gestalten. Trotzdem sind mit diesen noch nicht alle Fälle abgedeckt, die bei Vergleichen auftreten können. Was ist z.B. wenn zwei Bedingungen gleichzeitig erfüllt sein sollen? Hier kommen logische Verknüfungen zum Tragen.
; Listing 10: And, Or
EnableExplicit
Define.i x, y
OpenConsole()
x = Val(Input())
y = Val(Input())
If x <= 3 And y >= 2
PrintN("x ist kleiner oder gleich 3 und y ist größer oder gleich 2")
ElseIf x > 3 Or y < 2
PrintN("x ist größer als 3 oder y ist kleiner als 2")
EndIf
Delay(2000)
Ausgabe:
3 2 x ist kleiner oder gleich 3 und y ist größer oder gleich 2 5 2 x ist größer als 3 oder y ist kleiner als 2
Das Programm funktioniert wie "Listing 9", jedoch werden diesmal zwei Eingaben erwartet. Neben den neuen Vergleichsoperatoren, die auch schon oben erwähnt wurden, werden hier die logischen Verknüpfungen eingeführt. Auch hier kann wieder wörtlich übersetzt werden. Im ersten Fall muss x kleiner oder gleich 3 sein und y muss größer oder gleich 2 sein. Falls der erste Fall jedoch nicht zutrifft, reicht es im zweiten Fall, wenn x größer als 3 ist oder y kleiner als zwei ist. Solche Verknüpfungen können beliebig komplex sein. Außerdem ist es möglich, nach mathematischen Regeln Vergleiche einzuklammern, sodass bestimmte Vergleiche vor anderen getätigt werden und deren Ergebnis zurückgegeben wird, z.B. (... Or ...) And .... Es muss also der eingeklammerte Vergleich zutreffen und ein weiterer, ansonsten ist die gesamte Bedingung falsch.
Es gibt noch weitere logische Verknüpfungen, wie z.B. das sogenannte Exklusiv-Oder. Wie diese benutzt werden, steht in der Referenz.
Eine Sonderrolle nimmt die logische Verknüpfung Not ein, die einen Vergleich umkehrt. Eine If-Klausel würde dann ausgeführt werden, wenn ein Vergleich falsch wäre. If Not x < 3 wäre also das gleiche wie If x >= 3.
Fallunterscheidung mit Select
BearbeitenEine weitere Möglichkeit, ein Programm dynamischer zu gestalten, ist die sogenannte Fallunterscheidung. Dafür gibt es das Select-Schlüsselwort.
; Listing 11: Select
EnableExplicit
Define x.i
OpenConsole()
x = Val(Input())
Select x
Case 1
PrintN("x ist gleich 1")
Case 2, 3, 4
PrintN("x ist gleich 2, 3 oder 4")
Case 5 To 10, 11
PrintN("x hat einen Wert zwischen 5 und 10 oder ist 11")
Default
PrintN("x ist größer als 11 oder kleiner als 1")
EndSelect
Delay(2000)
Ausgabe:
1 x ist gleich 1 4 x ist gleich 2, 3 oder 4 -1 x ist größer als 11 oder kleiner als 1 9 x hat einen Wert zwischen 5 und 10 oder ist 11
Wieder wird die Eingabe von x erwartet. Dann wird der Wert von x unterschieden. Es werden immer die Befehle ausgeführt, die unter dem eingetroffenen Fall stehen. Wenn x also 1 ist, wird der Befehl PrintN("x ist gleich 1") ausgeführt und danach springt das Programm direkt zu Delay(2000). Außerdem ist es möglich, mehrere Fallunterscheidungen zu kombinieren, damit nicht jeder Fall einzeln betrachtet werden muss, wenn die gleichen Befehle ausgeführt werden sollen. Dafür schreibt man entweder die Fälle mit Kommata getrennt oder benutzt das To-Schlüsselwort, das nur für Zahlen funktioniert und alle Zahlen von ... bis (To) ... unterscheidet. Wenn kein Fall zutrifft, wird der optionale Standardfall (Default) ausgeführt.
Zuletzt sei gesagt, dass neben Strings nur ganze Zahlen unterschieden werden. Wenn man einen Float übergibt, wird die Zahl zur nächsten Ganzzahl abgerundet.
Aufgaben
Bearbeiten- Es soll das Umfangsprogamm aus dem vorigen Kapitel so abgeändert werden, dass es einen Umfang von 0 ausgibt, wenn ein negativer Radius eingegeben wird.
- Es soll ein Programm geschrieben werden, bei dem man die Geschwindigkeit eines Autos eingibt und das darauf ausgibt, ob der Wagen zu schnell fährt und wenn, wieviel zu schnell. Als Tempolimit kann 50 km/h angenommen werden.