Class Bertl added
Dependencies: HCSR
Dependents: BERTL_ButtonLeds Bertl_Arbeit FollowLine SerialPC ... more
Fork of ur_Bertl by
Wiederholungsanweisungen
Die Wiederholanweisungen ergänzt die Diskussion über die Anweisungen die im Roboter-Programmiersprache Wortschatz vorhanden sind (siehe ...). Die neuen Anweisungen sind
- FOR
- WHILE Beide Anweisungen wiederholen die Ausführung von Befehlen, die ein Roboter versteht, wobei auch verschachtelte FOR und WHILE Schleifen vorkommen können. Diese Zusätze verbessern die Prägnanz und Kraft der Roboter-Programmiersprache. Wie üblich werden die Beispiele einen einzigen Roboter, der meist mit dem Namen Karel hat, verwenden.
Abb. WhileBeeper Der Roboter steht auf Position (3,2), schaut Richtung Osten und soll sich zum Beeper bewegen und ihn aufheben, was der folgende Code erledigt:
if ( !NextToABeeper()) Move; if ( !NextToABeeper()) Move(); if ( !NextToABeeper()) move(); pickBeeper();
Was passiert aber, wenn der Roboter an der Stelle (1, 2) steht?
Oder (5,2)
Oder ...
In nahezu jedem Programm gibt es Sequenzen, die es notwendig machen mehrere Befehle, z.T. auch gleiche Befehle, hinereinander auszuführen. Bisher haben wir die notwendige Anzahl Befehle geschrieben. Die Befehle
- WHILE und
- FOR erweitern noch einmal den Wortschatz des Roboters für wiederholte Ausführung von Befehlen oder Befehlsblöcken.
WHILE-Schleife Bei der WHILE-Schleife ist die Anzahl der Durchläufe bei Schleifenbeginn noch nicht bekannt. Allerdings ist daher die Abbruchbedingung sehr wichtig und sollte sehr genau auf die Korrektheit überprüft werden. Für die Abbruchbedingung stehen wieder die Befehle von der ur_Bertl Klasse zur Verfügung:
Syntax:
while( Abbruchbedingung ) { Anweisungen; }
Die geschweiften Klammern {} können wieder entfallen, wenn nur eine Anweisung im Schleifenkörper ausgeführt werden soll.
Abbruchbedingung
Bei der Schleife wird eine Abbruchbedingung geprüft, mit der entschieden wird, ob der Schleifenkörper (Schleifeninhalt) ausgeführt wird. Da im Gegensatz zu den Auswahlbefehlen eine fehlerhafte Abbruchbedingung zu einer Endlosschleife führen könnte, ist auf die Erzeugung gültiger Abbruchbedingungen besonderes Augenmerk zu legen. Die nachfolgenden 5 Schritte sollen dazu beitragen und sind Ihnen wärmstens ans Herz gelegt:
- Zielbedingung formulieren
- Zielbedingung invertieren
- Abbruchbedingung muss sich dem Ziel nähern
- Vor der Schleife: Variablen der Abbruchbedingung Initialisieren
- Nach der Schleife: ev. Variablen zurücksetzen
Z.B. soll der Roboter sich solange weiter bewegen bis er auf einen Beeper trifft.
- Zielbedingung formulieren: Der Roboter soll wann stehen bleiben? Wenn er auf einem Beeper steht: NextToABeeper()
- Zielbedingung invertieren: sollange er NICHT auf einem Beeper steht soll der Schleifenkörper ausgeführt werden: !NextToABeeper()
- Abbruchbedingung muss sich dem Ziel nähern: Im Schleifenkörper muss es Befehle geben sodass die Bedingung die Schleife abbricht: Move();
- Vor der Schleife: Variablen der Abbruchbedingung Initialisieren: Hier muss der Roboter korrekt in die Welt gesetzt werden.
- Nach der Schleife: eventuell Variablen zurücksetzen: Hier nichts zu tun, kann entfallen.
void WhileBertl :: GoToBeeper() { while( !NextToABeeper() ) { Move(); } }
Aufgabe: Formulieren Sie die Schritte 1 bis 3 für folgenden Befehl: GoToWall(), wobei der Roboter solange sich bewegen soll bis er vor einer Wand steht.
FOR-Schleifen (Zählschleifen)
Der Unterschied zur WHILE-Schleife liegt darin, daß die Anzahl der Durchläufe bei Schleifenbeginn bekannt ist.
Die FOR-Schleife gibt die Möglichkeit, dass der Roboter einen Befehl eine bestimmte Anzahl, die im vorhinein bekannt ist, oft ausführt.
Syntax:
for (Laufvariable initiallisieren; Abbruchbedingung; Laufvariablen erhöhen) { Anweisungen; }
Die im Rumpf der FOR Schleife enthaltenen Anweisungen werden solange ausgeführt, bis die Auswertung der "Abbruchbedingung" false ergibt. Im Kopf der FOR Schleife wird zuerst eine Laufvariable mit einen Startvalue initialisiert. Als nächstes wird eine Abbruchbedingung für den Durchlauf der Schleife erwartet. Im letzten Teil des Kopfes muss noch die Erhöhung bzw. die Verkleinerung der Laufvariablen definiert werden.
Im nachfolgenden Beispiel ist "i" die Laufvariable, i<3 ist die Abbruchbedingung für den Durchlauf und "i++" steht für die Erhöhung der Laufvariablen. Beachten Sie das die Erhöhung bzw. Verkleinerung der Startvariablen in endlich vielen Schritten die Schranke der Laufbedingung durchbrechen muss, da es sich ansonsten um eine Endlosschleife handelt.
<code>>
for(int i=0; i < 3; i++)
{
TurnLeft();
}
<</code>>
- Zielbedingung formulieren (z.B. wenn i>=3 dann fertig)
- Zielbedingung invertieren (solange i<3); Ev. De Morgan-Regeln anwenden
- Abbruchbedingung muss sich dem Ziel nähern (i++;)
- Vor der Schleife: Variablen der Abbruchbedingung Initialisieren(i=0;)
- Nach der Schleife: ev. Variablen zurücksetzen(i=0;)
Wie oft wird diese Schleife durchlaufen? Was kann damit gemacht werden?