Tabellarische Programmausführung

In diesem Abschnitt lernen wir eine systematische Methode kennen, die Ausführung eines Programms zu dokumentieren. Sich im Kopf zu überlegen, welche Variablen wann mit welchen Werten belegt sind, wird bei größeren Programmen schnell unübersichtlich. Übersichtlicher ist eine tabellarische Notation, die zeilenweise festhält, wie sich die Werte von Variablen schrittweise verändern.

Um verschiedene Positionen in einem Programm zu benennen, schreiben wir hinter jede Anweisung einen Kommentar mit einer fortlaufenden Nummer. Auch die Bedingung in bedingten Anweisungen und bedingten Wiederholungen benennen wir mit solchen sogenannten Programmpunkten.

Das folgende Programm zur Berechnung des Absolutbetrags des Wertes einer Variablen x ist mit Programmpunkten annotiert.

x = -4      #1
if x < 0:   #2
  x = -1*x  #3

Die folgende Tabelle demonstriert die Ausführung dieses Programms:

Programmpunkt (PP)xx < 0
#1-4
#2True
#34

Jede Zeile der Tabelle beschreibt Werte von Variablen oder Bedingungen an einem bestimmten Programmpunkt. Der Wert von x ändert sich zweimal, der Wert der Bedingung x < 0 wird einmal ausgewertet.

Die Programmpunkte eines Programms werden nicht immer in ihrer textuellen Reihenfolge durchlaufen. Beim Programm zur Berechnung des Maximums zweier Zahlen wird zum Beispiel eine Zuweisung übersprungen.

x = 4     #1
y = 5     #2
if x > y: #3
  z = x   #4
else:
  z = y   #5
print(z)  #6

Die folgende Tabelle dokumentiert die Ausführung dieses Programms:

PPxyzx > yAusgabe
#14
#25
#3False
#55
#65

Hier wird der Programmpunkt #4 im if-Zweig der bedingten Anweisung übersprungen, weil die Bedingung x > y nicht erfüllt ist. Neben den verwendeten Variablen und Bedingungen dokumentiert diese Tabelle auch die Ausgaben mit print im Terminal.

Interessant werden solche Tabellen besonders, wenn Anweisungen durch Schleifen wiederholt werden. Auch die Deklaration einer Wiederholung mit fester Anzahl bekommt dabei eine eigene Nummer, um die Werte der Zählvariable zu protokollieren.

Hier ist ein Programm, angereichert mit Programmpunkten, zur Berechnung der Summe der ersten drei Zahlen:

sum = 0                 #1
for i in range(1,4):    #2
  sum = sum + i         #3
print(sum)              #4

Die folgende Tabelle protokolliert dessen Ausführung:

PPsumiAusgabe
#10
#21
#31
#22
#33
#23
#36
#46

Hier werden die Programmpunkte #2 und #3 dreimal hintereinander durchlaufen, wobei die sich ändernden Werte der Variablen i und sum protokolliert werden.

Schließlich dokumentieren wir noch die Berechnung der Wurzel aus neun als Beispiel eines Programms mit bedingter Schleife.

n = 9               #1
i = 0               #2
q = 0               #3
while q < n:        #4
  i = i + 1         #5
  q = q + 2*i - 1   #6
print(i)            #7

Die folgende Tabelle zeigt, wie es zur der Ausgabe 3 am Ende des Programms kommt:

PPniqq < nAusgabe
#19
#20
#30
#4True
#51
#61
#4True
#52
#64
#4True
#53
#69
#4False
#73

Hier werden die Programmpunkte #4, #5 und #6 dreimal durchlaufen. Es wird deutlich, dass vor und nach jedem Schleifendurchlauf der Wert der Variablen q gleich dem Quadrat des Wertes von i ist. Eine solche Bedingung, die sich durch die Ausführung des Schleifenrumpfes nicht verändert, heißt Schleifen-Invariante. Sie hilft uns zu erkennen, dass die Ausgabe des Programms die Quadratwurzel von q ist. Ist n eine Quadratzahl, so ist bei Programmende q gleich n, die Ausgabe also die Quadratwurzel von n.