--- section: Bedingte Wiederholung title: Bedingte Wiederholung --- :::{.no-print} ::::{.tipp} Vergiss nicht das Arbeitsblatt: %section% herunterzuladen. :::: ::: :::{.terminal} Um unser gesuchtes Mineral zu finden, wollen wir Gesteinsproben untersuchen. Der Rover kann Gestein unter sich aufnehmen, damit es später genauer analysiert werden kann. Es ist deine Aufgabe eine **Methode** zu schreiben, mit der der Rover auf das Gestein vor ihm fährt und es aufsammelt. Das letzte Team hat die folgenden Vorschläge gemacht. [_]{.blink} ::: ::: {.columns} :::: {.column width=33%} ![](img/suche-stein1.png) ```java void sucheGestein() { fahre(); fahre(); nimmGestein(); } ``` :::: :::: {.column width=33%} ![](img/suche-stein2.png) ```java void sucheGestein() { fahre(); fahre(); fahre(); fahre(); fahre(); fahre(); fahre(); fahre(); nimmGestein(); } ``` :::: :::: {.column width=33%} ![](img/suche-stein3.png) ```java void sucheGestein() { wiederhole solange kein Stein vorhanden fahre(); nimmGestein(); } ``` :::: ::: :::{.merke data-class="Merke: Wiederholung mit Bedingung"} Mit einer **Wiederholung mit Bedingung** (while-Schleife) können bestimmte [Anweisungen]{color="orange"} mehrmals ausgeführt werden. Solange die [Bedingung]{color="magenta"} *wahr* ist, wird die Sequenz wiederholt. Wenn die Bedingung *falsch* ist, wird der Programmcode nach der Wiederholung fortgesetzt. ::: {.columns} :::: {.column width=33%} **Programmcode:** while([Bedingung]{color="magenta"})
{
[Anweisungen]{style="color: orange; margin-left: 20px;"}
}
:::: :::: {.column width=33%} **Programmablauf:** ![](while-flowchart.svg) :::: :::: {.column width=33%} **Struktogramm:** ![](while-struktogramm.svg) :::: ::: ::: ![](img/suche-stein3.png){.center} :::{.terminal} Der letzte Vorschlag unseres Teams sieht schon nicht schlecht aus. Leider ist der vorgeschlagene Code noch kein korrektes Java Programm. In Java kann das **kein** in "*kein Gestein*" durch ein Ausrufezeichen `!`{style="color: red;"} ausgedrückt werden. [_]{.blink} ::: :::{.aufgabe data-class="Aufgabe 4.1"} Übertrage die Methode `sucheStein()` in die drei Darstellungsformen. :::: {.columns} ::::: {.column width=33%} **Programmcode:** ::::::{.solution} void sucheStein() {
[while([!gesteinVorhanden()]{color="magenta"})]{style="margin-left: 20px;"}
[{]{style="margin-left: 20px;"}
[fahre();]{style="color: orange; margin-left: 40px;"}
[}]{style="margin-left: 20px;"}
[nimmGestein();]{style="margin-left: 20px;"}
}
:::::: ::::: ::::: {.column width=33%} **Programmablauf:** ::::::{.solution} ![](sucheStein-flowchart.svg) :::::: ::::: ::::: {.column width=33%} **Struktogramm:** ::::::{.solution} ![](sucheStein-struktogramm.svg) :::::: ::::: :::: ::: :::{.tipp style="margin-top: 1rem;"} Vergiss nicht einen Screenshot deiner Lösung abzugeben unter Planet: Aufgabe 4.1 ![](img/exercise-4_1.png){style="margin-top: 5px;"} ::: :::{.terminal} Unsere Ausbildungsabteilung hat folgende Trainingsaufgaben als Aufwärmübungen für angehende Pilot*innen empfohlen. [_]{.blink} ::: :::{.no-print} **Aufwärmübung**
::: :::{.terminal} Nun bist du auf dich selbst gestellt. Schaffst du die unterschiedlichen Aufgaben auf der Planetenoberfläche? [_]{.blink} ::: #### Schritt 4.1 Vervöllständige die Methode `sammleSteine()`{.java} der Klasse `Rover` in der [Online-IDE](https://www.online-ide.de), mit der der Rover eine beliebig lange Gesteinsreihe aufsammeln kann. ![](img/sammle-steine.png){.center} Teste die Methode in der Datei `SammleSteine` in der Online-IDE. ::: {.scorm-autoembed style="width:100%; height:620px;" .no-print} Test: Sammle Steine ::: #### Schritt 4.2 Mit der Methode `bergketteAbfahren()`, kann der Rover an einer beliebig langen Bergkette entlang fahren. Der Programmablaufplan beschreibt den Aufbau der Methode. ::: {.columns} :::: {.column width=60%} ![](img/bergkette-abfahren.png) :::: :::: {.column width=40%} ![](img/bergkette-flowchart.png){style="max-height:6cm;"} :::: ::: * Überlege dir zunächst genau, wo der Rover nach Aufruf der Methode steht und an welchen Stellen er Marken gesetzt hat. * Implementiere die Methode `bergketteAbfahren()`{.java} in der [Online-IDE](https://www.online-ide.de) in der Klasse `Rover` um. * Teste die Methode in der Datei **BergketteAbfahren** und finde heraus, ob deine Vermutung richtig war. ::: {.scorm-autoembed style="width:100%; height:620px;" .no-print} Test: Bergkette abfahren ::: :::{.page-break} ::: #### Schritt 4.3 ::: {.columns} :::: {.column width=50%} :::::{.aufgabe data-class="Aufgabe 4.2"} Analysiere die folgenden Wiederholungen im abgebildeten Szenario, indem du jeweils angibst, wie oft die Bedingung überprüft wird, wie oft die Anweisung ausgeführt wird, auf welchen Feldern eine Marke gesetzt wird und auf welchem Feld der Rover nach Ausführung des Programms steht. Überprüfe deine Lösung unter Planet: Aufgabe 4.2. ![](img/h5p-exercise-4_2.png) ::::: :::: :::: {.column width=50%} ![](img/rover-4_2.png) :::: :::
**Code A** ```java while(huegelVorhanden("links")) { fahre(); } ``` **Code B** ```java while(huegelVorhanden("rechts")) { fahre(); } ``` **Code C** ```java while(!huegelVorhanden("links")) { fahre(); } ```
**Code D** ```java while(!huegelVorhanden("rechts")) { fahre(); } ``` **Code E** ```java while(huegelVorhanden("rechts")) { fahre(); setzeMarke(); } ``` **Code F** ```java while(!huegelVorhanden("links")) { fahre(); } setzeMarke(); ```
:::{.h5p-autoembed .no-print} Planet: Aufgabe 4.2 ::: ::: {.columns} :::: {.column width=50%} :::::{.aufgabe data-class="Aufgabe 4.3"} Der Rover soll alle Gesteine sammeln. Dazu hat Tim einen Algorithmus verfasst und ihn als Struktogramm dargestellt. Beschreibe, welches Problem im abgebildeten Szenario auftritt. ::::: :::: :::: {.column width=50%} ![](img/rover-4_3.png) ![](aufgabe-4_3-struktogramm.svg) :::: ::: ::: {.columns} :::: {.column width=50%} :::::{.aufgabe data-class="Aufgabe: 4.4"} Im nebenstehenden Code befinden sich **6** Fehler. Gib die Zeilennummern der Fehler an und beschreibe den Fehler kurz. ::::: :::: :::: {.column width=50%} ```{.java .numberLines} boolean tueWas() { while(!gesteinVorhanden() { fahre(); } drehe("rechts"); while(!huegelVorhanden(vorne)) fahre(); } nimmGestein() } ``` :::: ::: :::{.erledigt} ::: ### Aufgaben für Schnelle :::{.aufgabe data-class="Zusatzaufgabe 4.1" style="margin-top: 3rem;"} Mit der Methode `bergketteAbfahren()`, aus [Schritt 4.2](#schritt-4.2) kann der Rover nur eine Bergkette entlang fahren. ![](img/bergkette-abfahren.png){.center} Implementiere eine Methode `bergketteUmfahren()` in der [Online-IDE](https://www.online-ide.de) in der Klasse `Rover`, die eine Bergkette komplett umfährt. Teste deine Implementierung in der Datei `BergektteAbfahren` in der Online-IDE. :::: {.scorm-autoembed style="width:100%; height:620px;" .no-print} Test: Bergkette Abfahren :::: ::: :::{.no-print} << Zurück zu TODO: %section% :::