++++Unterrichtskonzeption| * L1: * Sequenz, Iteration (`while`) * Einführung Bottom-Editor, Permalinks, Dokumentation * L2: * Vertiefung und Wiederholung Iteration * Sequenz in Iteration * Mehrere Iterationen * Verschachtelte Iteration * Selektion * mit Blatt (`if kara.onLeaf()`) * if-else (Blätter sammeln / legen) * L3: * Algorithmik * Von der Idee zum Programm: * Python lesen und beschreiben. * Python-Programm in Natural Language (NL) beschreiben. * NL Schritt-für-Schritt in Python übersetzen * Selber ein NL-Programm aufschreiben * Sequenz * Iteration (was ist die Bedingung für `while`?) * L4: * Bool'sche Logik: `not`, `and`, `or` * L5: * Variablen * Schleifen mit Zähler ++++ ## Blätter sammeln Neben Pilzen gibt es in der Kara-Welt auch Kleeblätter (en. _leaf_). Während ein einzelner Pilz von Kara herumgeschoben werden kann, können Blätter gelegt und aufgenommen werden. Die folgenden Funktionen stehen zur Verfügung: * `kara.onLeaf()` ist genau dann wahr (`True`), falls sich Kara auf einem Kleeblatt befindet, sonst falsch (`False`). * `kara.putLeaf()` legt ein Blatt ab. * Schlägt fehlt und beendet das Programm, wenn bereits ein Blatt vorhanden ist. * `kara.removeLeaf()` nimmt ein Blatt auf. * Schlägt fehlt und beendet das Programm, wenn kein Blatt vorhanden ist. ### Blätter sammeln Schreibe Code, um alle bestehenden Blätter aufzusammeln. Achtung, auf dem Startfeld hat es kein Blatt! TTTTTTTTT T>LLLLLLT TTTTTTTTT while not kara.treeFront(): kara.move() kara.removeLeaf() assert world_leaves() == 0, "keine Blätter erwartet" ### Verzweigungen Wir können nur Blätter aufnehmen, wenn eines vorhanden ist. Um eine Anweisung nur dann auszuführen, wenn eine Bedingung wahr ist, verwenden wir eine Verzweigung. Das Schlüsselwort in Python lautet `if`. Beispiel: Der folgende Code sammelt nur dann ein Blatt, wenn `kara.onLeaf()` wahr ist. Beachte: Der bedingt ausgeführte Code-Block muss **eingerückt** sein. TTTTTTTTT T>L L L T TTTTTTTTT while not kara.treeFront(): kara.move() if kara.onLeaf(): kara.removeLeaf() assert world_leaves() == 0, "keine Blätter erwartet" Der Fachbegriff für eine Verzweigung ist **Selektion** (Auswahl einer Anweisung). ### Aufgabe: Blätter verteilen Schreibe Code, der gerade umgekehrt funktioniert: Überall, wo **kein** Blatt ist, soll eines hingelegt werden - auch im Startfeld. TTTTTTTTTT T>L L L LT TTTTTTTTTT assert world_leaves() == 8, "8 Blätter erwartet" while not kara.treeFront(): if not kara.onLeaf(): kara.putLeaf() kara.move() ### Aufgabe Labyrinth-Gärtner Schreibe Code mit `while` und `if`, um alle Blätter aufzusammeln. Kara stoppt, wenn Sie einen Pilz erreicht. TTTTTTTTTTT T>L L L L T TTTTTTTTTLT TLLL LLT T TLTTTTTLTLT TLTLLMTLTLT TLTLTTTLTLT TLT TLT TLTTTTTTTLT TLLLLLLLLLT TTTTTTTTTTT while not kara.mushroomFront(): if kara.treeFront(): kara.turnRight() kara.move() if kara.onLeaf(): kara.removeLeaf() assert world_leaves() == 0, "alle Blätter sollten entfernt sein" ### Verzweigung mit Alternative Wenn Kara entweder je nach Bedingung die eine oder andere Anweisung ausführen soll, so können wir `if` zusammen mit `else` benützen. Der folgende Code sammelt die bestehenden Blätter und legt ein neues Blatt hin, falls es keines hat (ausser im letzten Feld): TTTTTTTTT T>L L L T TTTTTTTTT while not kara.treeFront(): if kara.onLeaf(): kara.removeLeaf() else: kara.putLeaf() kara.move() assert world_leaves() == 3 ### Aufgabe: Blattwanderung Schreibe Python-Code mit folgenden Eigenschaften: * Kara soll folgende Anweisungen befolgen, solange sie auf keinen Pilz stösst. * Wenn Kara auf einem Blatt steht, * soll sie nach links wenden; * andernfalls: * soll Kara nach rechts wenden. * Dann soll Kara einen Schritt nach vorne machen. Bei welchem Pilz landet Kara? TTTTTTTTTTT TM MT T L LL L T TL LLLLL T T L T TL >L LL T T LL L T T L L T TM L MT TTTTTTTTTTT while not kara.mushroomFront(): if kara.onLeaf(): kara.turnLeft() else: kara.turnRight() kara.move() assert kara.x == 8, "Kara sollte links neben dem Pilz in der rechten, oberen Ecke sein." assert kara.y == 1, "Kara sollte links neben dem Pilz in der rechten, oberen Ecke sein." ### Aufgabe: Pilzsuche Lies das folgende Python-Programm für Kara und beschreibe es in natürlicher Sprache. Bestimme, auf welchem Feld Kara landen wird. while not kara.treeFront(): if kara.onLeaf(): kara.turnLeft() if kara.mushroomFront(): kara.turnRight() kara.move() {{.:leaves:pasted:20260828-062628.png?nolink&407|}} ++++Lösung| Kara landet auf dem Feld **B6**: TTTTTTTTTTT T L L T T M T T M ML T T T T LM L T T v L T T L M T T L L T T T TTTTTTTTTTT while not kara.treeFront(): if kara.onLeaf(): kara.turnLeft() if kara.mushroomFront(): kara.turnRight() kara.move() ++++ ### Aufgabe Golfplatz (schwierig) Der Golf-Rasen ist voller Blätter - schreibe Code, um alle Blätter aufzusammeln! ++++Hinweise:| * Idee 1: Einmal links, einmal rechts wenden. Dafür benötigen wir für jede Strecke eine while not `kara.treeFront()` Schleife. * Idee 2: Spirale laufen. Wenn ein Feld ohne Blatt erreicht wird, müssen wir zurück und wenden. ++++ TTTTTTTTTTT T>LLLLLLLLT TLLLLLLLLLT TLLLLLLLLLT TLLLLLLLLLT TLLLLLLLLLT TLLLLLLLLLT TLLLLLLLLLT TLLLLLLLLLT TLLLLLLLLLT TTTTTTTTTTT # Spirale laufen kara.move() while kara.onLeaf(): kara.removeLeaf() # Wenden beim Baum. if kara.treeFront(): kara.turnRight() kara.move() if not kara.onLeaf(): # zu weit! Aus Kara's Sicht hinten rechts weitersuchen. kara.turnRight() kara.move() kara.turnRight() kara.move() kara.turnLeft() assert world_leaves() == 0