Python Online
Home     .
wiederholung

3. BEFEHLE WIEDERHOLEN, FUNKTIONEN

 

 

DU LERNST HIER...

 

wie ein Roboter bestimmte Befehlssequenzen wiederholen kann und wie du mit benannten Programmblöcken (Funktionen) deine Programme besser strukturieren kannst.

 

 

MUSTERBEISPIELE

 


Beispiel 1: Quadrat fahren
Um ein Quadrat zu fahren, muss der Roboter vier Mal eine Strecke vorwärts fahren und um 90° drehen. Für die sich wiederholende Bewegung verwendest du eine repeat-Schleife. Diese wird mit repeat eingeleitet gefolgt von Anzahl Wiederholungen und einem Doppelpunkt. Die Befehle, die wiederholt werden sollen, müssen eingerückt sein.

 

Programm:

from grobot import *
            
repeat 4: 
    forward()
    delay(2000)
    left()
    delay(550)
stop()
► In Zwischenablage kopieren

Führe das Programm zuerst im Simulationsmodus aus. Im Realmodus musst du eventuell die Zeit beim Linksdrehen anpassen.

Im Unterschied zur Simulation, bei der der Roboter ein Quadrat ganz exakt abfahren kann, ist es beim realen Roboter schwierig, exakt geradeaus zu fahren und exakt in einem rechten Winkel abzubiegen. Dies entspricht der Wirklichkeit, denn kein Auto wird bei starrer Radstellung, d.h. blockierter Steuerung, je exakt geradeaus fahren, man muss immer wieder regulierend eingreifen. Deswegen sind Roboter mit Sensoren ausgerüstet, die ihnen helfen, diese Ungenauigkeiten zu korrigieren. Verwende also nicht zu viel Zeit, um dem Roboter ein exaktes Quadrat fahren beizubringen.


 

Beispiel 2: Befehle beliebig oft wiederholen
In vielen Situationen führt ein Roboter gewisse Tätigkeiten "endlos" aus, bzw. solange bis er abgeschaltet oder das Programm abgebrochen wird. Zum Beispiel, wenn er ständig Sensordaten zurückmelden muss. Dafür verwendet man eine repeat-Schleife ohne Anzahl Wiederholungen.

In deinem Beispiel besucht der Roboter endlos vier Orte, die auf Wegen liegen, die rechtwinklig zu einander stehen und fährt jeweils wieder rückwärts zum Ausgangspunkt.

 

Programm:

from grobot import *
            
repeat: 
    forward()
    delay(2000)
    backward()
    delay(2000)
    left()
    delay(550)
► In Zwischenablage kopieren

Hier ist es nützlich zu wissen, wie man ein laufendes Programm abbrechen kann: Am einfachsten geht es mit Schliessen des Terminalfensters. Du kannst ein Programm auch durch gleichzeitiges Drücken von ENTER und DOWN auf dem EV3-Brick abbrechen. Dabei wird aber auch das BrickGate-Programm beendet und muss erneut mit dem ENTER-Button gestartet werden.


 

Beispiel 3: Programme mit eigenen Funktionen strukturieren
Mit benannten Programmblöcken, in Python Funktionen genannt, kannst du deine Programme besser strukturieren. Es ist eine wichtige Programmiertechnik, denn komplexere Programme können mit Hilfe von Funktionen in kleinere, leichtprogrammierbare Teilprogramme zerlegt werden. Mit Vorteil werden Funktionen auch eingesetzt, wenn ein Programmblock mehrmals verwendet wird.

Eine Funktionsdefinition beginnt immer mit dem Schlüsselwort def, darauf folgen ein Funktionsname, eine Parameterklammer und ein Doppelpunkt. Die Anweisungen im Funktionskörper sind eingerückt. Im Hauptprogramm wird die Funktion aufgerufen.

In deinem Beispiel definierst du eine Funktion blink(), die das einmalige aufleuchten der roten LED bewirkt. Im Hauptprogramm macht der Roboter eine ähnlich Bewegung wie im vorhergehenden Beispiel. Bevor er rückwärtsfährt hält er an, Blinkt zweimal und fährt rückwärts zum Ausgangspunkt.

