Lernpfad:Lerntheke Marsrover/18: Unterschied zwischen den Versionen

keine Bearbeitungszusammenfassung
(Die Seite wurde neu angelegt: „{{Karte}} {{Inhalt/Lerntheke}}“)
 
Keine Bearbeitungszusammenfassung
 
(14 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Karte}}
{{Karte|Hilfe=9}}
 
Wenn ein Algorithmus zu groß und komplex wird, dann ist es hilfreich, die Strukturierte Zerlegung (siehe dazu {{Pfad|17|Karte 17}}) anzuwenden, um ihn in kleiner Teilprobleme zu zerlegen. In Java nutzt man dazu ''Methoden''.
 
Jede ''Methoden'' an sich ist wieder ein Algorithmus, der als Befehl in anderen Programmen verwendet werden kann. Du kennst schon einige Methoden. Beispielsweise
 
* <code>fahre()</code>,
* <code>drehe(richtung)</code> oder
* <code>analysiereGestein()</code>.
 
{{Aufgabe:Start}}
Was sind Vorteile, wenn ein Programm in einzelne Methoden aufgeteilt wird? Notiere im Heft.
{{Aufgabe:End}}
{{Lösung:Start}}
* Weniger doppelter Code.
* Bessere ''Wartbarkeit'', da Fehler nicht an mehreren Stellen gesucht und korrigiert werden müssen.
* Bessere Lesbarkeit des Quelltextes.
* Leichtere Aufteilung im Team. ("Ich implementiere <code>fahre</code>, du implementierst <code>drehe</code>.")
{{Lösung:End}}
 
In Java wird eine ''Methode'' so definiert:
<syntaxhighlight lang="java">
public void dreimalFahre() {
fahre();
    fahre();
    fahre();
}
</syntaxhighlight>
 
Sie besteht aus einem ''Methodenkopf'' und einem ''Methodenrumpf''. Der Rumpf enthält die Befehle, die ausgeführt werden sollen. Der Kopf besteht aus den Schlüsselwörtern <code>public void</code> und einem ''Bezeichner'' für den neuen Befehl. Den Bezeichner kannst du frei wählen, aber er sollte aussagekräftig sein.
{{Aufgabe:Start|Icon=Greenfoot Rover.png}}
# Implementiere eine Methode <code>public void umdrehen()</code>, die den Rover um 180 Grad dreht.
# Implementiere eine Methode <code>public void vierVorUndRechts()</code>, die den Rover vier vor fahren lässt und ihn dann nach rechts dreht.
{{Aufgabe:End}}
{{Lösung:Start}}
<syntaxhighlight lang="java">
public void umdrehen() {
    drehe("rechts");
    drehe("rechts");
}
public void vierVorUndRechts() {
fahre();
    fahre();
    fahre();
    fahre();
    drehe("rechts");
}
</syntaxhighlight>
{{Lösung:End}}
 
{{Aufgabe:Start|Icon=Greenfoot Rover.png}}
Der Rover steht vor dem gezeigten Hügelsystem.
 
[[Datei:Rover Karte19 Raute.jpg|center]]
 
# Zerlege das Problem in deinem Heft  in sinnvolle Teilprobleme.
# Implementiere jedes Teilproblem für sich in einer Methode. (Wähle sinnvolle Bezeichner für die Methoden.)
# Implementiere eine Lösung des Problems unter Verwendung der Methoden aus 2.
{{Aufgabe:End}}{{Aufgabe:Start|Für Fortgeschrittene|Icon=Greenfoot Rover.png}}
Entwirf das Programm so, dass die Größe des Hügels egal ist. Die Form einer Raute bleibt aber erhalten. Lade die Karte <code>"karte18_huegelraute"</code> in die Planetenwelt für eine zufällige Raute bei jedem Reset.
{{Aufgabe:End}}
{{Lösung:Start}}
Mögliche Zerlegung:
; <code>rauteAbfahren()</code>
: Lösung des Problems: Die gesamte Raute wird abgefahren und die Steine gesammelt.
; <code>fahreSeite()</code>
: Fährt eine Seite der Raute ab, wenn der Rover mit Blickrichtung zur Raute steht.
; <code>fahreUmHuegel()</code>
: Fährt um einen einzelnen Huegel an einer Seite der Raute.
 
<syntaxhighlight lang="java">
public void fahreUmHuegel() {
drehe("links");
    fahre();
    drehe("rechts");
    fahre();
}
 
public void fahreSeite() {
fahreUmHuegel();
    fahreUmHuegel();
    fahreUmHuegel();
    drehe("rechts"); // Blickrichtung zur Raute
}
 
public void rauteAbfahren() {
fahreSeite();
    analysiereGestein(); // Analysiere das Gestein am Ende der Seite
    fahreSeite();
    analysiereGestein();
    fahreSeite();
    analysiereGestein();
    fahreSeite();
}
</syntaxhighlight>
{{Lösung:End}}
{{Lösung:Start|Lösung des fortgeschrittenen Problems}}
<syntaxhighlight lang="java">
public void fahreUmHuegel() {
drehe("links");
    fahre();
    drehe("rechts");
    fahre();
}
 
public void fahreSeite() {
// Solange kein Hügel vorhanden
while( !huegelVorhanden("vorne") ) {
fahreUmHuegel();
}
    // Blickrichtung zur Raute
    drehe("rechts");
}
 
public void rauteAbfahren() {
fahreSeite();
    analysiereGestein(); // Analysiere das Gestein am Ende der Seite
    fahreSeite();
    analysiereGestein();
    fahreSeite();
    analysiereGestein();
    fahreSeite();
}
</syntaxhighlight>
{{Lösung:End}}


{{Inhalt/Lerntheke}}
{{Inhalt/Lerntheke}}
8.581

Bearbeitungen