Zum Hauptinhalt springen
Grundlagen der Programmierung!

1.2 Lineare Programmabläufe

Sequenz

Kontrollstrukturen steuern den Ablauf eines Programms. Eine grundlegende Kontrollstruktur ist die Sequenz. Sie beschreibt einen linearen Programmablauf, bei dem die einzelnen Anweisungen in einer festgelegten Reihenfolge ausgeführt werden.

Aufgabe 1-1: Szenario – „Erste Schritte“

Ziel dieses Szenarios ist es, einen gelben Roboter auf dem Feld mit den Koordinaten (1; 2) des Spielbretts 1 zu platzieren und ihn mit einer Geschwindigkeit von 2 zum Zielfeld (3; 3) zu bewegen.

Spielbrett 1

Ausgewählte Attribute und Methoden der Klasse Robot

Algorithmus

Ein Algorithmus beschreibt exakt, wie ein bestimmtes Problem gelöst werden kann (vereinfachte Definition).

Dies muss nicht zwingend in einer Programmiersprache erfolgen. Es kann sogar vorteilhaft sein, einen Lösungsweg zunächst unabhängig von den formalen Regeln einer Programmiersprache zu formulieren. Auf diese Weise kann sich der Programmierer ganz auf die eigentliche Problemlösung konzentrieren. Ist der Lösungsweg festgelegt, ist die eigentliche Problemlösung bereits erfolgt. Der Algorithmus muss dann nur noch in einer geeigneten Programmiersprache als Programm umgesetzt werden.

Struktogramm

Struktogramme stellen eine Möglichkeit dar, Algorithmen unabhängig von einer Programmiersprache zu beschreiben.

Ein Struktogramm ist eine grafische Darstellung eines Algorithmus. Dabei werden die einzelnen Anweisungen und Kontrollstrukturen durch verschiedene grafische Elemente dargestellt.

Jede Anweisung wird in einem Rechteck notiert. Bei einer Sequenz werden die Rechtecke der aufeinanderfolgenden Anweisungen untereinander angeordnet. Die Anweisungen werden von oben nach unten ausgeführt.

Auch der Algorithmus zur Lösung des Szenarios in Aufgabe 1-1 lässt sich als Struktogramm darstellen:

Aufgabe 1-1: Algorithmus dargestellt als Struktogramm – links in allgemein verständlicher Form, rechts angelehnt an die Java-Syntax

Übungsaufgaben

Aufgabe 1-2: Szenario – „Steine auf- und abladen“

Ziel dieses Szenarios ist es, dass ein blauer Roboter von Feld (1; 2) startend mit einer Geschwindigkeit von 3 das Zielfeld erreicht. Löcher können dabei mit zuvor aufgeladenen Steinen aufgefüllt und an­schließend passiert werden.

Spielbrett 2

Ausgewählte Attribute und Methoden der Klasse Robot

Hinweise zum Aufladen von Steinen

  • Befindet sich auf dem Feld direkt vor dem Roboter ein Steinhaufen, kann mit load() eine Einheit Steine aufgeladen werden. Bei jedem weiteren Aufladen erhöht sich die Anzahl der geladenen Steine um eine Einheit. Der Roboter kann maximal fünf Einheiten Steine tragen.
  • Beim Aufladen von Steinen wird der Steinhaufen jeweils um eine Einheit kleiner und verschwindet, wenn die letzte Einheit Steine aufgeladen wurde.

Hinweise zum Abladen von Steinen

  • Mit unload() kann der Roboter eine Einheit der geladenen Steine auf dem Feld direkt vor ihm abladen. Voraussetzung ist, dass das Feld Steine aufnehmen kann. Dies ist zum Beispiel bei einem Wegfeld möglich.
  • Durch das Abladen von Stein auf einem bisher leeren Feld entsteht dort ein Steinhaufen mit einer Einheit Steine. Die Anzahl der geladenen Steine reduziert sich entsprechend.
  • Wird eine Einheit Stein auf einen bestehenden Steinhaufen abgeladen, erhöht sich dessen Größe entsprechend.
  • Werden Steine in ein Erdloch gekippt, reduziert sich dessen Tiefe um eine Einheit. Ist das Erdloch komplett aufgefüllt, verschwindet es und ein Wegfeld erscheint.

Aufgabe 1-3: Szenario – „Sensoreinsatz“

Ein Roboter besitzt drei Sensoren. Einer ist nach vorne, einer nach links und einer nach rechts gerichtet. Jeder Sensor kann das Feld analysieren, das direkt vor ihm liegt.

Ziel dieses Szenarios ist es, den Einsatz der Sensoren zu testen. Dazu wird ein roter Roboter auf das Startfeld (2; 2) gesetzt. Der Roboter soll sich nicht bewegen, sondern lediglich mit Hilfe seiner Sensoren prüfen, ob das Feld direkt vor dem jeweiligen Sensor frei ist und somit grundsätzlich vom Roboter überquert werden könnte. Nach jedem Sensoreinsatz soll der Roboter das Ergebnis der Analyse melden. Die Meldung soll aus dem Text „Ist das Feld voraus frei?“ bestehen, an den die Antwort der eingesetzten Sensormethode angefügt wird.

