Lernpfad:Lerntheke Marsrover/25

Aus Informatik-Box
Zur Navigation springen Zur Suche springen
Wiederholungen I

Vor dem Rover befindet sich ein Gestein. Er weiß aber nicht, wie weit es entfernt ist. Es könnte fünf, oder auch 50 Felder entfernt sein.

Das Problem kann einfach gelöst werden, indem man eine Schleife benutzt. Eine Schleife wiederholt eine Reihe von Befehlen solange, wie eine Bedingung wahr ist. Daher nennt man so eine Schleife auch bedingte Wiederholung.

Das Problem oben lässt sich dann in Pseudocode so aufschreiben:

solange kein Gestein vorhanden ist
wiederhole
	fahre vorwärts
ende wiederhole
analysiere Gestein

Als Programmablaufplan wird die Schleife so dargestellt:

PAP Karte25 Wiederholung.png

In Java schließlich wird das Schlüsselwort while benutzt:

while( !gesteinVorhanden() ) {
	fahre();
}
analysiereGestein();

Innerhalb der runden Klammern steht die Bedingung. Eine Bedinung ist immer entweder wahr (true) oder falsch (false). Mit dem Ausrufungszeichen kann die Bedungung negiert werden (aus true wird false und umgekehrt).

Der Rover hat einige Anfragen, die als Bedingung genutzt werden können:

Anfragen des Mars-Rovers
Anfrage boolean huegelVorhanden(String richtung)
Prüft, ob sich in der angegebenen Richtung ("rechts", "links" oder "vorne") ein Hügel befindet.
Anfrage boolean gesteinVorhanden()
Prüft, ob auf dem Feld des Rovers ein Gestein vorhanden ist.
Anfrage boolean markeVorhanden()
Prüft, ob auf dem Feld des Rovers eine Marke vorhanden ist.
Greenfoot Rover.png
Arbeitsauftrag
  1. Teste die Lösung des Problems oben.
  2. Implementiere eine Schleife, die den Rover bis zum nächsten Hügel fahren lässt.
Lösung
  1. public void act() {
    	while( !gesteinVorhanden() ) {
    		fahre();
    	}
    	analysiereGestein();
    }
    
  2. public void act() {
    	while( !huegelVorhanden("vorne") ) {
    		fahre();
    	}
    }
    


Greenfoot Rover.png
Arbeitsauftrag

Der Rover steht neben einem Rechteck aus Hügeln und soll einmal um den gesammten Hügel fahren. Dazu legt er zunächst eine Marke ab und fährt dann solange, bis er die Marke wieder erreicht hat.

Implementiere einen Algorithmus, der den Rover für beliebig große Rechtechte eine Runde fahren lässt.

Rover Karte25 Rechteck.jpg

Du kannst die Karte "karte25_rechteck" im Planetenszenario laden, um eine zufällige Raute zu erzeugen.

Lösungshinweis

Der Rover muss viermal eine Seite des Rechtecks abfahren. Dazu muss er jeweils solange fahren, wie rechts von ihm noch ein Hügel ist.

Wiederholungen können auch innerhalb von Wiederholungen vorkommen!

Lösung
public void act() {
	setzeMarke();
    fahre();
	while( !markeVorhanden() ) {
		while( huegelVorhanden("rechts") ) {
			fahre();
		}
        drehe("rechts");
        fahre();
    }
}


Greenfoot Rover.png
Arbeitsauftrag

Der Rover steht vor einer Reihe mit Marken. Auf jedem Feld können eine oder auch mehrere Marken liegen.

Der Rover soll vorwärts fahren, bis er auf einem Feld ankommt, das keine Marke enthält, und auf dem Weg alle Marken einsammeln.

Kartendaten:
".\n.\n.\n.\n..(MR)(MMM)(MM)(MMM)M(MM)(M)(MMM)."
Lösung
public void act() {
	while( markeVorhanden() ) {
    	while( markeVorhanden() ) {
        	entferneMarke();
        }
        fahre();
    }
}