Arbeitsblätter für JavaKara
Lösung zu "Zum Ersten: Play it again, Kara!"
Autor: Horst Gierhardt
Version 2: Kara soll die Kleeblattreihe invertieren, d.h. wenn er auf einem
Kleeblatt steht, soll er es aufnehmen; wenn er keines vorfindet, soll er eines ablegen.
import JavaKaraProgram; public class KleeblattSammeln extends JavaKaraProgram { // Anfang von KleeblattSammeln public void myProgram() { // Anfang von myProgram if (kara.onLeaf()) { kara.removeLeaf(); } else { kara.putLeaf(); } while (!kara.treeFront()) { kara.move(); if (kara.onLeaf()) { kara.removeLeaf(); } else { kara.putLeaf(); } } } // Ende von myProgram } // Ende von KleeblattSammeln
Fragen:
- Wozu dient die folgende Zeile, die vor der while-Schleife
steht? Für welche Situation ist sie notwendig?
if (kara.onLeaf()) { kara.removeLeaf(); }
Antwort: In der while-Schleife geht Kara zuerst einen Schritt vor. Also vergisst er eventuell ein Blatt, auf dem er startet.
- Die folgende Lösung ist für eine bestimmte Situation nicht korrekt. Welche?
import JavaKaraProgram; public class KleeblattSammeln extends JavaKaraProgram { // Anfang von KleeblattSammeln public void myProgram() { // Anfang von myProgram while (!kara.treeFront()) { if (kara.onLeaf()) { kara.removeLeaf(); } kara.move(); } } // Ende von myProgram } // Ende von KleeblattSammeln
Verbessere das Programm durch Einfügen einer zusätzlichen if-Anweisung.Antwort: Wenn Kara auf dem Feld vor dem Baum angekommen ist, wird die Schleife nicht mehr ausgeführt. Dann bleibt das letzte Blatt liegen. Also muss man nach der Schleife noch die folgende Zeile einfügen:
if (kara.onLeaf()) { kara.removeLeaf(); }
- Was ist hier falsch?
import JavaKaraProgram; public class KleeblattSammeln extends JavaKaraProgram { // Anfang von KleeblattSammeln public void myProgram() { // Anfang von myProgram while (!kara.treeFront() && kara.onLeaf()) { kara.removeLeaf(); kara.move(); } } // Ende von myProgram } // Ende von KleeblattSammeln
Antwort: Die Schleife wird nur ausgeführt, wenn vorne kein Baum ist und ein Blatt vorhanden ist. Steht Kara auf einem leeren Feld, wird nichts mehr getan und Kara bleibt dort stehen.
- Schreibe das Programm mit einer do-Schleife.
import JavaKaraProgram; public class KleeblattSammeln extends JavaKaraProgram { // Anfang von KleeblattSammeln public void myProgram() { // Anfang von myProgram do { if (kara.onLeaf()) { kara.removeLeaf(); } if (!kara.treeFront()) { kara.move(); } } while (!kara.treeFront()); if (kara.onLeaf()) { kara.removeLeaf(); } } // Ende von myProgram } // Ende von KleeblattSammeln
Die do-Schleife ist gefährlich! Für den ersten Durchlauf muss also ein
if (!kara.treeFront()) { kara.move(); }
eingefügt werden. Kara könnte ja beim Start schon direkt vor einem Baum stehen.
- while (true) { kara.turnLeft(); } Was passiert?
Antwort: Die Bedingung ist immer wahr, also wird die Schleife immer wieder ausgeführt. Es entsteht eine Endlosschleife.
- while (!kara.treeFront()); { kara.move(); } Was passiert und warum?
Antwort: Ein kleiner Fehler mit großer Wirkung! Die geschweiften Klammern für den Anweisungsblock der Schleife darf man weglassen, wenn der Block aus einer einzigen Anweisung besteht. Richtig wäre demnach:
while (!kara.treeFront()) kara.move();
Da hier aber ein Semikolon hinter der Bedingungsklammer steht, sieht der Compiler die Schleife, die keine Anweisung enthält, als beendet. Man erhält eine Endlosschleife und kara.move(); wird niemals ausgeführt. Man hat versehentlich Folgendes programmiert:
while (!kara.tree.Front()) /* Mache gar nichts! */ ; { kara.move();} // Gehoert nicht mehr zur Schleife