Lektion 7 von 8

Pseudocode und Python

Zusatzlektion: Für die Prüfung brauchst du kein Python. Aber wer ein Struktogramm in ein paar Zeilen Code übersetzt und laufen lässt, sieht sofort, ob die Logik stimmt. Das ist die schnellste Art, die eigenen Lösungen aus den Lektionen 1 bis 6 zu prüfen, und du lernst nebenbei, was die Kurzschreibweisen bedeuten.

  • Etwa 20 Minuten
  • 1 Programmieraufgabe, 1 Zeichenaufgabe, 4 Quizfragen
  • Papier und Stift genügen

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 / PseudocodePythonHinweis
WENN … DANN / SONST / ENDE WENNif …: / elif …: / else:Kein ENDE, der Block endet, wo die Einrückung endet. Eine Verzweigungskette wird zu if, elif, else.
SOLANGE … / ENDE SOLANGEwhile …:Kopfgesteuert, genau wie im Struktogramm.
FÜR i = 1 BIS nfor 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 bedingungwhile True: mit if bedingung: break am EndePython hat keine fußgesteuerte Schleife. Alternative: Bedingung umkehren und als while schreiben, mit einer ersten Eingabe vor der Schleife.
FALLS x / FALL 1: / SONSTif x == 1: / elif x == 2: / else:Die Mehrfachauswahl wird zur Verzweigungskette.
DIV//Ganzzahlige Division. Das einfache / liefert Nachkommastellen.
MOD%Rest der Division.
UND / ODER / NICHTand / or / notKlein geschrieben, sonst gleich.
Feld zahlen[i], erstes Element Index 1Liste zahlen[i], erstes Element Index 0Anzahl mit len(zahlen). Letztes Element ist zahlen[n - 1].
FUNKTION name(a, b): Typ / RÜCKGABE xdef name(a, b): / return xOhne Datentypen. Eine Prozedur ist ein def ohne return.
EINGABE nn = int(input())input() liefert Text; int() macht eine Ganzzahl daraus, float() eine Kommazahl. Im Browser öffnet sich dafür ein kleines Fenster.
AUSGABE x, yprint(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

Summe von 1 bis n
Eingabe n
summe = 0
für i = 1 bis n
summe = summe + i
Ausgabe summe

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.

summe.py

Tab rückt ein. Esc, dann Tab verlässt den Editor. Strg + Enter führt aus.

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)

Maximum mit Index
max = zahlen[1]
pos = 1
für i = 2 bis n
zahlen[i] > maxjanein
max = zahlen[i]
pos = i
Ausgabe max, pos

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 Struktogramm

Die 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.

ElementStruktogramm iPython izahlen[i]
erstes104
zweites219
drittes322
viertes437
Die Indexverschiebung: dasselbe Element, um eins verschobener Index. Schleife im Struktogramm 2 bis n, in Python range(1, n).
maximum.py

Tab rückt ein. Esc, dann Tab verlässt den Editor. Strg + Enter führt aus.

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:

Halbieren zählen
n = 20
schritte = 0
solange n > 1
n = n DIV 2
schritte = schritte + 1
Ausgabe schritte
Das Struktogramm zum Python-Code. Ausgabe für n = 20: die Folge 20, 10, 5, 2, 1 braucht 4 Halbierungen, also 4. Mit dem einfachen / wären es 5 (Leseaufgabe 3.1).

Übungen

Programmieraufgabe 7.1

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].

bubblesort.py

Tab rückt ein. Esc, dann Tab verlässt den Editor. Strg + Enter führt aus.

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.

Zeichenaufgabe 7.2

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
Kaufen bis das Guthaben nicht mehr reicht
guthaben = 50
preis = 12
anzahl = 0
solange guthaben >= preis
guthaben = guthaben - preis
anzahl = anzahl + 1
anzahl == 3janein
preis = 10
Ausgabe anzahl, guthaben

while wird zur kopfgesteuerten Schleife, if ohne else zur einseitigen Verzweigung im Rumpf, print zur Ausgabe nach der Schleife. Der Schreibtischtest:

Prüfung guthaben >= preisguthabenanzahlpreis
Start50012
50 >= 12: ja38112
38 >= 12: ja26212
26 >= 12: ja; anzahl == 3: ja14310
14 >= 10: ja4410
4 >= 10: nein, Ende4410

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.

1 / 4

Welche Zählschleife entspricht „FÜR i = 3 BIS 8“ in Python?

2 / 4

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?

3 / 4

Was geben print(17 // 5) und print(17 % 5) in Python aus?

4 / 4

Wie wird „WIEDERHOLE … BIS eingabe > 0“ in Python übersetzt?