3. Programmablaufsteuerung
Es war eine herausragende Leistung des Software-Engineeings, das in den 1960er Jahren herausfand, dass drei Kontrollstrukturen grundlegend für die Ablaufsteuerung von Computerprogrammen sind.[1]
- Sequenz (Aufeinanderfolge)
- Selektion (Auswahl)
- Zyklus (Wiederholung)
Aufgrund dieser Erkenntnis fand das damals gängige Programmieren mit der Sprunganweisung »goto« nach und nach ein Ende. Es fand auch deshalb ein Ende, weil insbesondere das willkürliche Springen dazu führte, dass meist einzig der Programmierer seine Programmcodes lesen und verstehen konnte. Dadurch war es so gut wie unmöglich, dass nachfolgende Programmierer die Programme ändern oder erweitern konnten. Oftmals mussten die Programme neu implementieren werden.
Programm »primzahl.py«
Als ein Beispiel kann das Programm »primzahl.py« dienen. Das Besondere am Programm ist, dass es die drei Kontrollstrukturen Sequenz, Selektion und Zyklus enthält.
Das Programm prüft, ob eine eingegebene Ganzzahl größer 1 eine Primzahl ist oder nicht.
Eine Primzahl ist eine positive Ganzzahl, die nur durch 1 und sich selbst teilbar ist.
- Die Ganzzahl 1 ist keine Primzahl.
- Die Ganzzahl 2 ist die kleinste Primzahl.
import tkinter as tk
# Callback-Funktion
def pruefen():
try:
zahl=int(entry.get())
if zahl>1:
primzahl=True
i=2
while primzahl==True and i<=zahl//2:
if (zahl%i)==0:
primzahl=False
else:
i=i+1
if primzahl==True:
wort="eine"
else:
wort="keine"
label2.config(text=f"{zahl} ist {wort} Primzahl")
else:
label2.config(\
text="Die Ganzzahl ist nicht größer 1!")
except ValueError:
label2.config(\
text="Die Zeichenkette ist nicht umwandelbar!")
entry.delete(0, tk.END)
# grafische Benutzeroberfläche
root=tk.Tk()
root.title("Primzahl")
root.geometry("400x250")
root.resizable(False, False)
# Widgets
label1=tk.Label(root,\
text="Gib eine Ganzzahl größer 1 ein!")
entry=tk.Entry(root, width=5)
button1=tk.Button(root, text="Prüfen", command=pruefen)
label2=tk.Label(root, text="")
button2=tk.Button(root,\
text="Programm beenden",\
command=root.destroy)
label1.pack(pady=10)
entry.pack(pady=10)
button1.pack(pady=10)
label2.pack(pady=10)
button2.pack()
root.mainloop()
| 1. bis 50. Zeile | Eine Sequenz (Aufeinanderfolge) von Anweisungen. |
| 4. bis 26. Zeile | Die Callback-Funktion »pruefen« wird deklariert. |
| 6. Zeile | Die Variable »zahl« bekommt eine Ganzzahl zugewiesen. |
| 10. bis 19. Zeile | Ein Zyklus (Wiederholung) wird mit einer while-Schleife umgesetzt. |
| 10.. Zeile | Die Operation »//« ist das ganzzahlige Teilen (beispielsweise ergibt 5//2 gleich 2). |
| 11. bis 14. Zeile | Eine Selektion (Auswahl), die innerhalb des while-Körpers mit einer if-else-Anweisung umgesetzt ist. |
| 11. Zeile | Die Operation »%« ist der Rest beim ganzzahligen Teilen (beispielsweise ergint 5%2 gleich 1). |
| 15. bis 18. Zeile | Eine weitere Selektion (Auswahl) wird mit einer if-else-Anweisung umgesetzt. |
| 19. Zeile | Die Ausgabe erfolgt im Label-Widget in einem f-String. |
Zwei Abläufe des Programms
Das Programm ermiitelt, dass die eingegebene Ganzzahl 29 nicht durch 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 sowie 14 teilbar ist und gibt deshalb »29 ist eine Primzahl« aus.
Das Programm emittelt, dass die eingegebene Ganzzahl 35 zwar nicht durch 2, 3 sowie 4 ist, jedoch durch 5 teilbar und gibt deshalb »35 ist keine Primzahl« aus.
In den Abbildungen 1 und 2 sind die Ausgaben der beiden Abläufe des Programms dargestellt.
Aufgabe A12
Implementiere das Programm »primzahl.py« am Computer.
Führe das Programm mehrfach mit verschiedenen Ganzzahlen aus und teste, ob es fehlerfrei läuft und den gestellten Anforderungen entspricht.
Um das Programm »primzahl.py« zu verstehen, werden nachfolgend auf Seite 3.1, Seite 3.2 und Seite 3.3 die Kontrollstrukturen Sequenz, Selektion und Zyklus erklärt und an Beispielen erläutert.
- [1] Mit der Einführung der Kontrollstukturen in den 1960er Jahren nahm das strukturierte Programmieren seinen Anfang.