Wiki: Mathe und Info

Unterrichtsmaterialien für Mathematik und Informatik

Benutzer-Werkzeuge

Webseiten-Werkzeuge


info:sek-ii:e2:java-grundlagen:l4-sensoren

Lektion 4 - Der Hamster entwickelt Gefühle

Aufgabe 1: Neue Gefühle

Ihr kennt nun schon einige Möglichkeiten, euren Quellcode lesbarer zu machen. Eine davon ist es, sich wiederholenden Code in Methoden zusammenzufassen. Leider geht das bis jetzt nicht bei Testbefehlen, z.B. bei folgendem Code:

// Der Hamster soll so lange vor gehen und
// ein Korn ablegen, wie er kann und Körner hat.
void main() {
  while (vornFrei() && !maulLeer()) {
    gibUndVor();
  }
}
 
// Hilfsmethode
void gibUndVor() {
  gib();
  vor();
}

Hier wäre es doch schön, wenn man auch die Bedingung vornFrei() && !maulLeer() irgendwie schöner schreiben könnte, oder?

  • Lest euch das Fachkonzept: Boolsche Funktion durch!
  • Überlegt euch, wie die Boolsche Funktion allesGut() lauten müsste, damit der Code genau das gleiche Ergebnis wie oben liefert:

Aufgabe

// Der Hamster soll so lange vor gehen und
// ein Korn ablegen, wie er kann und Körner hat.
void main() {
  while (allesGut()) {
    gibUndVor();
  }
}
 
boolean allesGut() {
  // HIER FEHLT WAS
}

Lösung

// Der Hamster soll so lange vor gehen und
// ein Korn ablegen, wie er kann und Körner hat.
void main() {
  while (allesGut()) {
    gibUndVor();
  }
}
 
boolean allesGut() {
  return vornFrei() && !maulLeer();
}

Aufgabe 2: Komplexe Testbefehle, Seiteneffekte

Teil 1

Bis jetzt habt ihr zwei relativ einfache Testbefehle kennen gelernt: mauerDa() und allesGut(). Allerdings kann man auch Testbefehle schreiben, für die der Hamster mehr tun muss, als nur die "eingebauten" Testbefehle zu verwenden. Nehmt folgendes Beispiel:

Aufgabe:

Der Hamster soll so lange an der linken Wand entlang laufen, bis er seine "Höhle" findet und sich dann darin verstecken. Und das unabhängig davon, wie "lange" die Wand ist!

  • Überlegt euch, wie ihr das programmieren könntet. Klickt anschließend auf "Teil 2".
Ausgangssituationen:

Zielsituationen:

Teil 2

Eine erste Idee wäre so etwas:

void main() {
  while (!linksFrei()) {
    vor();
  }
}

Dumm nur, dass der Hamster den Testbefehl linksFrei() nicht kennt. Da kann man nix machen. Problem unlösbar. Nächste Aufgabe. Oder etwa doch lösbar? Probiert folgenden Ansatz für die boolsche Funktion linksFrei() aus:

boolean linksFrei() {
  linksUm();
 
  return vornFrei();
}
  • Der Test schlägt fehl. Überlegt euch, was passiert ist? Klickt auf "Teil 3".

Teil 3

Der Hamster testet zwar, ob links von ihm frei ist, aber er dreht sich nicht wieder zurück. Das nennt man Seiteneffekt.

Teil 4

Das Problem könnte man lösen, indem man den Hamster nach dem Aufruf von linksFrei() einfach wieder zurück dreht, indem man die Schleife anpasst:

void main() {
    while (!linksFrei()) {
    	rechtsUm(); // HIER
    	vor();
    }
 
    linksUm();
    vor();
    drehen();
}
  • Probiert diese Lösung aus! Es gibt aber immer noch ein Problem. Welches? Klickt auf "Teil 5"

Teil 5

Das liegt daran, dass der Hamster nicht nur in der Schleife, sondern auch nach der Schleife "falsch" steht. Dies könnte man folgendermaßen beheben:

void main() {
    while (!linksFrei()) {
    	rechtsUm();
    	vor();
    }
 
    rechtsUm(); // HIER
    linksUm();
    vor();
    drehen();
}

Einfacher wäre es jedoch, wenn man Seiteneffekte einfach verbietet. Dann müsste man nicht immer, wenn man einen Testbefehl verwendet, aufpassen, ob man einen möglichen Seiteneffekt beheben muss.

  • Überlegt euch, wie man die boolsche Funktion linksFrei() anpassen müsste, damit kein Seiteneffekt entsteht (bzw. damit sie den Seiteneffekt selbst behebt). Klickt auf "Teil 6".

Teil 6

Die Seiteneffekt-freie Version von linksFrei() überprüft auch, ob vorn Frei ist. Nur gibt sie das Ergebnis dieser Überprüfung nicht direkt mit return zurück, sondern kümmert sich noch um die Behebung des Seiteneffekts: In beiden Fällen (also true und false) dreht sie den Hamster wieder in die ursprüngliche Blickrichtung zurück!

void main() {
  while (!linksFrei()) {
    vor();
  }
 
  linksUm();
  vor();
  drehen();
}
 
boolean linksFrei() {
  linksUm();
 
  if (vornFrei()) {
    rechtsUm();
    return true;
  } else {
    rechtsUm();
    return false;
  }
}
  • Klickt auf "Teil 7"

Teil 7

Beantwortet abschließend die folgenden Fragen:

  • Was ist ein Seiteneffekt?
  • Warum sollte man Seiteneffekte vermeiden?
  • Wie kann man Seiteneffekte vermeiden?

Auf dem nächsten Tab findet ihr noch die komplette, Seiteneffekt-freie Lösung.

Komplette Lösung

void main() {
  while (!linksFrei()) {
    vor();
  }
 
  linksUm();
  vor();
  drehen();
}
 
boolean linksFrei() {
  linksUm();
 
  if (vornFrei()) {
    rechtsUm();
    return true;
  } else {
    rechtsUm();
    return false;
  }
}
 
void rechtsUm() {
  linksUm();
  linksUm();
  linksUm();
}
 
void drehen() {
  linksUm();
  linksUm();
}

Aufgabe 3: Übungsaufgaben

Boolsche Funktionen findet ihr im Hamster-eBook in Kapitel 11 auf S. 157.

  1. Bearbeitet die Beispielprogramme ab S. 169:
  2. Bearbeitet anschließend mindestens drei der Übungsaufgaben ab S. 175:

Speichert die Programme und die Territorien auf eurem Stick nach dem Schema Lektion4_Beispiel2 bzw. Lektion4_Uebung5 ab!

Abschluss

Seht euch eure Unterlagen durch. Geht insbesondere das Fachkonzept unten noch einmal durch.

info/sek-ii/e2/java-grundlagen/l4-sensoren.txt · Zuletzt geändert: 2021-02-01 14:47 von christian.weber