Schachtelung
Schachtelung von if/else-Statements
Da eine gewöhnliche Bedingung nur zwei Möglichkeiten bereithält, muss man an dieser Stelle mehrere Fallunterscheidungen schachteln
. Im Flussdiagramm erkennt man die Schachtelung durch die beiden Fallunterscheidungen. Auch hier machen wir erneuten Gebrauch von den (aus dem vorangegangenen Abschnitt Wiederverwendung) bekannten parametrisierten Methoden geradeausfahrt(dist)
und drehungX(li|re, grad)
, die zur besseren Übersicht im anschließenden Quellcode nicht mehr explizit definiert sind:
Mithilfe von zwei geschachtelten Fallunterscheidungen können wir drei Fälle unterscheiden: gelb
, blau
und weder noch
. Zur Vereinfachung wird die Farbe rot
vorerst dem letzteren Fall zugeordnet, was streng genommen nicht korrekt ist. Derzeit würde der Roboter auch z.B. bei einem grünen Marker oder einer fehlerhaften Messung geradeaus weiterfahren.
import lejos.nxt.Motor;
import lejos.nxt.NXTRegulatedMotor;
import lejos.nxt.ColorSensor;
import lejos.nxt.SensorPort;
import lejos.robotics.Color;
public class Schachtelung
{
static ColorSensor cs = new ColorSensor(SensorPort.S2);
static NXTRegulatedMotor reMo = Motor.A;
static NXTRegulatedMotor liMo = Motor.B;
static int distanz360 = 2000; //zu kalibrieren
public static void main (String args[])
{
int speed = 900;
liMo.setSpeed(speed);
reMo.setSpeed(speed);
int dist = 500;
geradeausfahrt(dist); //Wiederverwendung
//Farbwert messen
int c = cs.getColorID();
if(c== Color.YELLOW)
{
//Wiederverwendung: Linksdrehung 90 Grad
drehungX(false, 90);
}
//Schachtelung
else if(c== Color.BLUE)
{
//Wiederverwendung: Rechtsdrehung 90 Grad
drehungX(true, 90);
}
//sonstige Farbe
else
{
//keine Anweisung!
}
//nach der geschachtelten Bedingung: fuer alle Faelle;
geradeausfahrt(dist);
}
...
}
Das letzte else-Statement des obigen Programmauszugs ist unnötig, soll allerdings demonstrieren, dass man im Falle einer dritten Farbe eine differenzierte individuelle Anweisung platzieren könnte. Im Unterschied dazu wird die letzte Anweisung geradeausfahrt(dist);
unabhängig von der geschachtelten Bedingung fü alle möglichen Fälle ausgeführt. Nachfolgend findet man ausführbar das lauffähige, .
import lejos.nxt.Motor;
import lejos.nxt.NXTRegulatedMotor;
import lejos.nxt.ColorSensor;
import lejos.nxt.SensorPort;
import lejos.robotics.Color;
public class Schachtelung
{
static ColorSensor cs = new ColorSensor(SensorPort.S2);
static NXTRegulatedMotor reMo = Motor.A;
static NXTRegulatedMotor liMo = Motor.B;
static int distanz360 = 2000; //zu kalibrieren
public static void main (String args[])
{
int speed = 900;
liMo.setSpeed(speed);
reMo.setSpeed(speed);
int dist = 500;
geradeausfahrt(dist); //Wiederverwendung
//Farbwert messen
int c = cs.getColorID();
if(c== Color.YELLOW)
{
//Wiederverwendung: Linksdrehung 90 Grad
drehungX(false, 90);
}
//Schachtelung
else if(c== Color.BLUE)
{
//Wiederverwendung: Rechtsdrehung 90 Grad
drehungX(true, 90);
}
//sonstige Farbe
else
{
//keine Anweisung!
}
//nach der geschachtelten Bedingung: fuer alle Faelle;
geradeausfahrt(dist);
}
public static void geradeausfahrt(int dist)
{
reMo.rotate(dist,true);
liMo.rotate(dist);
}
public static void drehungX(boolean rechtsrum, int grad)
{
//berechne die fuer die Gradzahl notwendige Distanz
int distanzX = (grad * distanz360) / 360;
if(rechtsrum) //Rechtsdrehung
{
liMo.rotate(distanzX,true);
reMo.rotate(-distanzX);
}
else //Linksdrehung
{
liMo.rotate(-distanzX,true);
reMo.rotate(distanzX);
}
}
}
Quellen
- [1]: Geschachtelte Fallunterscheidungen im Flussdiagramm - Urheber: mks - Lizenz: Inf-Schule.de