Auftrag AB 10 – Gezählte Wiederholungen

Eine Diamantminenfirma hat vom großen Erfolg des ReaktorRobots gehört und überlegt, ob sie nicht auch die gefährlichen Arbeiten in den Diamantenminen durch Roboter ausführen lassen soll, da es immer wieder zu Stolleneinbrüchen kommt oder gefährliche Sprengungen notwendig sind. Eine letzte Aufgabe für unsere Rescue-Robots… zum Glück kommen diese gerade aus dem Trainingslager. Schau mal an, was sie dort gelernt haben.

Ziel: Zählschleifen kennen und (in mindestens einer Art) in Java notieren können.

Die Methode rundeDrehen() in der Klasse AB10 wurde umständlich notiert:

public void rundeDrehen() { laufeBisWand(); dreheLinks(); laufeBisWand(); dreheLinks(); laufeBisWand(); dreheLinks(); laufeBisWand(); dreheLinks(); }

Der Roboter umrundet gegen den Uhrzeigersinn ein von Wänden eingeschlossenes rechteckiges Feld. Dabei macht er vier Mal das Gleiche. Eine Befehlssequenz ist also eine mehrere male auszuführen.

Daher gibt es in praktisch allen Programmiersprachen die Möglichkeit solche Wieder­holungen zu notieren.

Wir müssen dem Roboter mitteilen, was er wiederho­len soll (laufeBisWand() und dreheLinks()) und wie oft. Dabei muss er selbst mitzählen, wie oft er es schon gemacht hat.

Er muss also solange die Befehle erneut ausfüh­ren wie die Rundenzahl kleiner ist als 4:

public void rundeDrehen() { int anzGemacht; anzGemacht = 0; while (anzGemacht < 4) { laufeBisWand(); dreheLinks(); anzGemacht++; } }

Die Wiederholungsrunden muss er zählen. Dafür benötigt er innerhalb der Methode rundeDrehen() eine Variable. Sie wird als ganzzahlige Variable mit dem Namen anzGemacht für die Wieder­holung be­reitgestellt: int anzGemacht; Die Anwei­sung anzGemacht = 0; legt den Anfangswert der Zähl­variable auf Null fest. Bisher hat der Roboter auch noch keine Runde gedreht.

Der Wert dieses Wiederholungszählers muss bei jedem Schleifendurchgang um 1 erhöht werden. Daher findest du am Ende der zu wiederho­lenden Anweisungen den Erhöhe-Befehl für die Zählvariable

anzGemacht++

Die Ausführungsbedingung (anzGemacht<4) sorgt dafür, dass die Schleife genau viermal durch­laufen wird: das erste Mal mit dem Wert 0 für anzGemacht , das zweite Mal mit dem Wert 1, das dritte Mal mit dem Wert 2 sowie das vierte und letzte Mal mit dem Wert 3.

Eine 13-fache Wiederholung kannst du daher so schreiben:

