Warum übersetzen?
Ein Struktogramm beschreibt einen Ablauf, ein Programm führt ihn aus. Die Bausteine sind dieselben: Sequenz, Verzweigung, Schleife, Feld (Array), Unterprogramm. Python schreibt sie nur in einer anderen Schreibweise, und weil Python fast ohne Klammern und Semikolons auskommt, liest sich der Code beinahe wie der Pseudocode aus Lektion 1. Der Vorteil für dich: Du kannst jedes Struktogramm, das du zeichnest, in wenige Zeilen übersetzen, im Browser ausführen und die Ausgabe mit deinem Schreibtischtest (Wertetabelle) vergleichen. Stimmt beides überein, stimmt die Logik.
Du musst dafür nicht programmieren können. Die Übersetzungstabelle unten reicht für alles, was in diesem Kurs vorkommt. Wer mehr will, findet im Python-Kurs den ganzen Weg von der ersten Ausgabe bis zu Klassen und Objekten.
Die Übersetzungstabelle
Links die Schreibweise aus Struktogramm und Pseudocode, rechts das Gegenstück in Python. Drei Dinge fallen auf: Python schreibt Schlüsselwörter klein und englisch, Blöcke enden nicht mit „ENDE …“, sondern werden nur durch die Einrückung zusammengehalten, und jede Kopfzeile endet mit einem Doppelpunkt.
| Struktogramm / Pseudocode | Python | Hinweis |
|---|---|---|
| WENN … DANN / SONST / ENDE WENN | if …: / elif …: / else: | Kein ENDE, der Block endet, wo die Einrückung endet. Eine Verzweigungskette wird zu if, elif, else. |
| SOLANGE … / ENDE SOLANGE | while …: | Kopfgesteuert, genau wie im Struktogramm. |
| FÜR i = 1 BIS n | for i in range(1, n + 1): | range(a, b) zählt von a bis b − 1. Für „bis n“ musst du n + 1 schreiben. |
| WIEDERHOLE … BIS bedingung | while True: mit if bedingung: break am Ende | Python hat keine fußgesteuerte Schleife. Alternative: Bedingung umkehren und als while schreiben, mit einer ersten Eingabe vor der Schleife. |
| FALLS x / FALL 1: / SONST | if x == 1: / elif x == 2: / else: | Die Mehrfachauswahl wird zur Verzweigungskette. |
| DIV | // | Ganzzahlige Division. Das einfache / liefert Nachkommastellen. |
| MOD | % | Rest der Division. |
| UND / ODER / NICHT | and / or / not | Klein geschrieben, sonst gleich. |
| Feld zahlen[i], erstes Element Index 1 | Liste zahlen[i], erstes Element Index 0 | Anzahl mit len(zahlen). Letztes Element ist zahlen[n - 1]. |
| FUNKTION name(a, b): Typ / RÜCKGABE x | def name(a, b): / return x | Ohne Datentypen. Eine Prozedur ist ein def ohne return. |
| EINGABE n | n = int(input()) | input() liefert Text; int() macht eine Ganzzahl daraus, float() eine Kommazahl. Im Browser öffnet sich dafür ein kleines Fenster. |
| AUSGABE x, y | print(x, y) | Mehrere Werte mit Komma, getrennt durch ein Leerzeichen. |
| Zuweisung =, Vergleich ==, != | =, ==, != | Identisch mit der Konvention dieses Kurses. |
Beispiel 1: Summe von 1 bis n
Das erste Struktogramm aus Lektion 1, daneben die Übersetzung. Zeile für Zeile: Die Eingabe ersetzt du durch einen festen Wert, damit der Code ohne Fenster läuft; die Zählschleife „für i = 1 bis n“ wird zu range(1, n + 1), weil die Obergrenze bei range nicht dazugehört.
Struktogramm
Python
n = 5 # in der Prüfung: Eingabe n
summe = 0
for i in range(1, n + 1):
summe = summe + i
print(summe)Führe den Code aus. Für n = 5 muss 15 erscheinen, genau wie im Schreibtischtest aus Leseaufgabe 1.1. Ändere dann n auf 3 (Ausgabe 6) oder auf 0 (Ausgabe 0, die Schleife läuft nicht) und vergleiche mit dem, was du in Lektion 1 gelernt hast. Wer statt n + 1 nur n schreibt, bekommt 10 statt 15: ein Durchlauf zu wenig, der klassische Off-by-one-Fehler.
Tab rückt ein. Esc, dann Tab verlässt den Editor. Strg + Enter führt aus.
Python wird einmalig im Browser geladen (ein paar Sekunden). Danach laufen alle Übungen sofort.
Beispiel 2: Maximum mit Index
Beim Feld wird es interessant, denn hier verschiebt sich der Index. Im Kurs hat das erste Element den Index 1, in Python den Index 0. Das Struktogramm aus Lektion 5 startet mit zahlen[1] und läuft von 2 bis n; die Übersetzung startet mit zahlen[0] und läuft von 1 bis n − 1, also range(1, n). Jede Grenze rutscht um eins nach unten, die Anzahl der Durchläufe bleibt gleich.
Struktogramm (Index ab 1)
Python (Index ab 0)
zahlen = [4, 9, 2, 7]
n = len(zahlen)
maximum = zahlen[0] # erstes Element hat Index 0
pos = 0
for i in range(1, n): # zweites bis letztes Element
if zahlen[i] > maximum:
maximum = zahlen[i]
pos = i
print(maximum, pos) # 9 1
print(maximum, pos + 1) # 9 2, wie im StruktogrammDie Variable heißt im Code maximum statt max, weil max in Python eine eingebaute Funktion ist, die man nicht überschreiben sollte. Für [4, 9, 2, 7] gibt die erste Ausgabe „9 1“ aus: der Wert 9 an Python-Index 1. Das Struktogramm in Lektion 5 sagt „9, 2“. Beides meint dasselbe Element, das zweite. Beachte auch das Format: print trennt mehrere Werte durch ein Leerzeichen, im Struktogramm und im Pseudocode schreibt der Kurs sie mit Komma. Wenn eine Aufgabe die Position ab 1 verlangt, gibst du pos + 1 aus, wie in der zweiten Zeile.
| Element | Struktogramm i | Python i | zahlen[i] |
|---|---|---|---|
| erstes | 1 | 0 | 4 |
| zweites | 2 | 1 | 9 |
| drittes | 3 | 2 | 2 |
| viertes | 4 | 3 | 7 |
Tab rückt ein. Esc, dann Tab verlässt den Editor. Strg + Enter führt aus.
Python wird einmalig im Browser geladen (ein paar Sekunden). Danach laufen alle Übungen sofort.
Probiere das Feld [3, 8, 5, 8, 1] aus Leseaufgabe 5.1: Die erste Zeile muss „8 1“ zeigen (die zweite „8 2“), also die erste 8. Und ersetze > durch >=: Dann wird die letzte 8 gemerkt, mit >= „8 3“ bzw. „8 4“.
Umgekehrt: aus Python ein Struktogramm
In der Prüfung kommt gelegentlich ein kurzer Codeausschnitt vor, zu dem ein Struktogramm oder ein Schreibtischtest verlangt wird. Der Weg ist derselbe wie eben, nur rückwärts: Jede Kopfzeile mit Doppelpunkt wird zu einem Baustein, die eingerückten Zeilen darunter zu seinem Rumpf oder Zweig. Beispiel:
n = 20
schritte = 0
while n > 1:
n = n // 2
schritte += 1
print(schritte)Zwei Kurzschreibweisen musst du kennen: n // 2 ist die ganzzahlige Division, also DIV, und schritte += 1 ist die Abkürzung für schritte = schritte + 1. Der Rest ist die kopfgesteuerte Schleife aus Lektion 3:
Übungen
Vervollständigen Sie das Programm: Der Bubblesort aus Lektion 6 soll das Feld [5, 2, 4, 1] aufsteigend sortieren. Die äußere Schleife ist schon übersetzt. Ergänze an den Stellen (1), (2) und (3) die innere Schleife, den Vergleich und den Tausch, und ersetze dabei das pass. Denk an die Indexverschiebung: Die innere Schleife läuft im Struktogramm „für i = 1 bis n − durchlauf“, in Python also von 0 bis n − durchlauf − 1. Erwartete Ausgabe: [1, 2, 4, 5].
Tab rückt ein. Esc, dann Tab verlässt den Editor. Strg + Enter führt aus.
Python wird einmalig im Browser geladen (ein paar Sekunden). Danach laufen alle Übungen sofort.
Musterlösung anzeigen
zahlen = [5, 2, 4, 1]
n = len(zahlen)
for durchlauf in range(1, n):
for i in range(0, n - durchlauf):
if zahlen[i] > zahlen[i + 1]:
hilf = zahlen[i]
zahlen[i] = zahlen[i + 1]
zahlen[i + 1] = hilf
print(zahlen)range(0, n - durchlauf) liefert die Werte 0 bis n − durchlauf − 1, im ersten Durchlauf bei n = 4 also 0, 1, 2: drei Vergleiche, genau wie in der Tabelle aus Lektion 6. Wer range(0, n - durchlauf + 1) schreibt, greift mit zahlen[i + 1] hinter das Feldende und bekommt einen Fehler „list index out of range“. Das ist derselbe Fehler, den in Lektion 6 die Grenze n statt n − 1 verursacht hätte, nur dass Python ihn sofort meldet.
Zeichnen Sie das Struktogramm zu folgendem Programm und ermitteln Sie mit einem Schreibtischtest die Ausgabe. Achte darauf, welche Zeilen im Rumpf der Schleife stehen und welche im Zweig der Verzweigung.
guthaben = 50
preis = 12
anzahl = 0
while guthaben >= preis:
guthaben = guthaben - preis
anzahl = anzahl + 1
if anzahl == 3:
preis = 10
print(anzahl, guthaben)Musterlösung anzeigen
while wird zur kopfgesteuerten Schleife, if ohne else zur einseitigen Verzweigung im Rumpf, print zur Ausgabe nach der Schleife. Der Schreibtischtest:
| Prüfung guthaben >= preis | guthaben | anzahl | preis |
|---|---|---|---|
| Start | 50 | 0 | 12 |
| 50 >= 12: ja | 38 | 1 | 12 |
| 38 >= 12: ja | 26 | 2 | 12 |
| 26 >= 12: ja; anzahl == 3: ja | 14 | 3 | 10 |
| 14 >= 10: ja | 4 | 4 | 10 |
| 4 >= 10: nein, Ende | 4 | 4 | 10 |
Ausgabe: 4 4, denn print trennt die beiden Werte durch ein Leerzeichen; im Struktogramm steht „Ausgabe anzahl, guthaben“, also „4, 4“. Beachte, dass sich ab dem dritten Kauf die Bedingung der Schleife ändert, weil der Preis sinkt; der vierte Kauf ist nur deshalb möglich.
So wird typischerweise bewertet
- Drei Initialisierungen vor der Schleife
- Kopfgesteuerte Schleife mit Bedingung guthaben >= preis
- Beide Zuweisungen im Rumpf, Verzweigung mit anzahl == 3 ebenfalls im Rumpf, einseitig
- Ausgabe beider Werte nach der Schleife
- Schreibtischtest mit Ausgabe 4 4 (Python) bzw. 4, 4 (Struktogramm); gleichwertig: Spalte für die Verzweigungsprüfung statt Notiz in der Prüfungsspalte
Jetzt selbst testen
Vier Fragen zur Übersetzung.
Welche Zählschleife entspricht „FÜR i = 3 BIS 8“ in Python?
Ein Struktogramm mit Indexbasis 1 gibt für ein Feld die Position pos = 4 des Maximums aus. Welchen Index hat dasselbe Element in der Python-Liste?
Was geben print(17 // 5) und print(17 % 5) in Python aus?
Wie wird „WIEDERHOLE … BIS eingabe > 0“ in Python übersetzt?