Powerpoint-Präsentation

Download Report

Transcript Powerpoint-Präsentation

Algorithmisches Problemlösen
mit Kara
Klaus Becker
2012
2
Algorithmisches Problemlösen / Kara
3
Teil 1
Die Kara-Welt
4
Kara and ihre/seine Welt
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).
Kara kann bestimmte Befehle ausführen.
Kara kann die Umgebung wahrnehmen.
5
Steuerung von Kara
Aufgabe:
Kara steht hier vor einem Baumstumpf. Kara soll jetzt einmal um den Baum laufen und den
Weg mit Kleeblättern auslegen. Benutze die Schaltflächen im Kara-Weltfenster, um diese
Aufgabe zu erledigen. Wenn die Arbeit getan ist, soll die Karawelt so aussehen:
Karawelt - vorher
Karawelt - nachher
6
Steuerung von Kara
Aufgabe:
Stelle nochmal die Ausgangssituation her. Klicke jetzt auf die Schaltfläche [Programmieren]. Es
öffnet sich ein neues Fenster, in das man Anweisungen zur Steuerung von Kara schreiben
kann. In der folgenden Abbildung sind erste Anweisungen zur Lösung der oben gestellten
Aufgabe bereits eingetragen.
Programmfenster
Weltfenster
Anweisung
7
Die Steuerung von Kara erfolgt mit Hilfe von Anweisungen. Anweisungen, die mit Hilfe der vom
Ausführsystem direkt zur Verfügung gestellten Grundoperationen gebildet werden, nennt man
auch elementare Anweisungen.
Operation
Bedeutung
move()
turnLeft()
turnRight()
putLeaf()
removeLeaf()
einen Schritt weiter gehen
sich um 90° nach links drehen
sich um 90° nach rechts drehen
Kleeblatt auf das aktuelle Feld legen
Kleeblatt vom aktuellen Feld entfernen
kara.move()
elementare Anweisung
8
Anweisungssequenzen
Eine Anweisungssequenz ist eine Folge von
Anweisungen, die vom Ausführsystem der
Reihe nach ausgeführt werden.
Anweisungssequenz
kara.turnLeft()
kara.putLeaf()
kara.move()
kara.putLeaf()
kara.turnRight()
kara.move()
kara.putLeaf()
kara.move()
kara.putLeaf()
kara.turnRight()
kara.move()
kara.putLeaf()
kara.move()
kara.putLeaf()
kara.turnRight()
kara.move()
kara.putLeaf()
kara.move()
kara.putLeaf()
kara.turnRight()
kara.move()
kara.putLeaf()
kara.turnLeft()
9
Teil 2
Fallunterscheidungen
10
Problem - Blatt aus dem Bau tragen
Problem: Kara steht vor ihrem/seinem Bau und möchte das Kleeblatt, das sich irgendwo im
Bau befindet, nach draußen befördern.
Karawelt - vorher
Fall 1
Karawelt - nachher
Karawelt - vorher
Fall 2
Karawelt - vorher
Fall 3
Problem - Blatt aus dem Bau tragen
11
Aufgabe:
Ergänze jeweils die fehlenden Teile.
Achte auf die Einrückungen, um die
verschiedenen Fälle deutlich zu
unterscheiden.
Lösungsverfahren
Schritt weitergehen
WENN auf einem Kleeblatt:
Kleeblatt aufheben
rechts drehen
rechts drehen
Schritt weitergehen
SONST:
Schritt weitergehen
WENN auf einem Kleeblatt:
...
SONST:
...
Kleeblatt hinlegen
Python-Programm
kara.move()
if kara.onLeaf():
kara.removeLeaf()
...
else:
kara.move()
if kara.onLeaf():
kara.removeLeaf()
...
else:
kara.move()
...
kara.putLeaf()
12
Problem - Blatt aus dem Bau tragen
Aufgabe:
Leistet das folgende Lösungsverfahren auch
das Gewünschte? Überprüfe das zunächst,
indem du es selbst (z.B. auf dem Papier)
durchspielst. Übersetze das Lösungsverfahren
anschließend in die Programmiersprache
Python und teste das entsprechende PythonProgramm.
Schritt weitergehen
WENN auf einem Kleeblatt:
Kleeblatt aufheben
rechts drehen
rechts drehen
SONST:
Schritt weitergehen
WENN auf einem Kleeblatt:
Kleeblatt aufheben
rechts drehen
rechts drehen
SONST
Schritt weitergehen
Kleeblatt aufheben
rechts drehen
rechts drehen
Schritt weitergehen
Schritt weitergehen
Schritt weitergehen
Kleeblatt hinlegen
Lösungsverfahren
Bedingung
13
Die Steuerung komplexerer Abläufe (wie Fallunterscheidungen und Wiederholungen) erfolgt
mit Hilfe von Bedingungen.
Die einfachsten Bedingungen, die mit Hilfe der Grandoperationen des Ausführsystems gebildet
werden, nennt man auch elementare Bedingungen.
Komplexere Bedingungen lassen sich mit Hilfe der logischen Operatoren not, and and or
aufbauen.
Operation
Bedeutung
treeFront()
Baum vorne?
treeLeft() Baum links?
treeRight()
Baum rechts?
mushroomFront() vor einem Pilz?
onLeaf()
auf einem Kleeblatt?
elementare Bedingung
komplexe Bedingung mit
logischem Operator
kara.treeFront()
True / False
not kara.treeFront()
True / False
Fallunterscheidung
14
Eine Fallunterscheidung dient dazu, alternative Abläufe zu beschreiben.
WENN [Bedingung]:
[Anweisungssequenz]
SONST:
[Anweisungssequenz]
zweiseitige
Fallunterscheidung
WENN [Bedingung]:
[Anweisungssequenz]
einseitige
Fallunterscheidung
Fallunterscheidung
15
Eine Fallunterscheidung dient dazu, alternative Abläufe zu beschreiben.
WENN [Bedingung]:
[Anweisungssequenz]
SONST:
[Anweisungssequenz]
WENN [Bedingung]:
[Anweisungssequenz]
zweiseitige
Fallunterscheidung
einseitige
Fallunterscheidung
Doppelpunkt
if [Bedingung]:
[Anweisungssequenz]
else:
[Anweisungssequenz]
if kara.treeFront():
kara.turnLeft()
else:
kara.move()
Schlüsselwort
Einrückung
if [Bedingung]:
[Anweisungssequenz]
if kara.onLeaf():
kara.removeLeaf()
kara.move()
16
Aufgabe:
(a) Kara weiß nicht, ob und wie
viele Kleeblätter sich in
ihrem/seinem Bau befinden. Kara
möchte sie alle einsammeln.
(b) Kara möchte den Bau mit
Kleeblättern auslegen. Es können
sich aber schon Kleeblätter in
einigen Feldern des Baus befinden.
Übungen
17
Teil 3
Wiederholungen
18
Problem - um eine Baumreihe laufen
Problem: Kara steht vor einer Baumreihe, weiß jedoch not, wie lang sie ist. Kara möchte um
die Baumreihe laufen und den Weg mit Blättern auslegen.
Karawelt - vorher
Karawelt - nachher
Problem - um eine Baumreihe laufen
19
Aufgabe:
Kannst du die Lösung vervollständigen. Welche Aktionen müssen wiederholt durchgeführt
werden? Welche Aktionen müssen vor der SOLANGE-Anweisung erfolgen, welche danach?
Versuche, das Lösungsverfahren in Python zu beschreiben. Beachte, dass man die zu
wiederholenden Anweisungen (um 4 Einheiten) einrücken muss. Teste das Programm
anschließend mit unterschiedlich langen Baumreihen.
Lösungsverfahren
...
SOLANGE ein Baumstumpf rechts steht:
...
...
Python-Programm
...
while kara.treeRight():
...
...
20
Problem - um eine Baumreihe laufen
Aufgabe:
Kara soll jetzt einmal ganz um eine Baumreihe laufen und den Weg mit Kleeblättern auslegen.
21
Wiederholung
Eine Wiederholung dient dazu, wiederholte Abläufe zu beschreiben.
SOLANGE [Bedingung]:
[Anweisungssequenz]
Wiederholung mit
Eintrittsbedingung
Bei der Ausführung einer SOLANGEAnweisung wird vor jedem
Wiederholungsdurchgang überprüft, ob
die Bedingung erfüllt ist. Ist das der Fall,
so werden die Anweisungen der
Anweisungssequenz ausgeführt und der
nächste Wiederholungsdurchgang kann
beginnen. Andernfalls wird die Ausführung
der Wiederholungsanweisung beendet.
Flussdiagramm /
Programmablaufplan
Wiederholung
22
Eine Wiederholung dient dazu, wiederholte Abläufe zu beschreiben.
SOLANGE [Bedingung]:
[Anweisungssequenz]
Wiederholung mit
Eintrittsbedingung
Python-Syntax
Schlüsselwort
Einrückung
Doppelpunkt
while [Bedingung]:
[Anweisungssequenz]
while kara.treeRight():
kara.putLeaf()
kara.move()
23
Schleifendurchläufe
while not kara.treeFront():
kara.putLeaf()
kara.move()
kein
Schleifendurchlauf
Endlosschleife:
unendlich viele
Schleifendurchläufe
Ist die Bedingung gleich zu Beginn nicht erfüllt, so
wird die Schleife überhaupt nicht durchlaufen. Die
Wiederholungsanweisung bewirkt dann gar nichts.
Ist die Bedingung vor jedem Schleifendurchlauf erfüllt,
so wird die Schleife (theoretisch) unendlich oft
durchlaufen. Man spricht dann auch von einer
Endlosschleife. In der Praxis muss man in einem
solchen Fall die Ausführung abbrechen.
24
Übungen
Aufgabe:
(a) Was leistet dieses Programm? Teste es mit
geeigneten Kara-Welten.
(b) Überlege dir, wie die Kara-Welt jeweils beschaffen
sein muss, damit einer der folgenden Sonderfälle
eintritt:
Die Schleife wird überhaupt nicht durchlaufen.
Kara gerät in eine Endlosschleife.
Aufgabe:
Worin besteht der Unterschied zwischen den
folgenden Programmen? Verdeutliche den
Unterschied anhand konkreter Situationen.
while not kara.treeFront():
kara.move()
while not kara.treeFront():
kara.move()
kara.putLeaf()
while not kara.treeFront():
kara.move()
kara.putLeaf()
25
Übungen
Aufgabe:
Kara steht im Eingang ihres/seines rechteckigen Baus. Kara soll in die hintere Ecke des Baus
(siehe Abbildung) laufen. Beachte, dass der Kara-Bau verschiedene ausmaße haben kann.
26
Übungen
Aufgabe:
Kara soll einmal um ihren/seinen Bau laufen und den Weg mit Kleeblättern auslegen. Aber
Achtung, der rechteckige Kara-Bau kann ganz unterschiedliche Ausmaße haben. Die Beispiele
zeigen zwei Möglichkeiten.
27
Teil 4
Algorithmen
Problem - Kleeblatt suchen
28
Problem: Kara ist auf der Suche nach einem Kleeblatt. Kara soll hierzu geradeaus weiterlaufen,
bis sie/er ein Kleeblatt gefanden hat. Aber, es befinden sich manchmal Baumstümpfe im Weg.
Kara muss diese Hindernisse dann umlaufen.
Karawelt - vorher
Karawelt - nachher
Aufgabe:
Entwickle zunächst ein Verfahren zur Lösung des Problems. Beschreibe das Verfahren in
Worten. Entwickle dann erst das zugehörige Programm.
Problembeschreibung
29
Die zu bearbeitenden Probleme sind oft allgemein in dem Sinne, dass viele konkrete
Problemsituationen möglich sind. Im dargestellten Beispiel sind viele verschiedene
Anordnungen von Baumreihen und von zu suchendem Kleeblatt denkbar. Häufig deuten wir
den allgemeinen Charakter eines Problems dadurch an, dass wir mehrere unterschiedliche
Problemsituationen wiedergeben.
Karawelt - vorher
Karawelt - nachher
Vor jeder Problembearbeitung sollte das zu lösende Problem möglichst klar beschrieben
werden. Wir benutzen hier ein Verfahren zur Problembeschreibung, das in vielen Bereichen der
Informatik angewandt wird. Wir beschreiben ein Problem mit Hilfe der Zustände, die das
betrachtete System (hier: Kara and ihre/seine Welt) vor und nach der Problembearbeitung
einnehmen soll.
Algorithmus
30
Ein Algorithmus ist eine Verarbeitungsvorschrift zur Lösung eines Problems, die so präzise
formuliert ist, dass sie (zumindest im Prinzip) auch von einer Maschine abgearbeitet werden
kann.
SOLANGE nicht auf einem Kleeblatt:
WENN vor einem Baum:
links drehen
Schritt weitergehen
rechts drehen
Schritt weitergehen
SOLANGE rechts ein Baum:
Schritt weitergehen
rechts drehen
Schritt weitergehen
links drehen
SONST:
Schritt weitergehen
Kleeblatt aufheben
Algorithmus
Karawelt - vorher
Karawelt - nachher
Programm
31
Ein Programm ist ein Algorithmus zur Lösung eines Problems, der in einer vorgegebenen
Programmiersprache verfasst ist.
SOLANGE nicht auf einem Kleeblatt:
WENN vor einem Baum:
links drehen
Schritt weitergehen
rechts drehen
Schritt weitergehen
SOLANGE rechts ein Baum:
Schritt weitergehen
rechts drehen
Schritt weitergehen
links drehen
SONST:
Schritt weitergehen
Kleeblatt aufheben
Algorithmus
while not kara.onLeaf():
if kara.treeFront():
kara.turnLeft()
kara.move()
kara.turnRight()
kara.move()
while kara.treeRight():
kara.move()
kara.turnRight()
kara.move()
kara.turnLeft()
else:
kara.move()
kara.removeLeaf()
Programm
Bausteine von Algorithmen
32
Dieser Algorithmus ist aus zahlreichen elementaren
Anweisungen, einer Entscheidungsanweisung sowie
zwei Wiederholungsanweisungen aufgebaut.
Besonders deutlich werden die Bausteine, wenn man
Algorithmen mit einer Bildsprache - den sogenannten
Struktogrammen - beschreibt.
Algorithmus
Struktogramme
33
Algorithmisches Problemlösen
Problem
beschreiben
Ideen
suchen and informell beschreiben
Algorithmus
präzisieren (z.B. mit Struktogrammen)
Algorithmus in ein Programm
übersetzen
Programm
testen
Kleeblatt suchen:
SOLANGE man nicht auf
einem Kleeblatt steht, macht
man Folgendes: WENN man
vor einem Baum steht, dann
muss man den Baum / die
Baumreihe umlaufen SONST
kann man einen Schritt
weitergehen. Zuletzt muss
man das Kleeblatt aufheben
while not kara.onLeaf():
if kara.treeFront():
kara.turnLeft()
kara.move()
kara.turnRight()
kara.move()
while kara.treeRight():
kara.move()
kara.turnRight()
kara.move()
kara.turnLeft()
else:
kara.move()
kara.removeLeaf()
34
Übungen
Aufgabe 1: Einen Algorithmus in Struktogrammform beschreiben (einfach)
Kara soll einmal um einen Baum laufen. Beachte, dass
Kara danach in derselben Position am Baum steht.
Aufgabe 2: Einen Algorithmus in Struktogrammform beschreiben (schwierig)
Kara merkt sich die Uhrzeit mit einem Pilz, der
schrittweise um einen Baum geschoben wird. Kara
soll hier den Pilz - egal, wo er sich zunächst befindet um einen Schritt weiterverschieben.
Jeder macht Fehler
35
Problem
beschreiben
Ideen
suchen and informell beschreiben
Fehler bei der Ideensuche
Häufig kommt es bereits bei der Ideensuche zu
Fehlern. Man glaubt, die entscheidende Idee
gefanden zu haben, hat aber etwas Wichtiges
übersehen.
Kleeblatt suchen:
SOLANGE nicht auf einem Kleeblatt, mache Folgendes:
WENN vor einem Baum, dann
Algorithmus
präzisieren (z.B. mit Struktogrammen)
den Baum / die Baumreihe umlaufen
anschließend einen Schritt weitergehen
das Kleeblatt aufheben
Algorithmus in ein Programm
übersetzen
Programm
testen
Jeder macht Fehler
36
Problem
beschreiben
Ideen
suchen and informell beschreiben
Algorithmus
präzisieren (z.B. mit Struktogrammen)
Algorithmus in ein Programm
übersetzen
Programm
testen
Fehler bei der Ablaufmodellierung
Bei der Ablaufmodellierung kann es vorkommen,
dass man die Bausteine zur Beschreibung des
Ablaufs nicht korrekt zusammenzusetzt.
Jeder macht Fehler
37
Problem
beschreiben
Ideen
suchen and informell beschreiben
Algorithmus
präzisieren (z.B. mit Struktogrammen)
Algorithmus in ein Programm
übersetzen
Programm
testen
Fehler bei der Implementierung
Bei der Übersetzung eines korrekten Algorithmus
in ein lauffähiges Programm kann es zu weiteren
Fehlern kommen. So kann man z.B. den
Doppelpunkt in der if-Anweisung vergessen, oder
eine Anweisung nicht richtig einrücken.
while not kara.onLeaf():
if kara.treeFront()
kara.turnLeft()
kara.move()
kara.turnRight()
kara.move()
while kara.treeRight():
kara.move()
kara.turnRight()
kara.move()
kara.turnLeft()
else:
kara.move()
kara.removeLeaf()
38
Übungen
Aufgabe 3: Fehler suchen
Kara soll die Kleeblätter, die als Rechteck ausgelegt sind, alle einsammeln.
T. hat das folgende Programm zur
Lösung des Problems entwickelt.
while kara.onLeaf():
kara.removeleaf()
kara.move()
kara.turnRight()
while kara.onLeaf():
kara.removeleaf()
kara.move()
kara.turnRight()
while kara.onLeaf():
kara.removeleaf()
kara.move()
kara.turnRight()
while kara.onLeaf():
kara.removeleaf()
kara.move()
kara.turnRight()
(a) Teste erst einmal das Programm. Es erscheint
direkt eine Fehlermeldung. Welchen syntaktischen
Fehler hat T. gemacht?
(b) Korrigiere den Fehler und teste erneut das
Programm. Es leistet noch nicht das Gewünschte.
Irgend etwas stimmt mit den Einrückungen noch
nicht. Kannst du diesen Fehler auch noch beheben?
(c) Wenn du den Einrückfehler verbessert hast, dann
leistet das Programm immer noch nicht das
Gewünschte. Der Algorithmus, der dem Programm zu
Grunde liegt, ist noch nicht in Ordnung. Kannst du
das auch noch korrigieren?
(d) Wenn du ein korrekt arbeitendes Programm hast,
dann stelle den zu Grunde liegenden Algorithmus in
Struktogrammform dar.
39
Teil 5
Logische Operatoren
Problem - Kleeblatt suchen
40
Problem: Kara befindet sich in einem Baumlabyrinth und möchte zum Ausgang laufen. Hier
liegt (zur Belohnung) ein Kleeblatt.
Wie kann man systematisch aus einem Labyrinth herauslaufen? Die folgenden Aufgaben
weisen dir einen Weg zur Lösung des Labyrinth-Problems. Du kannst natürlich auch
versuchen, das Problem selbstständig zu lösen.
Karawelt vorher
Karawelt nachher
Linke-Hand-Strategie
41
Aufgabe: Kennst du die Linke-Hand-Strategie (Rechte-Hand-Strategie): Man läuft so weiter,
dass die linke (rechte) Hand immer die Labyrinthbegrenzung berührt.
(a) Probiere die Linke-Hand-Strategie selbst einmal aus.
(b) Welchen Weg würde Kara in den drei oben gezeigten Labyrinthen laufen, wenn sie/er die
Linke-Hand-Strategie systematisch anwendet?
Karawelt vorher
Karawelt nachher
Aufgabe: Wie soll Kara sich nach der Linken-Hand-Strategie verhalten, wenn eine der
folgenden Situationen vorliegt:
Situation 1: links ein kein Baum
Situation 2: links ist ein Baum und Kara steht nicht vor einem Baum
Situation 3: links ist ein Baum und Kara steht vor einem Baum
42
Verhaltensbeschreibung
Aufgabe: Wir beschreiben den Algorithmus zur Linken-Hand-Strategie mit einem
Struktogramm. Gehe nach den Situationsbeschreibungen oben vor und ergänze die fehlenden
Bedingungen.
Übersetze den Algorithmus in die Programmiersprache Python. Hier auch eine Auswahl an
Vorschlägen zur Übersetzung der Bedingungen. Die richtigen Übersetzungen sind auch dabei.
kara.onLeaf()
not kara.onLeaf()
not kara.treeLeft()
kara.treeLeft()
not kara.treeLeft() and not kara.treeFront()
kara.treeLeft() and kara.treeFront()
kara.treeLeft() and not kara.treeFront()
kara.treeLeft() or kara.treeFront()
Wahrheitswerte / logische Operatoren
43
Zur Beschreibung von Werten von Bedingungen benutzt man die Wahrheitswerte wahr and
falsch bzw. True and False. Logische Operatoren werden benötigt, um Bedingungen
zusammenzusetzen.
SOLANGE nicht (links ein Baum und rechts ein Baum):
Schritt weitergehen
a
not a
a
b
a and b
a
b
a or b
False
True
False
False
False
False
False
False
True
False
False
True
False
False
True
True
True
False
False
True
False
True
True
True
True
True
True
True
nicht
Negation
Konjunktion
und
Disjunktion
oder
44
Übungen
Aufgabe:
Kara befindet sich irgendwo in
ihrem/seinem rechteckigen Bau. Kara
will zum Ausgang des Baus laufen.
(a) Welche Bedingung ist erfüllt, wenn Kara im Ausgang des Baus steht?
(b) Wie kann Kara diesem Ausgang finden? Tipp: Erst einmal geradeaus laufen, bis ..., dann
evtl. mit der Linken-Hand-Strategie den Ausgang suchen.
(c) Entwickle eine Lösung in Struktogrammform und übersetze sie dann in die
Programmiersprache Python. Teste das Programm mit verschiedenen Ausgangssituationen..
45
Teil 6
Problemzerlegung
Problem - Fußballfeld auslegen
46
Problem: Kara will ein Fußballfeld mit Kleeblättern auslegen. Die Eckpfosten stehen schon.
Karawelt vorher
Karawelt nachher
Das Problem ist recht komplex. In solch einer Situation ist es meist günstig, das Problem in
geeignete Teilprobleme zu zerlegen.
Teilprobleme - Fußballfeld auslegen
47
Teilproblem:
"zur Ausgangsposition laufen"
Teilproblem: "Kleeblattreihe bis zum
nächsten Baum legen"
Teilproblem:
"um einen Pfosten laufen"
Aufgabe:
Welche weiteren Teilprobleme kann man
festlegen, wenn das Innere des Spielfelds mit
Kleeblättern ausgelegt werden soll?
48
Teillösungen zusammensetzen
Aufgabe:
(a) Wo befindet sich Kara nach der Ausführung des gezeigten Algorithmus?
(a) Wie kann man ihn fortsetzen, so dass auch das Spielfeldinnere mit Kleeblättern ausgelegt
wird?
Algorithmus FussballfeldAuslegen:
zur Ausgangsposition laufen
Kleeblattreihe bis zum nächsten Baum
um einen Pfosten laufen
Kleeblattreihe bis zum nächsten Baum
um einen Pfosten laufen
Kleeblattreihe bis zum nächsten Baum
um einen Pfosten laufen
Kleeblattreihe bis zum nächsten Baum
um einen Pfosten laufen
...
legen
legen
legen
legen
49
Teillösungen zusammensetzen
# Unterprogramme
...
def zurAusgangpositionLaufen():
kara.move()
kara.turnRight()
kara.move()
kara.turnLeft()
# Hauptprogramm
def kleeblattreiheBisBaumLegen():
while not kara.treeFront():
kara.putLeaf()
kara.move()
kara.putLeaf()
def umPfostenLaufen():
kara.turnRight()
kara.move()
kara.turnLeft()
kara.move()
kara.turnRight()
...
zurAusgangpositionLaufen()
kleeblattreiheBisBaumLegen()
umPfostenLaufen()
kleeblattreiheBisBaumLegen()
umPfostenLaufen()
kleeblattreiheBisBaumLegen()
umPfostenLaufen()
kleeblattreiheBisBaumLegen()
umPfostenLaufen()
Aufgabe:
(a) Schaue dir das Programm zunächst
genau an. Kannst du den Aufbau erklären?
Teste anschließend das Programm.
(b) Versuche, das Programm um weitere
Unterprogramme so zu ergänzen, dass auch
das Spielfeldinnere mit geeigneten neuen
Befehlen ausgelegt werden kann.
50
Teile and herrsche
Teile and 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.
Algorithmus FussballfeldAuslegen:
zur Ausgangsposition laufen
Kleeblattreihe bis zum nächsten Baum
um einen Pfosten laufen
Kleeblattreihe bis zum nächsten Baum
um einen Pfosten laufen
Kleeblattreihe bis zum nächsten Baum
um einen Pfosten laufen
Kleeblattreihe bis zum nächsten Baum
um einen Pfosten laufen
...
legen
legen
legen
legen
Unterprogramm
51
Ein Unterprogramm ist eine eigenständige Programmeinheit zur Lösung eines Teilproblems.
Unterprogrammdeklaration
# vorher:
# Kara sieht (in einiger Entfernung) vor sich
einen Baum.
# nachher:
# Kara hat den gesamten Weg bis zum Baum
mit Kleeblättern ausgelegt.
def kleeblattreiheBisBaumLegen():
while not kara.treeFront():
kara.putLeaf()
kara.move()
kara.putLeaf()
...
kleeblattreiheBisBaumLegen()
...
Unterprogrammaufruf
Vorteile von Unterprogrammen:
Unterprogramme tragen dazu bei,
Programme übersichtlich zu gestalten
Unterprogramme dienen dazu, CodeDuplizierungen zu vermeiden
52
Übungen
Aufgabe:
Was leistet dieses Unterprogramm? Teste
sein Verhalten. Ändere anschließende
den Unterprogrammnamen so, dass er
das Verhalten des Unterprogramms
besser wiedergibt.
def p():
if kara.treeFront():
kara.turnLeft()
kara.move()
kara.turnRight()
kara.move()
kara.move()
kara.turnRight()
kara.move()
kara.turnLeft()
else:
kara.move()
Aufgabe:
(a) Erstelle und teste ein Unterprogramm
umdrehen, das Kara um 180° dreht.
(b) Innerhalb von
Unterprogrammdeklarationen kann man
bereits deklarierte Unterprogramme
aufrufen. Probiere das einmal aus.
(c) Erstelle ein Unterprogramm, das Kara
einen Schritt zurückgehen lässt.
# Unterprogramme
def umdrehen():
...
def drehen():
umdrehen()
umdrehen()
# Hauptprogramm
drehen()
53
Übungen
Aufgabe:
Kara soll um einen Baum herum und wieder zurück zur Ausgangsposition laufen. Zerlege das
Problem in Teilprobleme. Entwickle zur Lösung der Teilprobleme passende Unterprogramme
und mit diesen eine Lösung des Gesamtproblems.
54
Übungen
Aufgabe:
Kara soll die Kleeblätter, die sich in ihrem/seinem Bau befinden, alle einsammeln.
Zerlege das Problem in Teilprobleme. Entwickle passende Algorithmen und Unterprogramme
zur Lösung der Teilprobleme und mit diesen Teillösungen eine Lösung des Gesamtproblems.
55
Teil 7
Algorithmen mit Variablen
56
Problem - Kleeblätter zählen
Problem: Kara soll alle Kleeblätter auf dem Weg zu einem Baum einsammeln und sie vor dem
Baum der Reihe nach auslegen.
Karawelt - vorher
setze zaehler auf 0
SOLANGE nicht vor einem Baum:
WENN auf einem Kleeblatt:
erhöhe zaehler um 1
Kleeblatt aufheben
einen Schritt weitergehen
...
Karawelt - nachher
zaehler = 0
while not kara.treeFront():
if kara.onLeaf():
zaehler = zaehler + 1
kara.removeLeaf()
kara.move()
...
Aufgaben:
Wie könnte man den Algorithmus zur Lösung des Problems fortsetzen? Versuche auch, das
Programm fertigzustellen.
Kara soll jetzt alle Blätter auf dem Weg zum Baum einsammeln und anschließend die doppelte
Anzahl von Blättern vor dem Baum auslegen.
57
Variablen
Variablen dienen in der Informatik dazu, Daten zu verwalten. Eine Variable ist ein Name, der
(in der Regel) mit einem Datenwert verknüpft ist.
Variable
Wert
zaehler
3
Variablenzustand
Kurzschreibweise
{zaehler -> 3}
Zuweisung
58
Eine Veränderung eines Variablenwerts bzw. des zugehörigen Speicherzelleninhalts kann mit
Hilfe einer Zuweisung an die entsprechende Variable erfolgen.
Zuweisungszeichen
zaehler = zaehler + 1
Zustand - vorher
{zaehler -> 0}
zaehler = zaehler + 1
Auswertung
zaehler ->
Variable
Term
Aufbau einer Zuweisung:
Eine Zuweisung besteht aus einer
Variablen (der ein Wert zugewiesen wird)
and einem Term (der den zuzuweisenden
Wert festlegt).
{zaehler -> 1}
1
Zustand - nachher
Auswertung einer Zuweisung:
Erst wird der Wert des Terms mit Hilfe
des aktuellen Variablenzustands ermittelt.
Dieser Wert wird dann der Variablen als
neuer aktueller Wert zugewiesen.
59
Zählschleife
Bei einer Zählschleife wird vor der Ausführung festgelegt, wie oft die Anweisungen wiederholt
werden sollen.
WIEDERHOLE 10 mal:
Schritt weitergehen
zaehler = 0
SOLANGE zaehler < 10:
Schritt weitergehen
zaehler = zaehler + 1
anzahl = ...
# Zählvariable initialisieren
zaehler = 0
SOLANGE zaehler < anzahl:
[Anweisung(en)]
# Zählvariable aktualisieren
zaehler = zaehler + 1
Beispiel
Realisierung mit einer
Solange-Anweisung und
einer Zählvariablen
Muster
60
Datentyp
Ein Datentyp beschreibt eine Menge von Datenobjekten, die alle die gleiche Struktur haben
und mit denen die gleichen Operationen ausgeführt werden können.
Kara soll zum Eingang des Baus laufen
und sich im Eingang genau so oft drehen,
wie Schritte zum Erreichen des Baus
erforderlich sind.
# Unterprogramm
def imEingang():
if kara.treeLeft() and kara.treeRight:
ergebnis = True
Wahrheitswert
else:
...
ergebnis = False
# Hauptprogramm
return ergebnis
ganze Zahl
abstand = 0
def drehen():
while not imEingang():
kara.turnLeft()
kara.move()
kara.turnLeft()
abstand = abstand + 1
kara.turnLeft()
while abstand > 0:
kara.turnLeft()
drehen()
...
abstand = abstand - 1
61
Übungen
Aufgabe:
Kara steht im Eingang ihres/seines Baus. Kara soll um den Bau laufen und die Stelle mit einem
Kleeblatt markieren, die sich gegenüber dem Baueingang befindet.
62
Übungen
Aufgabe:
Kara soll ein Spielfeld mit vorgegeben Maßen (z.B. 6x4) mit Hilfe von Kleeblättern abstecken.
63
Übungen
Aufgabe:
Kara steht im Eingang ihres/seines Baus und schaut hinein. Kara soll die Ausmaße ihres/seines
Baus bestimmen und draußen im Freien den Bau mit Kleeblättern nachlegen.