Logo des digitalen Schulbuchs inf-schule.de. Schriftzug in Zustandsübergangsdiagramm eines endlichen Automaten.

Beispiel - Simulation einer Ampel

Ampelzyklus

Bei einer Ampel werden zyklisch immer wieder die folgenden Ampelzustände durchlaufen.

Ampelzyklus

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.

Struktogramm

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')
X

Fehler melden

X

Suche