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:

  1. 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.

  2. 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(); }

  3. 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.

  4. 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.

  5. while (true) { kara.turnLeft(); } Was passiert?

    Antwort: Die Bedingung ist immer wahr, also wird die Schleife immer wieder ausgeführt. Es entsteht eine Endlosschleife.

  6. 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