Lernpfad:Lerntheke Marsrover/18

Aus Informatik-Box
Zur Navigation springen Zur Suche springen
Programme strukturieren I

Wenn ein Algorithmus zu groß und komplex wird, dann ist es hilfreich, die Strukturierte Zerlegung (siehe dazu 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

  • fahre(),
  • drehe(richtung) oder
  • analysiereGestein().
Icon Heft.png
Arbeitsauftrag

Was sind Vorteile, wenn ein Programm in einzelne Methoden aufgeteilt wird? Notiere im Heft.

Lösung
  • 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 fahre, du implementierst drehe.")


In Java wird eine Methode so definiert:

public void dreimalFahre() {
	fahre();
    fahre();
    fahre();
}

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 public void und einem Bezeichner für den neuen Befehl. Den Bezeichner kannst du frei wählen, aber er sollte aussagekräftig sein.

Greenfoot Rover.png
Arbeitsauftrag
  1. Implementiere eine Methode public void umdrehen(), die den Rover um 180 Grad dreht.
  2. Implementiere eine Methode public void vierVorUndRechts(), die den Rover vier vor fahren lässt und ihn dann nach rechts dreht.
Lösung
public void umdrehen() {
    drehe("rechts");
    drehe("rechts");
}
public void vierVorUndRechts() {
	fahre();
    fahre();
    fahre();
    fahre();
    drehe("rechts");
}


Greenfoot Rover.png
Arbeitsauftrag

Der Rover steht vor dem gezeigten Hügelsystem.

Rover Karte19 Raute.jpg
  1. Zerlege das Problem in deinem Heft in sinnvolle Teilprobleme.
  2. Implementiere jedes Teilproblem für sich in einer Methode. (Wähle sinnvolle Bezeichner für die Methoden.)
  3. Implementiere eine Lösung des Problems unter Verwendung der Methoden aus 2.
Greenfoot Rover.png
Für Fortgeschrittene

Entwirf das Programm so, dass die Größe des Hügels egal ist. Die Form einer Raute bleibt aber erhalten. Lade die Karte "karte18_huegelraute" in die Planetenwelt für eine zufällige Raute bei jedem Reset.

Lösung

Mögliche Zerlegung:

rauteAbfahren()
Lösung des Problems: Die gesamte Raute wird abgefahren und die Steine gesammelt.
fahreSeite()
Fährt eine Seite der Raute ab, wenn der Rover mit Blickrichtung zur Raute steht.
fahreUmHuegel()
Fährt um einen einzelnen Huegel an einer Seite der Raute.
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();
}
Lösung des fortgeschrittenen Problems
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();
}