Flexibilität: Fallunterscheidung

"Ja" oder "Nein", das ist hier die Frage

Bislang sind unsere Programme eine Hintereinanderausführung von Anweisungen / Befehlen / "Aussagen mit Ausrufezeichen", das Markenzeichen der imperativen Programmiersprachen. Nun wollen wir in dem Programm Fragen stellen, und zwar genau solche, die man mit Ja oder Nein beantworten können muss.

Hindernis im Weg?

Fallunterscheidung: Hindernis im Weg?[1]

Angenommen der Roboter fährt ein Stück geradeaus. Dann kann es vorkommen, dass die Weiterfahrt nicht möglich ist, weil z.B. eine Kiste im Weg steht (Abbildung 1). Man stellt das fest, indem man eine entsprechende Bedingung formuliert, z.B.:

"Ist der gemessene Abstand des Ultraschallsensors < 10cm?"

In diesem Fall soll der Roboter wieder zurückfahren. Mit dieser textuellen Beschreibung des Problems fertigen wir zunächst ein Flussdiagramm an. Dabei machen wir erneuten Gebrauch von der (aus dem vorangegangenen Abschnitt Wiederverwendung) bekannten parametrisierten Methode geradeausfahrt(dist) :

Flussdiagramm: Fallunterscheidung[2]

Eine berechtigte Frage ist an dieser Stelle: "Wieso lässt man den Roboter ein 'Stück' fahren und startet nicht einfach die Motoren?" Antwort: Dann müsste man nicht zu einem (Zeit)-Punkt im Programm den Abstand messen, sondern mehrfach, wozu man eine Schleife benötigt. Somit verschieben wir diesen Gedanken vorerst, bis wir zu den Schleifen kommen.
In der zum Flussdiagramm gehöhrigen Implementierung ist die Fallunterscheidung durch ein if/else-Statement abgebildet:

import lejos.nxt.Motor;
import lejos.nxt.NXTRegulatedMotor;
import lejos.nxt.SensorPort;
import lejos.nxt.UltrasonicSensor;

public class Hindernis 
{
  static UltrasonicSensor ultra =  new UltrasonicSensor(SensorPort.S1);  
  static NXTRegulatedMotor reMo = Motor.A;
  static NXTRegulatedMotor liMo = Motor.B;
  
  public static void main(String[] args) 
  {		
    int speed = 900;
    int x = 1500;			
    reMo.setSpeed(speed);
    liMo.setSpeed(speed);			
    reMo.rotate(x,true);
    liMo.rotate(x);		
    //miss Abstand
    int abstand = ultra.getDistance();
    if(abstand < 10)
    {	  
      reMo.rotate(-x,true);
      liMo.rotate(-x);
    }
    else
    {	  
      reMo.rotate(x,true);
      liMo.rotate(x);
    }
  }	
}

Aufgaben - Modifiziere die Bedingungen

  1. Verändere die Bedingung, z.B. den Schwellenwert von 10cm.
  2. Verändere die Befehle, die an die Bedingung geknüpft sind. Wenn die Bedingung erfüllt ist, soll der Roboter z.B. stehen bleiben, statt zurückzufahren.

Quellen

X

Fehler melden

X

Suche