====== 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. Wie oft läuft er die Strecke ab? Ändere die Methode so, dass er 10x hin und herläuft, d.h. 10x nach rechts und 10x wieder nach links. 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 5x hin und herlaufen. ===== 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 Mal hin und herlaufen. Blöderweise kann ihm der Strom ausgehen… zum Glück hat er jedoch drei Akkus dabei. Ergänze die Methode dreheAnzahlRunden(int anz) so, dass er seine Akkus sinnvoll einsetzt. (Tipp: mit if(getEnergie()<60) kann er überprüfen, ob sein Ladezustand ausreicht.) ===== Aufgabe 5 ===== **Laufe x Schritte:** Implementiere eine Methode, die den Roboter genau x Schritte nach vorne laufen lässt. ===== Aufgabe 6 ===== Was tut es?: Analysiere das Verhalten der folgenden Methode (Welche Aufgabe erledigt der Roboter?). public void wastutes(int anz) { int i=0; while(i Entscheide, welche der Schleifen sinnvoll durch eine For-Schleife ersetzt werden kann. Implementiere die Methode mit einer for-Schleife und benenne die Methode geeignet. Kann man durch einen geeigneten Aufruf der Methode alle Schrauben links unten auf einmal einsammeln? ===== Aufgabe 7 ===== **Aufräumen:** Implementiere die Methode aufraeumen(), die den Roboter rechts oben alle von oben herunterrutschende Fässer in die untere Kammer schieben lässt. ===== Aufgabe 8 ===== **Aufzug:** Implementiere die Methoden fahreAufzug und fahreInsStockwerk von AB9 unter Verwendung einer for-Schleife. Entscheide in beiden Fällen, ob die while-Schleife oder die for-Schleife geschickter war. ====== Einsatz 10 ====== Die Diamantminenfirma möchte nun Ergebnisse sehen. Der ReaktorRobot soll im Bergwerk Diamanten einsammeln. Der ReaktorRobot soll dabei zunächst nur seine grundsätzliche Eignung für diese Aufgabe unter Beweis stellen: Die Unwägbarkeiten in der Minenarbeit sind riesig. Daher ist es in diesem Szenario nicht notwendig, dass die Roboter die Aufgabe jedes Mal schaffen, sondern es reicht aus, wenn er es einmal bewältigt. Sammeln alle Roboter zusammen mind. 10 Diamanten, überlegt sich die Firma den Einsatz der Roboter, bei mind. 15, werden die Roboter (vielleicht im Fortsetzungsszenario) speziell für diese Aufgabe trainiert, bei mind. 20 Diamanten ist der Roboter schon so als Bergbauarbeiter geeignet und wird sofort gekauft. Es stehen dir 3 Roboter (''roboter1'', ''roboter2'' und ''roboter3'') zur Verfügung. Roboter 2 und 3 führen jeweils 2 Bomben mit sich. Der Einsatzleiter muss den Einsatz koordinieren. Wie sie zu ihrem Ziel kommen, ist dabei egal. Aber Achtung: Die Steine und Diamanten sind nicht immer an der gleichen Stelle. Sprengt man Stollenwände weg, fallen die Steine und Diamanten herunter. Stürzt der Roboter runter oder wird von einem fallenden Stein getroffen, verliert er Energie. {{ .:diamantfirma.png |}} ---- [[..:ab9:start|<<< 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 [[https://creativecommons.org/licenses/by-nc-sa/2.0/de/|CC-BY-SA-NC Lizenz]].