Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
| gf_informatik:karatutorial:verzweigungen [2026-08-14 15:43] – [Weiter] hof | gf_informatik:karatutorial:verzweigungen [2026-09-02 07:25] (aktuell) – hof | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ## Selektion mit Verzweigungen | ## Selektion mit Verzweigungen | ||
| - | Manchmal möchten wir eine Anweisung | + | ### Blätter legen und sammeln |
| + | Neben Pilzen gibt es in der Kara-Welt auch Kleeblätter | ||
| - | <kara-editor step=" | + | * `kara.onLeaf()` ist genau dann wahr (`True`), falls sich Kara auf einem Kleeblatt befindet, sonst falsch (`False`). |
| - | if kara.treeFront(): | + | * `kara.putLeaf()` legt ein Blatt ab. |
| - | kara.turnRight() | + | |
| + | * `kara.removeLeaf()` nimmt ein Blatt auf. | ||
| + | * Schlägt fehlt und beendet das Programm, wenn kein Blatt vorhanden ist. | ||
| + | |||
| + | #### Aufgabe C1: Blätter sammeln | ||
| + | |||
| + | Schreibe Code, um alle bestehenden Blätter aufzusammeln. Achtung, auf dem Startfeld hat es kein Blatt! | ||
| + | |||
| + | < | ||
| < | < | ||
| | | ||
| - | | + | T>LLLLLLT |
| - | | + | |
| - | | + | |
| - | | + | |
| - | TT>T M | + | |
| - | | + | |
| - | | + | |
| | | ||
| </ | </ | ||
| - | </kara-editor> | + | < |
| + | while not kara.treeFront(): | ||
| + | kara.move() | ||
| + | kara.removeLeaf() | ||
| + | </ | ||
| + | < | ||
| + | assert world_leaves() == 0, f"Es hat noch {world_leaves()} Blätter!" | ||
| + | </ | ||
| + | </kara-exercise> | ||
| - | Der Fachbegriff für eine Verzweigung ist **Selektion** (Auswahl einer Anweisung). | ||
| - | ### Aufgabe 5 | + | ### Verzweigungen |
| - | Betrachte folgende Kara-Welt und den dazugehörigen Code! Was wird Kara tun? Ergänze den Code, so dass Kara zum Pilz findet! | + | Wir können nur Blätter aufnehmen, wenn eines vorhanden ist. Um eine Anweisung nur dann auszuführen, |
| - | <kara-editor step="300" id="a5"> | + | Der Fachbegriff für eine Verzweigung ist **Selektion** (Auswahl eines Ausführungspfades). |
| + | |||
| + | 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. | ||
| + | |||
| + | <kara-exercise id="collect_leaves_if"> | ||
| + | < | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | while not kara.treeFront(): | ||
| + | kara.move() | ||
| + | if kara.onLeaf(): | ||
| + | kara.removeLeaf() | ||
| + | < | ||
| + | assert world_leaves() == 0, "keine Blätter erwartet" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | #### Aufgabe C2: Blätter verteilen | ||
| + | |||
| + | Schreibe Code, der gerade umgekehrt funktioniert: | ||
| + | |||
| + | < | ||
| + | < | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | < | ||
| + | assert world_leaves() == 8, "8 Blätter erwartet" | ||
| + | </ | ||
| + | < | ||
| + | while not kara.treeFront(): | ||
| + | if not kara.onLeaf(): | ||
| + | kara.putLeaf() | ||
| + | kara.move() | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | #### Aufgabe C3: Labyrinth-Gärtner | ||
| + | |||
| + | Schreibe Code mit `while` und `if`, um alle Blätter aufzusammeln. Kara stoppt, wenn Sie einen Pilz erreicht. | ||
| + | |||
| + | < | ||
| + | < | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | < | ||
| while not kara.mushroomFront(): | while not kara.mushroomFront(): | ||
| + | if kara.treeFront(): | ||
| + | kara.turnRight() | ||
| kara.move() | 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): | ||
| + | |||
| + | < | ||
| < | < | ||
| | | ||
| - | T T | + | T>L L L T |
| - | T > T T | + | TTTTTTTTT |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | TTTTTMTTT | + | |
| </ | </ | ||
| - | </kara-editor> | + | while not kara.treeFront(): |
| + | if kara.onLeaf(): | ||
| + | kara.removeLeaf() | ||
| + | else: | ||
| + | kara.putLeaf() | ||
| + | kara.move() | ||
| + | < | ||
| + | assert world_leaves() == 3 | ||
| + | </ | ||
| + | </kara-exercise> | ||
| - | ++++Lösung 5| | + | #### Aufgabe C4: Blattwanderung |
| - | <code python> | + | |
| + | 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? | ||
| + | |||
| + | < | ||
| + | < | ||
| + | | ||
| + | | ||
| + | T L LL L T | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | <kara-solution> | ||
| while not kara.mushroomFront(): | while not kara.mushroomFront(): | ||
| - | if kara.treeFront(): | + | if kara.onLeaf(): |
| + | kara.turnLeft() | ||
| + | else: | ||
| kara.turnRight() | kara.turnRight() | ||
| kara.move() | kara.move() | ||
| - | </code> | + | </kara-solution> |
| - | ++++ | + | < |
| + | 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." | ||
| + | </ | ||
| + | </ | ||
| - | ### Else - Andernfalls | + | #### Aufgabe C5: Pilzsuche |
| - | Wie wir gesehen haben, können Schleifen und Verzweigungen auch innerhalb eines anderen eingerückten Programmblocks stehen. | + | |
| - | Manchmal möchten wir genau eine von beiden alternativen Code-Sequenzen ausführen, je nachdem ob die Bedingung erfüllt ist oder nicht. Dies geschieht mit `else`: | + | Lies das folgende Python-Programm für Kara und beschreibe es in natürlicher Sprache. Bestimme, auf welchem Feld Kara landen wird. |
| + | <WRAP group> | ||
| + | <WRAP column twothirds> | ||
| <code python> | <code python> | ||
| - | if kara.treeFront(): | + | while not kara.treeFront(): |
| - | kara.turnLeft() | + | |
| - | else: | + | |
| + | if kara.mushroomFront(): | ||
| + | kara.turnRight() | ||
| kara.move() | kara.move() | ||
| </ | </ | ||
| + | </ | ||
| + | <WRAP column third> | ||
| + | {{.: | ||
| + | </ | ||
| + | </ | ||
| - | ### Aufgabe 6 | + | <nodisp 1> |
| - | Analysiere den untenstehenden Code, bevor du ihn ausführst. Beschreibe | + | ++++Lösung| |
| + | Kara landet | ||
| - | <kara-editor step="300" id="a6"> | + | Eine Beschreibung könnte so aussehen: |
| - | while not kara.mushroomFront(): | + | * Solange Kara nicht vor einem Baum steht: |
| + | * Falls Kara auf einem Blatt steht: | ||
| + | * ... wendet sie nach links. | ||
| + | * Falls Kara vor einem Pilz steht: | ||
| + | * ... wendet sie nach rechts. | ||
| + | * So oder so geht Kara einen Schritt weiter. | ||
| + | |||
| + | <kara-exercise id="mushroom_walk"> | ||
| + | < | ||
| + | | ||
| + | T L | ||
| + | T M T | ||
| + | T M ML T | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | while not kara.treeFront(): | ||
| + | if kara.onLeaf(): | ||
| + | kara.turnLeft() | ||
| + | if kara.mushroomFront(): | ||
| + | kara.turnRight() | ||
| + | kara.move() | ||
| + | </ | ||
| + | ++++ | ||
| + | </ | ||
| + | |||
| + | #### Aufgabe C6: 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. | ||
| + | ++++ | ||
| + | |||
| + | < | ||
| + | < | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | < | ||
| + | # Spirale laufen | ||
| + | while kara.onLeaf(): | ||
| + | kara.removeLeaf() | ||
| + | # Wenden beim Baum. | ||
| if kara.treeFront(): | if kara.treeFront(): | ||
| + | kara.turnRight() | ||
| + | kara.move() | ||
| + | if not kara.onLeaf(): | ||
| + | # zu weit! Aus Kara's Sicht hinten rechts weitersuchen. | ||
| kara.turnRight() | kara.turnRight() | ||
| kara.move() | kara.move() | ||
| - | kara.turnLeft() | + | kara.turnRight() |
| - | kara.move() | + | |
| kara.move() | kara.move() | ||
| kara.turnLeft() | kara.turnLeft() | ||
| - | | + | </kara-solution> |
| - | kara.turnRight() | + | <kara-tests> |
| - | else: | + | assert world_leaves() == 0 |
| - | kara.move() | + | </kara-tests> |
| - | <kara-world> | + | </kara-exercise> |
| - | TTTTTTTTT | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | T> T T M | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | </kara-world> | + | |
| - | </kara-editor> | + | |
| ### Weiter | ### Weiter | ||
| - | Gratuliere, du hast deine ersten Kara-Schleifen geschrieben! | + | Weiter gehts mit [[.:logik]]. |