Programm:

from grobot import *

def blink():
    setLED(1)
    delay(500)
    setLED(0)
    delay(500)

repeat 4:
    forward()
    delay(2000)
    stop()
    blink()
    blink()
    backward()
    delay(2000)
    left(550)
► In Zwischenablage kopieren
 






 

MERKE DIR...

 

Um ein Programmblock n mal zu wiederholen, verwendest du eine repeat-Schleife:
 repeat n:
     Anweisungen

Um ein Programmblock endlos zu wiederholen, verwendest du eine  Endlos-Schleife:
 repeat:
     Anweisungen

Die eingerückten Zeilen werden so lange wiederholt, bis du das Programm mit Drücken der Button Enter + Down auf dem EV3 Brick abbrichst. Danach musst du das BrickGate-Programm mit Klick auf Enter neu starten.

Mit Funktionen kannst du deine Programme besser strukturieren und Code-Duplikation vermeiden. Du musst zwischen der Funktionsdefinition und Funktionsaufruf unterscheiden.

Definition:

Aufruf:
def name():
     Anweisungen
name()

 

 

ZUM SELBST LÖSEN

 

 

1.
Der Roboter startet in der Mitte, fährt eine kurze Strecke vorwärts und dann rückwärts zurück zum Ausgangspunkt. Dann dreht er etwa um 120° nach rechts. Diese Befehlssequenz wiederholt er drei Mal.  


2.
Der Roboter soll "endlos" zuerst einen Kreis auf dem Linksbogen und dann einen Kreis auf dem Rechtsbogen fahren.  


3.
Definiere eine Funktion step(), mit der dein Roboter ein Tritt abfährt. Rufe die Funktion dann dreimal auf, so dass der Roboter die nebenstehende Figur abfährt. Löse die Aufgabe zuerst im Simulationsmodus.  

 

 

ZUSATZSTOFF: WHILE-SCHLEIFE

 

Anstelle der repeat-Schleife kannst du eine while-Schleife verwenden, um Programmblöcke zu wiederholen. Die while-Struktur kommt praktisch in alle Programmiersprachen vor und kann für jede Art von Wiederholung verwendet werden. Sie ist aber etwas komplizierter als repeat, da sie Variablen benötigt. Die while-Schleife wird insbesondere dann mit Vorteil verwendet, wenn die Anzahl der Wiederholungen nicht bekannt ist. Die Wiederholung ist durch eine Bedingung festgelegt.

 
Beispiel 4: Ein Programmblock mit while wiederholen
Der EV3 fährt zuerst 500 ms vorwärts und dreht ca. 90° links, dann fährt er 400 ms länger und dreht wieder rechtwinklig. Diesen Vorgang wiederholt er solange t kleiner als 5000 ist.
 

Programm:

from grobot import *
            
t = 500
while t < 5000: 
    forward()
    delay(t)
    left()
    delay(550)
    t = t + 400
stop() 
► In Zwischenablage kopieren

Die Variable t zu Beginn t = 500 (Startwert). Nach jedem Schleifendurchgang wird t um 400 vergrössert (Wertänderung).

Beispiel 5: Wiederholung mit ESCAPE-Button beenden
Anstelle einer Endlosschleife repeat verwendest du im Beispiel 2 eine while-Schleife mit einer Abbruchbedingung. So lange der Button ESCAPE nicht gedrückt wurde, läuft das Programm. So kannst du das Programme eleganter mit ESCAPE-Button abbrechen, ohne das ganze System (inkl. BrickGate) zu beenden.

Programm:

from grobot import *
            
while not button_escape.was_pressed():
    forward()
    delay(2000)
    backward()
    delay(2000)
    left()
    delay(550)
stop() 
► In Zwischenablage kopieren

 

 

ZUM SELBST LÖSEN

 

 

4.
Fahre ein Quadrat mit einer while-Schleife.

5.
Der Roboter soll so lange auf einem Linksbogen mit dem Radius 0.2 fahren, bis der Button ESCAPE gerückt wird.