Beispiel - Simulation einer Ampel
Ampelzyklus
Bei einer Ampel werden zyklisch immer wieder die folgenden Ampelzustände durchlaufen.
Ziel ist es, ein Programm zu entwickeln, mit dem man das Verhalten einer Ampel simulieren kann.
Ablaufmodell
Zur Simulation einer Ampel wurde das folgende Ablaufmodell erstellt. Hier gibt der Benutzer die Anzahl der Ampeltakte vor. In jedem Ampeltakt soll die Ampel in den nächsten Ampelzustand gehen. Nach dem Durchlaufen aller Takte soll abschließend der erreichte Ampelzustand ausgegeben werden.
Aufgabe 1
Welche Ausgabe soll das dargestellte Verfahren erzeugen, wenn der Benutzer die Zahl 2 (bzw. 4 bzw. 27) eingibt?
Implementierung
Hier eine Implementierung zum gezeigten Struktogramm:
# Eingabe
anzahlTakte = int(input('Anzahl der Takte: '))
# Verarbeitung
zustand = 'rot'
zaehlerTakte = 0
while zaehlerTakte < anzahlTakte:
if zustand == 'rot':
zustand = 'rot-gelb'
if zustand == 'rot-gelb':
zustand = 'gruen'
if zustand == 'gruen':
zustand = 'gelb'
if zustand == 'gelb':
zustand = 'rot'
zaehlerTakte = zaehlerTakte + 1
# Ausgabe
if zustand == 'rot':
print('an-aus-aus')
if zustand == 'rot-gelb':
print('an-an-aus')
if zustand == 'gruen':
print('aus-aus-an')
if zustand == 'gelb':
print('aus-an-aus')
Wenn man das Programm ausführt, dann ergeben sich merkwürdige Ergebnisse:
>>>
Anzahl der Takte: 5
an-aus-aus
Aufgabe 2
Teste selbst das Programm mit verschiedenen Eingabewerten. Stimmen die Ergebnisse immer mit deinen Erwartungen überein?
Fehlersuche
Das Programm liefert bei jeder Eingabe dieselbe Ausgabe. Irgend etwas stimmt hier nicht. Python liefert erst einmal keine Hinweise, wo sich der Fehler befinden könnte.
In solchen Fällen hat es sich bewährt, in das Programm zusätzliche Ausgabeanweisungen einzubauen, so dass man die Werte der Variablen während der Verarbeitungsschritte mitverfolgen kann.
Aufgabe 3
Füge (so wie unten gezeigt) im Programm zusätzliche Ausgabeanweisungen ein. Mit genügend Ausgabeanweisungen kannst du dir ein genaueres Bild vom tatsächlichen Ablauf machen. Dann sollte dir auch klar werden, was hier die fehlerhaften Ausgaben verursacht. Korrigiere den Fehler und teste das Programm erneut.
# Eingabe
anzahlTakte = int(input('Anzahl der Takte: '))
# Verarbeitung
zustand = 'rot'
print(zustand)
zaehlerTakte = 0
while zaehlerTakte < anzahlTakte:
if zustand == 'rot':
zustand = 'rot-gelb'
if zustand == 'rot-gelb':
zustand = 'gruen'
if zustand == 'gruen':
zustand = 'gelb'
if zustand == 'gelb':
zustand = 'rot'
print(zustand)
zaehlerTakte = zaehlerTakte + 1
# Ausgabe
if zustand == 'rot':
print('an-aus-aus')
if zustand == 'rot-gelb':
print('an-an-aus')
if zustand == 'gruen':
print('aus-aus-an')
if zustand == 'gelb':
print('aus-an-aus')