View
58
Download
3
Category
Preview:
DESCRIPTION
Algorithmisches Problemlösen mit Kara. Klaus Becker 2008. Kara. Teil 1. Ausführsystem Kara. Kara, ein steuerbarer Marienkäfer. - PowerPoint PPT Presentation
Citation preview
Algorithmisches Problemlösenmit Kara
Klaus Becker
2008
2 Kara
3 Teil 1
Ausführsystem Kara
4 Kara, ein steuerbarer Marienkäfer
Kara ist ein Marienkäfer. Kara lebt in einer Welt mit unbewegliche Baumstümpfen, mit Pilzen (die Kara verschieben kann) und mit Kleeblättern, die Kara hinlegen und aufnehmen kann.
5 Aufgabe
Kara steht hier im Eingang seines Baus - das ist der Bereich, der von den Bäumen begrenzt wird. Kara soll jetzt einmal um den Bau laufen und den Weg mit Kleeblättern auslegen. Benutzen Sie die Schaltflächen im Kara-Fenster, um diese Aufgabe zu erledigen.
vorher nachher
6 Aufgabe
Kara steht hier im Eingang seines Baus - das ist der Bereich, der von den Bäumen begrenzt wird. Kara soll jetzt einmal um den Bau laufen und den Weg mit Kleeblättern auslegen. Benutzen Sie die Kara-Operationen, um diese Aufgabe zu erledigen.
KaraweltfensterProgrammfenster
7 Elementare Anweisungen
Operation Bedeutungmove() einen Schritt weiter gehenturnLeft() sich um 90° nach links drehen turnRight() sich um 90° nach rechts drehenputLeaf() ein Kleeblatt auf das aktuelle Feld legenremoveLeaf() das Kleeblatt vom aktuellen Feld entfernen
Aufrufe von Operationen sind Beispiele für Anweisungen. Es handelt sich - genauer gesagt - um die elementaren Anweisungen, die das Ausführsystem Kara zur Verfügung stellt.
elementare Anweisungkara.move()
8 Übungen
siehe www.inf-schule.de
9 Teil 2
Algorithmisches Problemlösen
10 Allgemeines Problem
Problem: vom Eingang des Baus in die hintere linke Ecke laufen
vorher
großer Bau
nachher
vorher
nachher
kleiner Bau
11 Lösung zum allgemeinen Problem
Problem: vom Eingang des Baus in die hintere linke Ecke laufen
vorher
nachher
vorher
nachher
SOLANGE nicht vor_baum: weiter_gehenlinks_drehenSOLANGE nicht vor_baum: weiter_gehen
12 Problemspezifikation / Algorithmus
Problem: vom Eingang des Baus in die hintere linke Ecke laufen
Problemspezifikation
Algorithmus
SOLANGE nicht vor_baum: weiter_gehenlinks_drehenSOLANGE nicht vor_baum: weiter_gehen
Eine Problemspezifikation ist eine möglichst präzise Beschreibung eines Problems.
Vorher: Kara steht im Eingang seines beliebig großen Baus und schaut in den Bau hinein.
Nachher: Kara befindet sich in der linken hinteren Ecke des Baus (mit Blick gegen die Wand).
Ein Algorithmus ist eine Verarbeitungsvorschrift, die so präzise formuliert ist, dass sie (zumindest im Prinzip) auch von einer Maschine abgearbeitet werden kann.
Problemspezifikation
13 Algorithmus / Programm
Problem: vom Eingang des Baus in die hintere linke Ecke laufen
Programm
SOLANGE nicht vor_baum: weiter_gehenlinks_drehenSOLANGE nicht vor_baum: weiter_gehen
Ein Programm ist ein Algorithmus zur Lösung eines Problems, der in einer vorgegebenen formalen Sprache verfasst ist.
Vorher: Kara steht im Eingang seines beliebig großen Baus und schaut in den Bau hinein.
Nachher: Kara befindet sich in der linken hinteren Ecke des Baus (mit Blick gegen die Wand).
Ein Algorithmus ist eine Verarbeitungsvorschrift, die so präzise formuliert ist, dass sie (zumindest im Prinzip) auch von einer Maschine abgearbeitet werden kann.
while not kara.treeFront(): kara.move()kara.turnLeft()while not kara.treeFront(): kara.move()
14 Aufgaben
Problem: Kara soll um den Bau laufen.
Vorher: Kara steht im Eingang seines beliebig großen Baus und schaut aus dem Bau heraus.
Nachher: Kara ist einmal um den Bau gelaufen und steht wieder im Eingang.
Aufgabe: Entwickeln Sie einen Algorithmus zur Lösung des Problems.
15 Teil 3
Bausteine von Algorithmen
16 Aufgabe
Was bewirken die Programme? Beschreiben Sie jeweils die Situation nach der Ausführung.
vorher vorher
while not kara.treeFront(): kara.move()kara.turnLeft()kara.turnLeft()
while not kara.treeFront(): if kara.onLeaf(): kara.removeLeaf() kara.move()kara.turnLeft()kara.turnLeft()
17 Aufgabe
Ändern Sie das Programm jeweils so ab, dass die folgenden Endsituationen erreicht werden.
vorher
while not kara.treeFront(): kara.move()kara.turnLeft()kara.turnLeft()
* Kara soll im Eingang des Baus stehen bleiben.* Kara soll zusätzlich den zurückgelegten Weg mit Kleeblättern auslegen.* Kara soll zur hinteren Wand des Baus und wieder zurück in den Eingang seines Baus laufen.* Kara soll zur hinteren Wand des Baus laufen und dabei nur den Weg bis zum Eingang seines Baus mit Kleeblättern auslegen.
Überprüfen Sie auch, ob ihre entwickelten Programme das Gewünschte leisten.
18 Aufgabe
Ändern Sie das Programm so ab, dass die folgende Endsituation erreicht werden.
vorher * Kara soll zur hinteren Wand laufen und die Lücken zwischen den Kleeblättern mit weiteren Kleeblättern auffüllen.
while not kara.treeFront(): if kara.onLeaf(): kara.removeLeaf() kara.move()kara.turnLeft()kara.turnLeft()
Überprüfen Sie auch, ob ihre entwickelten Programme das Gewünschte leisten.
19 Bedingungen
Eine Bedingung wird mit Hilfe von elementaren Bedingungen und logischen Operatoren aufgebaut.
elementare Bedingungkara.treeFront()
True / False
logischer Operator
not kara.treeFront()
Operation Bedeutung
treeFront() Baum vorne?treeLeft() Baum links?treeRight() Baum rechts?onLeaf() auf einem Kleeblatt?
20 Exkurs: logische Operatoren
Eine Bedingung wird mit Hilfe von elementaren Bedingungen und logischen Operatoren aufgebaut.
a b a and b
False False False
False True False
True False False
True True True
konmplexe Bedingung
SOLANGE nicht (Baum_links und Baum_rechts): weiter_gehen
a b a or b
False False False
False True True
True False True
True True True
a not a
False True
True False
Konjunktion
DisjunktionNegation und oder
nicht
21 Solange-Anweisung
Eine Solange-Anweisung dient dazu, wiederholte Abläufe zu beschreiben. Sie ist aus einer Bedingung und einer (eventuell einelementigen) Anweisungssequenz aufgebaut.
solange nicht vor_baum: kleeblatt_hinlegen schritt_weiter
while [Bedingung]: [Anweisungssequenz]
solange [Bedingung]: [Anweisungssequenz]
Implementierung in PythonKara
22 Solange-Anweisung
Eine Solange-Anweisung dient dazu, wiederholte Abläufe zu beschreiben. Sie ist aus einer Bedingung und einer (eventuell einelementigen) Anweisungssequenz aufgebaut.
solange nicht vor_baum: kleeblatt_hinlegen schritt_weiter
kein Schleifendurchlauf
Endlosschleife
23 Wenn-Anweisung
Eine Wenn-Anweisung dient dazu, alternative Abläufe bzw. Fallunterscheidungen zu beschreiben.
zweiseitige Variante
WENN [Bedingung]: [Anweisungssequenz]SONST: [Anweisungssequenz]
if [Bedingung]: [Anweisungssequenz]else: [Anweisungssequenz]
WENN auf_kleeblatt: kleeblatt_aufhebenSONST: kleeblatt_hinlegen
24 Wenn-Anweisung
Eine Wenn-Anweisung dient dazu, alternative Abläufe bzw. Fallunterscheidungen zu beschreiben.
WENN [Bedingung]: [Anweisungssequenz]
if [Bedingung]: [Anweisungssequenz]
einseitige Variante
WENN auf_kleeblatt: kleeblatt_aufheben
25 Kontrollstrukturen
Kontrollstrukturen dienen dazu, den Ablauf der Ausführungsschritte festzulegen. Wesentliche Kontrollstrukturen sind die Sequenzbildung, die Fallunterscheidung und die Wiederholung.
Flussdiagramme
Programmablaufpläne
26 Kontrollstrukturen
Kontrollstrukturen dienen dazu, den Ablauf der Ausführungsschritte festzulegen. Wesentliche Kontrollstrukturen sind die Sequenzbildung, die Fallunterscheidung und die Wiederholung.
Struktogramme
Sequenzbildung
Fallunterscheidung
Wiederholung
27 Aufgaben
Problem: Kara soll Kleeblätter um den Bau legen.
Aufgabe: Ergänze das Struktogramm zu einem Algorithmus zur Lösung des Problems.
Bedingungen:
* nicht Baum_links * nicht Baum_rechts
Elementare Anweisungen:
* weiter_gehen * weiter_gehen * weiter_gehen * rechts_drehen * rechts_drehen * Kleeblatt_hinlegen
28 Aufgaben
siehe www.inf-schule.de
29 Teil 4
Teilalgorithmen
30 Problemzerlegung
Problem: Kara soll mit den an der hinteren Wand abgelegten Blättern umziehen.
Teilprobleme: in die rechte hintere Ecke laufen das nächste Kleeblatt suchen das gefundene Kleeblatt aufheben zum Ausgang des Baus laufen zum Eingang des anderen Baus laufen in die rechte hintere Ecke laufen die Stelle suchen, an der das Blatt abgelegt werden kann das transportierte Kleeblatt ablegen, falls nicht schon ein Kleeblatt hier liegt zum Ausgang des Baus laufen zum Eingang des anderen Baus laufen
31 Teile und herrsche
Problem: Kara soll mit den an der hinteren Wand abgelegten Blättern umziehen.
laufe_in_die_rechte_hintere_Ecke SOLANGE auf_Kleeblatt: entferne_Kleeblatt laufe_zum_Ausgang laufe_zum_Eingang_des_anderen_Baus laufe_in_die_rechte_hintere_Ecke suche_einen_leeren_Platz WENN nicht auf_Kleeblatt: lege_Kleeblatt_ab laufe_zum_Ausgang laufe_zum_Eingang_des_anderen_Baus laufe_in_die_rechte_hintere_Ecke suche_ein_kleeblatt laufe_zum_Ausgang laufe_zum_Eingang_des_anderen_Baus
Teile und herrsche ist eine Problemlösestrategie, bei der ein Problem immer weiter in Teilprobleme zerlegt wird, bis sich diese einfach lösen lassen. Aus den Lösungen der Teilprobleme wird dann die Lösung des Gesamtproblems zusammengesetzt.
32 Unterprogramme
Eine Prozedur ist ein Unterprogramm zur Lösung eines Teilproblems.
# Unterprogramme
def bauWechseln(): kara.move() while not (kara.treeLeft() and kara.treeRight()): kara.move()
def inEcke(): ...
def blattSuchen(): ...
def zumAusgang(): ...
def platzSuchen(): ...
# Hauptprogramm
inEcke()blattSuchen()while kara.onLeaf(): kara.removeLeaf() zumAusgang() bauWechseln() inEcke() platzSuchen() if not kara.onLeaf(): kara.putLeaf() zumAusgang() bauWechseln() inEcke() blattSuchen() zumAusgang()bauWechseln()
Prozedurdeklaration
Prozeduraufruf
Vorteile: klare Strukturierung; Vermeidung von Codeduplizierung
33 Unterprogramme mit Rückgaben
Problem: Kara soll den Eingang des Baus suchen.
laufe_in_die_rechte_hintere_Ecke SOLANGE auf_Kleeblatt: entferne_Kleeblatt laufe_zum_Ausgang laufe_zum_Eingang_des_anderen_Baus laufe_in_die_rechte_hintere_Ecke suche_einen_leeren_Platz WENN nicht auf_Kleeblatt: lege_Kleeblatt_ab laufe_zum_Ausgang laufe_zum_Eingang_des_anderen_Baus laufe_in_die_rechte_hintere_Ecke suche_ein_kleeblatt laufe_zum_Ausgang laufe_zum_Eingang_des_anderen_Baus
Teile und herrsche ist eine Problemlösestrategie, bei der ein Problem immer weiter in Teilprobleme zerlegt wird, bis sich diese einfach lösen lassen. Aus den Lösungen der Teilprobleme wird dann die Lösung des Gesamtproblems zusammengesetzt.
34 Unterprogramme mit Rückgaben
# Unterprogramme
def bauGefunden(): if kara.treeFront() or kara.treeRight(): return True else: return False
def imEingang(): if kara.treeLeft() and kara.treeRight(): return True else: return False
def umBaum(): ...
def umdrehen(): kara.turnLeft() kara.turnLeft()
# Hauptprogramm
kara.putLeaf()while not bauGefunden(): kara.move() if kara.onLeaf(): kara.removeLeaf() kara.turnRight() kara.move() kara.turnLeft() kara.putLeaf()umdrehen()while not kara.onLeaf(): kara.move()kara.removeLeaf()umdrehen()while not bauGefunden(): kara.move()if kara.treeFront(): kara.turnLeft()umBaum()
Eine Funktion ist ein Unterprogramm, das einen Rückgabewert als Ergebnis liefert.
Funktionsdeklaration
Prozeduraufruf
Prozedurdeklaration
Funktionsaufruf
35
Verwendung von Unterprogrammen
# Unterprogramme
def bauGefunden(): ...
def imEingang(): if kara.treeLeft() and kara.treeRight(): return True else: return False
def umBaum(): while not imEingang(): if kara.treeRight(): kara.move() else: kara.turnRight() kara.move()
def umdrehen(): ...
# Hauptprogramm
kara.putLeaf()while not bauGefunden(): kara.move() if kara.onLeaf(): kara.removeLeaf() kara.turnRight() kara.move() kara.turnLeft() kara.putLeaf()umdrehen()while not kara.onLeaf(): kara.move()kara.removeLeaf()umdrehen()while not bauGefunden(): kara.move()if kara.treeFront(): kara.turnLeft()umBaum()
Eine Prozedur / Funktion muss deklariert sein, bevor sie aufgerufen werden kann.
erst deklarieren
dann aufrufen
36
Verwendung von Unterprogrammen
# Unterprogramme
...
################################ im Eingang()# es wird getestet, ob Kara sich im Eingang des # Baus befindet.###############################
def imEingang(): if kara.treeLeft() and kara.treeRight(): return True else: return False
...
# Hauptprogramm
kara.putLeaf()while not bauGefunden(): kara.move() if kara.onLeaf(): kara.removeLeaf() kara.turnRight() kara.move() kara.turnLeft() kara.putLeaf()umdrehen()while not kara.onLeaf(): kara.move()kara.removeLeaf()umdrehen()while not bauGefunden(): kara.move()if kara.treeFront(): kara.turnLeft()umBaum()
Sprechende Bezeichner und Kommentare erleichtern das Verständnis.
sprechender Bezeichner
Kommentar
37 Unterprogramme mit Parametern
Problem: Kara soll ein rechteckiges Spielfeld mit Kleeblättern abstecken.
# Unterprogramme
def vorwaerts(schritte): while schritte > 0: kara.move() schritte = schritte - 1
Parameter sind Platzhalter, mit deren Hilfe man Daten zur Laufzeit an Unterprogramme übergeben kann.
# Hauptprogramm
vorwaerts(5)kara.turnRight()vorwaerts(3)kara.turnRight()vorwaerts(5)kara.turnRight()vorwaerts(3)kara.turnRight()
Parameter aktueller Wert
38 Unterprogramme mit Parameter
# Unterprogramme
def vorwaerts(schritte): while schritte > 0: kara.move() schritte = schritte - 1
def rechteck(laenge, breite): vorwaerts(laenge) kara.putLeaf() kara.turnRight() vorwaerts(breite) kara.putLeaf() kara.turnRight() vorwaerts(laenge) kara.putLeaf() kara.turnRight() vorwaerts(breite) kara.putLeaf() kara.turnRight()
# Hauptprogramm
rechteck(5, 3)
Mit Hilfe von Parametern kann man Prozeduren flexibel gestalten.
39 Teil 5
Algorithmen mit Variablen
40 Ein Zählproblem
Problem: Kara soll die Welt mit Kleeblättern in zwei Bereiche aufteilen.
Version 1: Kara läuft geradeaus los.
Version 2: Kara läuft erst einmal um den Bau herum und legt dann die Trennlinie aus Kleeblättern bis zum Eingang.
41
Problemlösung mit einer Zählvariablen
Problem: Kara soll die Welt mit Kleeblättern in zwei Bereiche aufteilen.
kara.move()kara.turnRight()kara.move()zaehler = 0while kara.treeRight(): zaehler = zaehler + 1 kara.move()kara.turnRight()kara.move()while kara.treeRight(): kara.move()kara.turnRight()kara.move()while zaehler > 0: zaehler = zaehler - 1 kara.move()kara.turnLeft()while not kara.treeLeft(): kara.putLeaf() kara.move()
42 Variable
Variablen dienen in der Informatik dazu, Daten zu verwalten, die in Speicherzellen abgelegt sind. Jede Variable hat einen Namen, mit dem man auf den in der zugehörigen Speicherzelle abgelegten Datenwert (den sog. Variablenwert) zugreifen kann.
kara.move()kara.turnRight()kara.move()zaehler = 0while kara.treeRight(): zaehler = zaehler + 1 kara.move()kara.turnRight()kara.move()while kara.treeRight(): kara.move()kara.turnRight()kara.move()while zaehler > 0: zaehler = zaehler - 1 kara.move()kara.turnLeft()...
43 Wertzuweisung
Eine Veränderung eines Variablenwerts bzw. des zugehörigen Speicherzelleninhalts kann mit Hilfe einer Wertzuweisung an die entsprechende Variable erfolgen.
kara.move()kara.turnRight()kara.move()zaehler = 0while kara.treeRight(): zaehler = zaehler + 1 kara.move()kara.turnRight()kara.move()while kara.treeRight(): kara.move()kara.turnRight()kara.move()while zaehler > 0: zaehler = zaehler - 1 kara.move()kara.turnLeft()...
zaehler = zaehler + 1
Auswertung einer Wertzuweisung: Erst wird der Wert des Terms mit Hilfe des aktuellen Variablenzustands ermittelt. Dieser Wert wird dann der Variablen als neuer aktueller Wert zugewiesen.
Variable
Term
44 Noch ein Zählproblem
Problem: Kara soll die Schritte bis zum Eingang zählen und sich im Eingang so oft drehen, wie Schritte zum Erreichen des Baus erforderlich waren.
gefunden = Falseabstand = 0while not gefunden: kara.move() abstand = abstand + 1 gefunden = kara.treeLeft() and kara.treeRight() while abstand > 0: kara.turnLeft() kara.turnLeft() kara.turnLeft() kara.turnLeft()
45 Datentypen
Ein Datentyp beschreibt eine Menge von Datenobjekten, die alle die gleiche Struktur haben und mit denen die gleichen Operationen ausgeführt werden können.
abstand = abstand + 1
Wahrheitswert
Rechnen mit Zahlen
gefunden = Falseabstand = 0while not gefunden: kara.move() abstand = abstand + 1 gefunden = kara.treeLeft() and kara.treeRight() while abstand > 0: kara.turnLeft() kara.turnLeft() kara.turnLeft() kara.turnLeft()
Zahl
gefunden = kara.treeLeft() and kara.treeRight()
logische Verknüpfung mit Wahrheitswerten
Zählvariable
boolesche V.
46 Aufgaben
siehe www.inf-schule.de
47 Teil 6
Miniprojekt - Kara lernt rechnen
48 Ein Zählproblem
Problem: Kara soll Rechenaufgaben mit Kleeblättern ausführen.
Einfach: Addition
Nicht schwer: Subtraktion, Vergleich
Eher schwer: Multiplikation, Division
Herausforderung: Potenzierung, Wurzelziehen, ...
49 Auftrag
Kara soll rechnen lernen. Entwickeln Sie Algorithmen und entsprechende Programme für verschiedene Rechenoperationen.
* Benutzen Sie keine Variablen. Kara soll nur mit Kleeblättern operieren. * Wählen Sie mindestens zwei Rechenoperationen aus, für die Sie die Algorithmen und Programme entwickeln. Besonders einfach ist die Addition. Nicht sonderlich schwierig ist die Subtraktion. Hier müssen Sie sich nur überlegen, was man bei Aufgaben wie 3-5 macht. Schwieriger sind die Multiplikation und Division. Wer sich weit vorwagen möchte, kann auch das Potenzieren oder Wurzelziehen bearbeiten. * Alle wesentlichen Arbeitsergebnisse sollen dokumentiert werden. Was alles hier dazu gehört, wird auf der folgenden Folie gezeigt.
50
Arbeitsschritte und ihre Dokumentation
ProblemAuftrag
Ermittlung der AnforderungenPflichtenheft
(Prototyp)
Entwicklung eines Modells
Algorithmus
Implementierung des Modells
LauffähigesProgramm
Testen des Programms
AuftraggerechtesProdukt
Informelle Problembeschreibung: Kara soll Rechenaufgaben mit Kleeblättern ausführen.
Präzise ProblemspezifikationBeschreibung der Anforderungen an das Programm
Algorithmus in Struktogrammform / ...
Strukturiertes und kommentiertes Programm
Testprotokoll über die untersuchten Testfälle
Recommended