Was werden wir behandeln? |
---|
|
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 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.
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'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.
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 |
---|
|
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