kind: reference

Pseudocode und Struktogramme

Wie du einen Algorithmus aufschreibst, bevor du ihn programmierst: als Pseudocode, der in keiner Programmiersprache geschrieben ist, und als Struktogramm, das ihn als Bild zeigt. Dazu, wie aus beidem Code in Ruby oder Python wird.

Flowchart Techniques for Structured Programming, Isaac Nassi und Ben Shneiderman, ACM SIGPLAN Notices, 1973. Der Aufsatz, in dem die Struktogramme zum ersten Mal vorkommen, als Ersatz für Flussdiagramme mit ihren Pfeilen kreuz und quer: bei der ACM. Darum heißen sie auch Nassi-Shneiderman-Diagramme.

1. Ausprobieren

Schreib Pseudocode ins Feld; daneben oder darunter erscheint das Struktogramm, während du tippst. Den Pfeil ← tippst du als <-, das Feld macht ihn daraus. Hier wird nichts gespeichert; »Als SVG speichern« legt das Bild als Datei ab, für ein Arbeitsblatt oder eine Abgabe.

2. Pseudocode

Pseudocode sieht aus wie ein Programm, ist aber für Menschen geschrieben: Er sagt genau, was in welcher Reihenfolge geschieht, und lässt weg, was nur eine bestimmte Sprache verlangt. Im Handbuch sind die Schlüsselwörter Englisch, wie in fast allen Programmiersprachen; Bemerkungen auf Deutsch stehen in Klammern.

Pseudocode Bedeutung
sum ← 0 eine Zuweisung: sum bekommt den Wert 0. Der Pfeil zeigt, wohin der Wert geht. Tippen kannst du ihn als <-.
a == b, a != b, a < b, a ≤ b Vergleiche: gleich, ungleich, kleiner, kleiner oder gleich; ≤ und ≥ tippst du als <= und >=
and, or, not Bedingungen verknüpfen
a mod b, a div b der Rest und das ganzzahlige Ergebnis einer Division: 17 mod 5 ist 2, 17 div 5 ist 3
list[i], length das Element mit dem Index i (das erste hat den Index 0), die Zahl der Elemente
name(a, b): eine Funktion mit ihren Parametern; eingerückt darunter, was sie tut
return x die Funktion endet und gibt x zurück

Was zu einem if, einer Schleife oder einer Funktion gehört, steht eingerückt unter der Zeile mit dem Doppelpunkt. Eine einzelne Anweisung darf auch gleich hinter dem Doppelpunkt stehen: if x < 0: x ← -x.

3. Die Bausteine eines Struktogramms

Ein Struktogramm ist ein Rechteck, das von oben nach unten gelesen wird. Jeder Baustein ist wieder ein Rechteck, und Bausteine stecken ineinander, wie Blöcke im Code. Es gibt keine Pfeile: Wohin es weitergeht, ergibt sich daraus, wo ein Rechteck steht.

Anweisungen nacheinander

Eine Anweisung ist ein Kasten. Mehrere Anweisungen untereinander werden nacheinander ausgeführt, von oben nach unten; das heißt Sequenz.

width ← 4
height ← 3
area ← width * height

Verzweigung

Bei einer Verzweigung steht oben im Dreieck eine Bedingung. Ist sie wahr, geht es links weiter, sonst rechts. Fehlt else, bleibt die rechte Spalte leer. Danach geht es für beide Seiten unter der Verzweigung weiter.

if temperature < 0:
    print("Glatteis")
else:
    print("kein Glatteis")

Mit else if steckt in der rechten Spalte eine weitere Verzweigung; so wählt das Struktogramm aus mehr als zwei Fällen:

if points ≥ 90:
    grade ← 1
else if points ≥ 75:
    grade ← 2
else:
    grade ← 3

Schleife mit der Bedingung am Anfang

Eine kopfgesteuerte Schleife prüft ihre Bedingung, bevor sie den Block ausführt, und dann vor jedem weiteren Mal. Ist die Bedingung schon am Anfang falsch, läuft der Block kein einziges Mal. Der Block steht rechts neben dem Balken.

while n > 0:
    digits ← digits + 1
    n ← n div 10

Eine Zählschleife zählt eine Variable von einem Wert bis zu einem anderen, oder sie geht der Reihe nach durch alle Elemente einer Liste. Im Struktogramm sieht sie aus wie eine kopfgesteuerte Schleife:

for i from 1 to 10:
    print(i * i)

Schleife mit der Bedingung am Ende

Eine fußgesteuerte Schleife führt den Block zuerst aus und prüft erst danach, ob sie aufhört. Der Block läuft also mindestens einmal; das passt, wenn man erst etwas versuchen muss, um zu wissen, ob es gereicht hat.

repeat:
    guess ← read_number()
until guess == secret

Eine Funktion

Über dem Struktogramm einer Funktion steht ihr Name mit den Parametern. return beendet sie, auch mitten in einer Schleife.

contains(list, wanted):
    for each element in list:
        if element == wanted: return true
    return false

4. Vom Pseudocode zum Code

Pseudocode Ruby Python
sum ← 0 sum = 0 sum = 0
a == b and not c a == b && !c a == b and not c
a mod b, a div b a % b, a / b (bei ganzen Zahlen) a % b, a // b
if x < 0: … else if x == 0: … else: if x < 0 … elsif x == 0 … else … end if x < 0: … elif x == 0: … else:
while n > 0: while n > 0 … end while n > 0:
for i from 0 to 11: (0..11).each do |i| … end for i in range(0, 12):
for each x in list: list.each do |x| … end for x in list:
repeat: … until done loop do … break if done end while True: … if done: break
name(a, b): … return x def name(a, b) … return x end def name(a, b): … return x

Vorsicht bei der Zählschleife: for i from 0 to 11 zählt die 11 mit. Ruby schreibt das genauso (0..11), Pythons range hört dagegen eins vorher auf, darum range(0, 12).

5. Zum Nachschlagen

  • Die Sinnbilder der Struktogramme sind in der Norm DIN 66261 (1985) festgelegt; sie ist nicht frei im Netz.
  • Pseudocode für viele Algorithmen, Schritt für Schritt zum Durchklicken: Sortieren, Listen, Stack und Queue, Graphen.
  • Die Grundlagen beider Sprachen nebeneinander: Ruby und Python.