Programmsteuerung 1: Bedingungsabfrage mit "if"
Die If-Abfrage wird verwendet, um Programmcode nur dann auszuführen, wenn angegebene Bedingungen erfüllt sind.
if
if [Bedingung(en) vom Typ Boolean] then begin // Ausführen, wenn Bedingung erfüllt ist // Hier sind weitere Anweisungen durch begin und end getrennt. end; // Ende der IF-Abfrage |
if [Bedingung(en) vom Typ Boolean] then // Befehl, der ausgeführt werden soll. |
if .. else
Hierbei gibt es die Möglichkeit, Anweisungen nur dann ausführen zu lassen,
wenn die Bedingung(en) des if-Teiles nicht erfüllt sind:
Auch hier kann bei einer einzigen Anweisung ein paar Zeilen gespart werden.
if [Bedingung(en) vom Typ Boolean] then begin // Ausführen, wenn Bedingung erfüllt ist! // Hier sind weitere Anweisungen durch begin und end getrennt. end // Ende der IF-Abfrage - Wichtig: hier jetzt kein Semikolon! else // ansonsten begin // Ausführen, wenn Bedingung nicht erfüllt ist! end; // ende des else-Abschnittes |
if [Bedingung(en) vom Typ Boolean] then // Befehl, der ausgeführt werden soll, // wenn Bedingung erfüllt ist (ohne Semikolon!) else // Befehl, der ausgeführt werden soll, // wenn Bedingung nicht erfüllt ist. |
if ... else if ... else
Wenn es mehrere Bedingungen zu überprüfen gibt, dann lässt sich das grob wie folgt schreiben:
Auch hier nochmal in "Kurz":
if [Bedingung(en) vom Typ Boolean] then begin ... end else if [Bedingung(en) vom Typ Boolean] then begin ... end //...hier lässt sich das nahezu unendlich wiederholen... else begin ... end; |
if [Bedingung(en)1 vom Typ Boolean] then // Befehl, der ausgeführt werden soll, // wenn Bedingung(en)1 erfüllt ist (wieder ohne Semikolon!) else if [Bedingung(en)2 vom Typ Boolean] then // Befehl, der ausgeführt werden soll, // wenn Bedingung(en)2 erfüllt ist (wieder ohne Semikolon!) //... else // Befehl, der ausgeführt werden soll, wenn keine Bedingung erfüllt ist. |
Verschachtelung
Verschachtelungen können z.B. helfen, wenn die Bedingung in der ersten if zu komplex wird und
man einen Überblick wiederbekommen möchte.
Hierbei lasse ich die "Kurzform" weg, da hier schnell die übersicht doch verloren geht, sobald
es mehrere else-Teile gibt oder ein else-Teil weg fällt. Die Kurzform sollte maximal in der
obersten Ebene genutzt werden, aber sonst nicht. Noch besser ist es, in solchen Fällen ganz
von der Kurzform Abstand zu nehmen, um den Kolleginnen und Kollegen keinen Kopfsalat zu bereiten.
if [Bedingung(en) vom Typ Boolean] then // 1. Ebene begin if [Bedingung(en) vom Typ Boolean] then // 2. Ebene begin if [Bedingung(en) vom Typ Boolean] then // 3. Ebene ...; // auch einzeilige Bedingungs-Abfragen möglich ...;// das ist außerhalb der 3. und innerhalb der 2. Ebene! // Auch die Verschachtelung kann nahezu unendlich gehen... // ... was allerdings langfristig auf Kosten // der Übersichtlichkeit und sog. Wartbarkeit geht :-/ end // von 2. Ebene else // auch einzeilige else-Teile sind möglich begin ...; end; end // von 1. Ebene else begin ...; end; // von 1. Ebene |
Was sind nun diese Bedingungen vom Typ Boolean?
Wir meinen hier mit bedingungen Wahrheitsaussagen. Der Variablentyp dafür ist Boolean.
Mögliche Werte für Boolean sind: true und false - mehr nicht.
Also all das mit dem 1 und 0, was so das Klischee bei Informatikern ist, behandeln wir jetzt ;)
Also all das mit dem 1 und 0, was so das Klischee bei Informatikern ist, behandeln wir jetzt ;)
Wir können mittels Vergleichen eine solche Wahrheitsaussage erzeugen:
Einfache Vergleiche gibt es folgende:
Operator | Beschreibung | Beispiel | |
---|---|---|---|
= | Vergleich auf Gleichheit |
|
|
> | Größer als |
|
|
>= | Größer gleich |
|
|
< | Kleiner als |
|
|
<= | Kleiner gleich |
|
|
<> | Ungleich |
|
Eine einfache Bedingung kann somit ein Vergleich mit den Operatoren sein,
wie der folgende Code-Ausschnitt kurz zeigen soll:
var i : Integer; begin // ein Wert aus einem Eingabefeld lesen und in Integer umwandeln i := StrToInt( edEingabefeld.Text); if i = 1 then ShowMessage('Ihre Eingabe war Eins') else if i < 10 then ShowMessage('Ihre Eingabe war kleiner 10') else if i <= 20 then ShowMessage('Ihre Eingabe war zwischen 10 und 20 oder exakt 10 oder 20') else if i <> 21 then ShowMessage('Ihre Eingabe war nicht 21') else ShowMessage('Ihre Eingabe war 21'); end; |
Versuche es gerne selbst aus - alle Sources befinden sich ansonsten auf
GitHub
als komplette Projekte.
Viel Spaß ;)
OK, und wie können wir nun mehrere "Bedingungen" nutzen?
Nichts leichter als das - wir verknüpfen sie einfach ;)
Es gibt dabei folgende Verknüpfungsmöglichkeiten:
Es gibt dabei folgende Verknüpfungsmöglichkeiten:
UND-Verknüpfung: AND
Gesamtausdruck wird nur dann "wahr", wenn alle Teile "wahr sind"
if (i >= 1990) and (i < 2000) then |
ODER-Verknüpfung: OR
Gesamtausdruck wird dann "wahr", sobald einer der Teile "wahr" ist
if (i = 3) OR (i=10) then |
Exklusiv-ODER-Verknüpfung: XOR
Gesamtausdruck wird dann "wahr", wenn einer der Teile "wahr" ist, aber nicht, wenn beide wahr sind.
Dies ist in der Tat etwas spezielles und kann z.B. bei einer einfachen Verschlüsselung genutzt werden.
if (a = 3) XOR (b = 10) then |
Wichtig:
Verknüpft man in Delphi Wahrheiten miteinander,
müssen diese in Klammern gesetzt werden!
Ansonsten sollte man keine Klammern benutzen
-> Sprechender Quelltext :-)
-> Sprechender Quelltext :-)
Im folgenden sollen diese Wahrheitsverknüpfungen kurz tabellarisch nochmal zusammengefasst werden.
Diese Aufstellung in Tabellen kann hier gut weiterhelfen. Folgende Tabelle zeigt kurz, wie die Tabellen
gelesen werden können.
A verknüpft mit B | B ist wahr | B ist falsch |
A ist wahr | (Ergebnis von A=Richtig und B=Richtig) | (Ergebnis von A=Richtig und B=Falsch) |
A ist falsch | (Ergebnis von A=Falsch und B=Richtig) | (Ergebnis von A=Falsch und B=Falsch) |
Folgende Tabelle zeigt die UND-Verknüpfung:
(a = 3) AND (b = 10) | b:=10; | b:=1; |
a:=3; | WAHR | FALSCH |
a:=1; | FALSCH | FALSCH |
Folgende Tabelle zeigt die ODER-Verknüpfung:
(a = 3) OR (b = 10) | b:=10; | b:=1; |
a:=3; | WAHR | WAHR |
a:=1; | WAHR | FALSCH |
Folgende Tabelle zeigt die Exklusiv-ODER-Verknüpfung -
Die Bedingung in der if-Anweisung wird dann wahr, wenn entweder a=3 oder b=10 ist,
aber nicht, wenn beides Richtig oder beides falsch ist:
(a = 3) XOR (b = 10) | b:=10; | b:=1; |
a:=3; | FALSCH | WAHR |
a:=1; | WAHR | FALSCH |
Wahrheitswert umkehren
Manchmal kommt es vor, dass man einen größeren Ausdruck hat, von dem man jetzt aber genau das Gegenteil möchte.
Klar, wir wissen im Grunde jetzt schon, dass wir hierfür "else" benutzen können, aber wenn wir nur eine
Bedingungsabfrage brauchen, dann können wir die Negation mit NOT wie folgt nutzen:
if not s = 'ping' then // ist das selbe wie if s <> 'ping' then |
Zum Abschluss der "Programmsteuerung 1" hier noch mehr Beispiele, die direkt per Copy&Paste in ein neues
Projekt eingefügt werden kann - naja, am Besten den Teil ab var bis zum Ende. Aufpassen, dass nicht ein
"end;" zu viel übrig bleibt ;)
procedure TForm1.Button1Click(Sender: TObject); var b : Boolean; i,k,m : Integer; begin // Benutzerabfrage: if Application.MessageBox('Wollen Sie wirklich weitermachen?', 'Frage', MB_YESNO+MB_ICONQUESTION)=ID_YES then ShowMessage('Gute Wahl!') else if Application.MessageBox('Haben Sie Fragen?', 'Frage', MB_YESNO+MB_ICONQUESTION)=ID_YES then ShowMessage('...dann mailen Sie mir gerne Ihre Fragen ;-)') else ShowMessage('Wo liegt denn das Problem?'); { Hinweis: Mehr zu Application.MessageBox findet man in der Hilfe von Delphi } // ein einfaches Beispiel: i := 15; k := 10; b := (i=15) XOR (k=15); if b then k := i div 3; b := ((i+k) = 20) AND ((i-k) > k); if not b then ShowMessage('Die Bedingung mit der UND-Verknüpfung ist "false"') else ShowMessage('Die Bedingung mit der UND-Verknüpfung ist "true"'); // ein bisschen trickreicher! -> kleine Aufgabe: // "rechen" den Script in Gedanken durch! // kommen wir an die Meldung "Ziel"? i := 5; k := 18; m := k mod i; if m=3 then begin i := k*m - i; if i=49 then begin k := i div m; m := (i mod 10) * 3-k; if (k=16) XOR (m=k div 2) then ShowMessage('Ziel') else ShowMessage('Nope'); end else ShowMessage('Ziel nicht erreicht'); end else ShowMessage('So geht es nicht zum Ziel'); end; |
Und zum Schluss nochmal kurz der Hinweis zu
GitHub :)
Viel Spaß ;)
Viel Spaß ;)