Entscheidungen über Entscheidungen

Was werden wir behandeln?
  • Das dritte Programmierkonstrukt - Verzweigungen
  • Einfache Verzweigungen und mehrfache Verzweigungen
  • Gebrauch von Boole'schen Ausdrücken

Der dritte unserer Grundbausteine ist das Verzweigen oder bedingte Anweisungen. Diese einfachen Begriffe beschreiben die Fähigkeit, innerhalb unserer Programme eine oder mehrere verschiedene mögliche Befehlsabläufe ausführen zu können (Verzweigungen), in Abhängigkeit von bestimmten Bedingungen.

Damals in den ersten Jahren von Assemblerprogrammen war das ein JUMP-Befehl (jump = Sprung), wobei das Programm wörtlich auf eine spezifizierte Speicheradresse gesprungen ist, üblicherweise wenn das Ergebnis einer vorangegangenen Instruktion Null war. Erstaunlich komplexe Programme waren damals mit tatsächlich keiner anderen Bedingungsform möglich - gerechtfertigt durch das von Dijkstra aufgestellte Theorem über Minimalanforderungen für das Programmieren. Als die höherentwickelten Sprachen entstanden, erschien eine neue Version des JUMP-Befehls, genannt GOTO. Tatsächlich ist BASIC immer noch mit GOTO ausgestattet, du kannst das ausprobieren, indem du das folgende Stückchen Code eintippst:

10 PRINT "Beginne bei Zeile 10"
20 J = 5
30 IF J < 10 GOTO 50
40 Print "Diese Linie wird nicht gedruckt"
50 STOP

Beachte, wie in einem so kurzen Programm es mehrere Sekunden dauert, sich vorzustellen, was geschehenn wird. Es gibt keine Struktur im Code, du musst dir das genauso vorstellen, wie du es liest. In grossen Programmen wird das unmöglich. Aus diesem Grunde haben moderne Programmiersprachen entweder keinen direkte JUMP- oder GOTO-Anweisung, oder raten dir ab, davon Gebrauch zu machen.

Die if - Anweisung

Die am intuitivsten nachvollziehbare Konditionalanweisung ist das if, then, else-Konstrukt. Es folgt der Logik auf Englisch, dass, wenn ( = if) eine Boole'sche Bedingung wahr ist, dann (= then) wird ein Block von Anweisungen ausgeführt, andernfalls ( oder else) wird ein anderer Block ausgeführt.

Dies sieht dann in BASIC so aus:

PRINT "Beginne hier"
J = 5
IF J > 10 THEN
    PRINT "Dies wird nie gedruckt"
ELSE
    STOP
END IF

Hoffentlich ist das leichter zu lesen und verstehen, als das vorhergehende GOTO-Beispiel. Selbstverständlich können wir hinter das if jede Testbedingung, solange sie als wahr oder falsch auswertbar ist , z.B. ein Boole'scher Wert, einsetzen.

Python schaut ganz ähnlich aus:

import sys  # nur für das exit
print "Beginne hier"
j = 5
if j > 10:
    print "Dies wird nie gedruckt"
else:
    sys.exit()

Das ist fast identisch, oder nicht?

Du kannst beginnen diese if/then/else-Anweisungen miteinander zu verketten, durch Verschachtelung von einer innerhalb der anderen, etwa so:

# Angenommen breite wurde vorher erzeugt...
if breite == 100:
   flaeche = 0 
else:
   if breite == 200:
      laenge = laenge * 2
   else:
      if breite == 500:
           breite = breite/10
      else:
           print "Die Breite hat einen unerwarteten Wert!"

Anmerkung: wir verwenden == um die Gleichheit in jeder if - Anweisung zu testen, wohingegen wir = verwenden, um Variablen Werte zu zuordnen. Der Gebrauch von =, wenn man die Benutzung von == meint, ist einer der üblichsten Fehler bei der Pythonprogrammierung; glücklicherweise warnt dich Python, dass dies ein Syntaxfehler ist, aber du musst dennoch genau schauen, um das Problem zu lokalisieren.

Boole'sche Ausdrücke

Du wirst dich erinnern können, dass wir in der 'Rohmaterial'-Abteilung einen Boole'schen Datentyp angesprochen haben. Wir sagten, dass er nur zwei Werte hat: wahr oder falsch. Wir erzeugen sehr selten eine Boole'sch Variable, wir erzeugen aber oft temporäre Boole'sche Werte bei Ausdrücken. Ein Ausdruck ist eine Kombination von Variablen und Werten verknüpft durch Operatoren, um einen Wert zu produzieren. In dem folgenden Beispiel:

if x < 5:
  print x

ist x < 5 ein Ausdruck. Ausdrücke können beliebig komplex ausgestattet sein, um einen einzigen Endwert zu erhalten. Im Falle einer Verzweigung muss dieser Wert entweder wahr oder falsch sein. Dennoch, die Definition dieser beiden Werte variiert von Sprache zu Sprache. In vielen Sprachen ist falsch das Gleiche wie 0 oder nicht-existent (oft genannt NULL, Nil oder None). So wird eine leere Liste oder String in einem Boole'schen Kontext als falsch gewertet. Dies bedeutet, wir können eine while-Schleife verwenden, um eine Liste zu bearbeiten, bis die Liste leer ist. Python, QBASIC und Tcl verwenden alle die Boole'schen Werte ähnlich.

Tcl-Verzweigungen

Tcl's if-Anweisung ist sehr ähnlich, und sieht so aus:

if {$x < 5} {
   puts $x
}elseif {$x == 5} {
   puts "es ist 5!"
}else{
   puts "größer als 5"
   }

Das ist einleuchtend, natürlich sind die elseif und else Teile optional. Aber du hast das bestimmt schon vermutet.

Case - Anweisungen

Eine Befehlsfolge von verschachtelten if/else/if/else... ist eine solch allgemeine Konstruktion, dass viele Sprachen mit einem speziellen Verzweigungtyp dafür ausgestattet sind. Dies wird oft bezogen auf eine Case oder Switch -Anweisung und die Tcl-Version sieht so aus:

switch $width {
    100 { set flaeche 0} 
    200 { set laenge [expr {$laenge * 2}] }
    500 { set breite [expr {$breite / 2}] }
    }

Weder BASIC noch Python besitzen ein solche Konstruktion, gleichen dies aber durch ein einfacheres if/elseif/else-Format aus:

if breite < 100:
   flaeche = 0 
elif breite <200:
   laenge = laenge * 2
elif breite < 500:
   breite = breite/10
else:
print "Die Breite ist zu groß!"

Beachte den Gebrauch von elif und die Tatsache, dass der Einzug (äußerst wichtig in Python) sich nicht ändern darf. Es ist auch bemerkenswert, dass beide Pythonversionen dieses Programmes absolut gleichwertig sind, das Zweite ist nur leichter zu lesen, wenn es mehr Tests enthält.

BASIC ist mit einer etwas beschwerlicheren Version durch ElseIf...THEN ausgestattet, die auf die exakt gleiche Art, wie das Python-elif verwendet wird.

Zur Erinnerung
  • Verwende if/else zur Verzweigung
  • Das else ist optional
  • Mehrfache Entscheidungen können durch ein CASE oder if/elif -Konstrukt dargestellt werden.
  • Boole'sche Ausdrücke geben wahr oder falsche zurück

zurück  weiter  Inhalt


Im Falle von Fragen oder Hinweisen sende eine Nachricht auf Englisch an alan.gauld@yahoo.co.uk

oder auf Deutsch an bup.schaefer@freenet.de