Spielbrett 3

Teilaufgaben

  1. Lesen Sie den Abschnitt Hinweise zum Einsatz der Sensoren. Erstellen Sie dann eine Anweisung, die auf den Frontsensor des Robot-Objekts robi zugreift und dessen Methode isFieldAheadFree() aufruft.
    Testen Sie Ihren Programmcode. Die aufgerufene Methode gibt zwar eine Antwort zurück, der Programmcode nutzt diese aktuell jedoch nicht. Im nächsten Schritt soll die Antwort nun im Statusbereich angezeigt werden.
  2. Lesen Sie den Abschnitt Hinweise zur Ausgabe der Meldungen. Erstellen Sie anschließend eine Anweisung, die das Robot-Objekt robi auffordert, den String Ist das Feld voraus frei? im Statusbereich auszugeben.
    Testen Sie Ihren Programmcode. Im nächsten Schritt soll an diesen Text die Antwort der unter 1. aufgerufenen Methode angefügt werden.
  3. Lesen Sie den Merkekasten Stringverkettung. Passen Sie danach den Programmcode so an, dass der String Ist das Feld voraus frei? und der Rückgabewert der Methode isFieldAheadFree() zu einem neuen String verbunden werden und dieser anschließend im Statusbereich angezeigt wird.
  4. Prüfen Sie nun, ob die Felder vor dem linken bzw. rechten Sensor frei sind und geben Sie die entsprechenden Meldungen aus.

Ausgewählte Attribute und Methoden der Klassen Robot und Sensor

Hinweise zum Einsatz der Sensoren

  • Mit den Methoden getSensorFront(), getSensorLeft() und getSensorRight() kann das Roboter-Objekt aufgefordert werden, das entsprechende Sensor-Objekt zurückzugeben. Der Rückgabewert jeder dieser drei Methoden besitzt den Datentyp Sensor. Der Rückgabewert ist also ein Sensor-Objekt. Lesen Sie dazu den Merkekasten Rückgabewert.
  • Jedes Sensor-Objekt verfügt über die Methode isFieldAheadFree(). Beim Aufruf dieser Methode wird geprüft, ob das Feld direkt vor dem Sensor vom Roboter betreten oder zum Abladen von Gegenständen genutzt werden könnte. Die Methode gibt einen Wert vom Typ boolean (Wahrheitswert) zurück. Dieser Datentyp besitzt nur die beiden möglichen Werte true und false. Gibt isFieldAheadFree() den Wert true zurück, ist das Feld frei und kann vom Roboter betreten oder zum Abladen von Gegenständen genutzt werden. Andernfalls gibt die Methode den Wert false zurück.

Hinweise zur Ausgabe der Meldungen

  • Wird die Methode report(message: String) eines Robot-Objekts aufgerufen, muss zwischen den Klammern ein Wert vom Typ String (Zeichenfolge) übergeben werden. Der übergebene Wert wird anschließend im Statusbereich ausgegeben.
    Beispiel: Die Anweisung robi.report("Hallo!"); gibt im Statusbereich den Text „Hallo!“ aus.
  • Mehrere Textbausteine lassen sich mit dem Plus-Operator (+) zu einem neuen String verbinden.
    Beispiel: Die Anweisung robi.report("Ich bin " + robi.getName() + "!"); gibt im Statusbereich den Text ich bin robi! aus. Der Ausdruck robi.getName() gibt den im Attribut name gespeicherten Wert zurück.

Methoden können nicht nur Anweisungen ausführen, sondern auch einen Wert eines bestimmten Datentyps zurückgeben (Rückgabewert). Ob eine Methode einen Wert zurückgibt, wird bei ihrer Definition festgelegt.

Die Auswertung eines solchen Methodenaufrufs ergibt den zurückgegebenen Wert (vgl. Merkekasten Ausdruck). Der Methodenaufruf kann daher überall dort verwendet werden, wo ein Wert des entsprechenden Datentyps benötigt wird.

Ein Ausdruck ist ein Teil des Quellcodes, der entweder direkt einen Wert darstellt oder dessen Auswertung einen Wert ergibt. Dieser Wert kann beispielsweise eine Zahl, eine Zeichenfolge oder ein Wahrheitswert sein.
Ein Attribut oder der Aufruf einer Methode, die einen Wert zurückgibt, ist damit ein Beispiel für einen Ausdruck.

Der Wertebereich des Datentyps boolean (Wahrheitswert) umfasst nur die beiden Werte true und false.

Der Plus-Operator (+) steht immer zwischen zwei Werten, den sogenannten Operanden. Sind beide Operanden Zahlen, so werden sie addiert. Ist jedoch mindestens einer der Operanden ein String (Zeichenkette), wird der andere – falls es kein String ist – automatisch in einen String umgewandelt und beide zu einem neuen String verbunden. Dieser Vorgang wird als Stringverkettung bezeichnet.