int i=0; while (i < 13) { // Anweisungen, die wiederholt werden i++; // Mitzählen!! }

Statt dem Namen i könntest du auch einen Namen wie wdhZaehler benutzen oder sonst einen Namen. Programmierer verwenden gern kurz und knapp i als Zähl­variable. Längere Namen blähen die Ausdrücke auf. Daher werden wir meist auch i oder j als Namen für Zählvariablen verwenden.

Wenn von Anfang an feststeht, wie oft etwas wiederholt werden muss, dann kann man Zählschleifen benutzen. Es gibt eine andere Formulierung für Zählschleifen, die wir aber nicht benutzen müssen, denn jede Wiederholung lässt sich wie gesehen mit while for­mulieren. Diese spezielle Formulierung mit dem Schlüsselwort for lautet:

for (int i=0; i<13; i++) { // Anweisungen, die wiederholt werden // if ( i == 2) { ...} }

Der Wert der Zählvariable i steht im Schleifenkörper zur Verfügung.

Gezählte Wiederholungen in Java
while-Schleife	for-Schleife
public void vierVor() { int i=0; while (i < 4) { einsVor(); i++; } }	public void vierVor() { for (int i=0; i<4; i++){ einsVor(); } }

Aufgaben:

Aufgabe 1: Patrouille

Teste mit dem Roboter unten links die Methode rundeDrehen() und betrachte anschließend den Quelltext. Warum schafft er keine ganze Runde? Ändere die Methode dementsprechend ab. Verändere die Methode so, das der Roboter zweieinhalb Runden dreht. Welche Zahl darf anzGemacht nicht überschreiten, damit der Roboter genau 800 Runden dreht?

Aufgabe 2

Warum wird die Variable anzGemacht aus der Methode rundeDrehen() nicht im Objektinspektor angezeigt?

Aufgabe 3

Verändere in der Methode rundeDrehen() die Zählschleife so, dass du anstatt einer while-Schleife eine for-Schleife verwendest. Oben stehende Tabelle kann dir als Hilfe dienen. Der Roboter soll nach Methodenaufruf genau eine Runde drehen.

Aufgabe 4: Zu Befehl

Vervollständige die Methode dreheAnzahlRunden(int anz) so, dass der Roboter anz-Runden dreht, je nach übergebenem Parameter für anz. So lässt der Aufruf dreheAnzahlRunden(7); den AB10 sieben Runden drehen.

Blöderweise schafft er keine 7 Runden, da ihm der Strom aus geht.. zum Glück hat er jedoch 6 Akkus dabei. Ergänze die Methode dreheAnzahlRunden(int anz) so, dass er seine Akkus sinnvoll einsetzt.

(Tipp: getEnergie() liefert seinen Ladezustand…)

Aufgabe 5: Drehwurm

Was macht ein Roboter bei einem Wiederholeschritt wie rechts gezeigt?

int i; i = 5; while (i < 17) { dreheUm(); einsVor(); dreheLinks(); i++; // Mitzählen!! }

Wie oft wird hier wiederholt? Schreibe das einfacher als for-Schleife in der Methode drehWurm() und lasse den AB10-Roboter diese in der Methode mirWirdsGanzSchwindlig(int x) x-Mal ausführen.

(Hinweis: möchtest du mal einen Methodenablauf unterbrechen, kannst du in Greenfoot auf die Reset-Taste drücken)

Aufgabe 6: Hartes Training

Bringe den AB10-Robotern bei, folgende Befehle aus­zuführen:

gehe3Schritte();

geheSchritte(int anz);

lege7Brennstaebe();

legeBrennstaebe(int anz);

Den letzten Befehl soll der Roboter nur ausführen, wenn sein Vorrat an Brennstäben dazu groß genug ist und wenn er nicht schon auf einem Gegenstand steht (!istAufGegenstand()). Er soll dabei so viele Brennstäbe ablegen, wie anz angibt, auch wenn der Vor­rat noch viel größer ist. Nutze in den Methoden jeweils eine Zählschleife.

Aufgabe 7

Der letzte Einsatz naht: Nun müssen die Roboter im Trainingslager noch lernen, wie man Brennstäbe präzise deponiert. Da darf beim Einsatz nichts schief gehen. Aber keine Angst wir sind ja noch im Training.

Es sollen die Methoden

legeRechteck(int breite, int hoehe) und

legeRaute(int hoehe) implementiert werden.

Der Einsatzleiter gibt zum Beispiel die Befehle legeRechteck(3, 4) oder legeRaute(5).

Das Ergebnis von legeRechteck(3, 4) soll wie wie folgt aussehen:

Das Ergebnis von legeRaute(5) soll wie unten abgebildet aussehen:

Anmerkungen: Der Roboter beginnt beim Rechteck immer in der linken oberen Ecke bzw. bei der Raute oben mittig. Die Raute darf als Parameter für die Höhe nur ungerade Zahlen bekommen!

Der Roboter soll nur Brennstäbe legen, wenn er welche hat. Benutze die Methoden aus dem harten Training von Aufgabe 6.

Einsatz 10

Hilfe! Vier Stollen sind bei Sprengarbeiten eingestürzt und haben ein riesiges Loch hinterlassen. Die Situation ist prekär. Überall Staub – man kann kaum etwas sehen. Ein Trupp Rescue-Robots hat schon alle verteilten Brennstäbe gesichert. Nun müssen diese präzise deponiert werden. Die Einsatzleitung hat uns folgenden Plan überlassen:

Ihr Roboter hat 51 Brennstäbe für die Endlagerung und ein Akku für seine Stromversorgung erhalten. Sie müssen unbedingt genau nach Plan arbeiten. Beeilen Sie sich …

<<< Zurück zu Level 9 | Level 10

Alle Arbeitsaufträge in diesem Namensraum basieren auf den Materialien von Schaller/Zechnall zur Informatikfortbildung Baden-Württemberg 2016 und stehen unter einer CC-BY-SA-NC Lizenz.