http://cgd.zum.de/api.php?action=feedcontributions&feedformat=atom&user=Hoeherl033ComeniusWiki - Benutzerbeiträge [de]2024-03-29T12:14:26ZBenutzerbeiträgeMediaWiki 1.21.2http://cgd.zum.de/wiki/Programmieren_lernen_mit_Robot_KarolProgrammieren lernen mit Robot Karol2014-03-12T12:43:23Z<p>Hoeherl033: /* Übungsaufgaben */</p>
<hr />
<div>== Das Programm ==<br />
<br />
<br />
{|<br />
|width=800px|<br />
Robot Karol ist eine Programmierumgebung mit einer Programmiersprache, die zum Erlernen des Programmierens und zur Einführung in die Algorithmik in der Schule gedacht ist. Das Programm ist Freeware und kann über den Link [http://www.schule.bayern.de/karol/download.htm Karol] heruntergeladen werden.<br />
|width=20px|<br />
|width=300px | <br />
|}<br />
<br />
<br />
===Die Oberfläche===<br />
<br />
<br />
{|<br />
|width=800px|<br />
Die Programmoberfläche von Karol ist zweigeteilt: Auf der linken Seiten befindet sich der sogenannte Editor, in dem die Programme geschrieben werden. Auf der rechten Seite ist Karols Welt, in der das verfasste Programm ausgeführt werden kann.<br />
|width=20px|<br />
|width=300px | <br />
|}<br />
<br />
=== Objekte ===<br />
{|<br />
|width=800px|<br />
In Karos Welt gibt es einige Objekte, die von Karo verteilt und wieder eingesammelt werden können.<br />
<br />
<br />
* Ziegel<br />
<br />
:Karol kann Ziegel vor sich hinlegen. Sollte vor ihm bereits ein Ziegel liegen, wird der nächste Ziegel auf den anderen drauf gelegt. <br><br />
:Wenn Karol vor einem Ziegel steht und einen Schritt macht, steigt er auf den Ziegel. Allerdings kann er nicht über 2 Ziegel auf einmal steigen.<br> <br />
:Das heißt um auf einen 2er Ziegelturm zu kommen, muss er über einen davorliegenden einzelnen Ziegelstein "klettern".<br> <br />
<br />
* Marke<br />
<br />
:Marken werden direkt auf das Feld unter Karol gelegt. Sie dienen zur Orientierung und haben keinen Einfluss auf Karols <br><br />
:Bewegungsmöglichkeiten; er kann einfach darüber laufen. Im Gegensatz zu Ziegeln können nicht mehrere Marken übereinander gestapelt werden. <br><br />
<br />
*Quader<br />
<br />
:Quader versperren Karol den Weg. Er kann nicht über sie gehen. Außerdem lassen sie sich nicht stapeln.<br />
<br />
<br />
<br />
[[Datei:ObjekteKarol.png]]<br />
|width=20px|<br />
|width=300px | <br />
|}<br />
<br />
=== Die Bewegungmöglichkeiten von Karol ===<br />
<br />
<br />
{|<br />
|width=800px|<br />
Die Bewegungsmöglichkeiten von Karol sind recht übersichtlich. Mit den angegebenen Anweisungen kann das entsprechende Verhalten gesteuert werden. <br />
|width=20px|<br />
|width=300px | <br />
|}<br />
<br />
<br />
{| class="wikitable "<br />
|- style="background: #DDFFDD;"<br />
! Verhalten<br />
! Anweisung<br />
|-<br />
| ein Schritt vorwärts<br />
| '''Schritt'''<br />
|-<br />
| eine Vierteldrehung nach links<br />
| '''LinksDrehen'''<br />
|-<br />
| eine Vierteldrehung nach rechts<br />
| '''RechtsDrehen'''<br />
|-<br />
| einen Ziegel vor sich hinlegen<br />
| '''Hinlegen'''<br />
|-<br />
| einen Ziegel vor sich entfernen<br />
| '''Aufheben'''<br />
|-<br />
| eine gelbe Marke unter sich legen<br />
| '''MarkeSetzen'''<br />
|-<br />
| eine gelbe Marke unter sich entfernen<br />
| '''MarkeLöschen'''<br />
|}<br />
<br />
<br />
=== Karols Welt ===<br />
{|<br />
|width=800px|<br />
Auf der rechten Seite der Karoloberfläche befindet sich Karols Welt. Durch Aufruf von ''Welt - Neue Welt'' kann die gewünschte Ausdehnung der neuen Welt festgelegt werden. Wenn die Ausgangsposition vom Standardstartpunkt (1,1) abweicht oder Hindernisse zur von Karol zu lösenden Welt gehören, dann empfiehlt es sich, die Welt über ''Welt - Welt speichern'' mit der Endung '''.kdw''' abzuspeichern.<br />
[[Datei:KarolsWelt.JPG]]<br />
|width=20px|<br />
|width=300px | <br />
|}<br />
<br />
<br />
<br />
== Erste Programme ==<br />
<br />
<br />
{|<br />
|width=800px|<br />
Das Programm "Robot Karol" ermöglicht es uns, dem Roboter, der sich in seiner Welt bewegen und Aufgaben erfüllen kann, Anweisungen zu geben.<br />
{{Kasten_blass|Durch eine '''Anweisung''' (z.B. "Schritt") sendet man eine Botschaft an ein '''Objekt''' (z.B. Karol), das darauf mit der zugehörigen '''Methode''' reagiert (z.B. Schritt() ). }}<br />
<br />
|width=20px|<br />
|width=300px | <br />
|}<br />
<br />
<br />
'''Aufgabe'''<br><br />
Karol soll eine U-Form abschreiten<br><br />
<br />
'''Lösung'''<br />
<br />
{|class="wikitable"<br />
|-style="background:#DDFFDD;"<br />
! umgangssprachlich formuliert<br />
! Karolprogramm<br />
|-<br />
|<br />
* 2 mal vorwärts<br />
* Linksum<br />
* 2 mal vorwärts<br />
* Linksum<br />
* 2 mal vorwärts<br />
|<br />
Schritt<br><br />
Schritt<br><br />
LinksDrehen<br><br />
Schritt<br><br />
Schritt<br><br />
LinksDrehen<br><br />
Schritt<br><br />
Schritt<br><br />
|}<br />
<br />
<br />
{|<br />
|width=800px|<br />
Eine solche Folge von Anweisungen bezeichnet man als '''Algorithmus'''.<br />
{{Kasten_blass|<br />
Ein '''Algorithmus''' ist eine endliche Folge aus eindeutigen und ausführbaren Anweisungen zur Lösung eines allgemeinen Problems.<br><br />
Ein '''Programm''' ist ein Algorithmus, der in einer formalisierten Sprache abgefasst ist und maschinell ausgeführt werden kann.}}<br />
|width=20px|<br />
|width=300px | <br />
|}<br />
<br><br />
'''Aufgaben:'''<br />
{|<br />
|width=800px|<br />
# Karol soll ein Rechteck ablaufen und am Ende wieder in der Ausgangsposition stehen. <br />
# Damit man besser erkennt, ob Karol auch ein „U“ durchläuft, soll er dabei Marken setzen. Es soll also eine „U-Form mit Markierungen“ gebildet werden. <br />
# Karol soll vier Ziegel in einer Reihe nebeneinander legen. <br />
|width=20px|<br />
|width=300px | <br />
|}<br />
<br />
[[Lösungen Abschnitt Erste Programme|Lösungsvorschlag]]<br />
<br />
<br />
== Selbstdefinierte Methoden ==<br />
<br />
{|<br />
|width=800px|<br />
Die Fähigkeiten von Karol können durch neue, zusätzliche Methoden erweitert werden. Diese selbstdefinierten Anweisungen müssen vorher vom Programmierer festgelegt werden.<br />
Neue Methoden beginnen stets mit dem Wort '''Anweisung''' und dann mit dem '''Bezeichner''' der Methode. Es folgt eine Sequenz von Anweisungen, die beim Aufruf der Methode abgearbeitet werden. Die Festlegung der Methode endet mit dem Schlüsselwort '''*Anweisung'''.<br />
<br><br />
<br />
'''Beispiel 1:''' Neue Methode '''Umdrehen'''<br />
<br><br />
<pre><br />
Anweisung Umdrehen<br />
LinksDrehen<br />
LinksDrehen<br />
*Anweisung<br />
</pre><br />
<br><br />
'''Aufgabe:''' Karol soll einen Schritt rückwärts gehen.<br />
''(Die Lösung greift nun auf die Anweisung '''Umdrehen''' zu.)''<br />
<br><br />
<pre><br />
Anweisung Umdrehen <br />
LinksDrehen <br />
LinksDrehen <br />
*Anweisung <br />
<br />
Programm <br />
Umdrehen <br />
Schritt <br />
Umdrehen <br />
*Programm<br />
</pre><br />
<br><br />
'''Aufgaben'''<br />
# Bringe Karol mittels einer selbstdefinierten Anweisung bei, einen Riesenschritt auf einmal zu vollführen, der so groß wie drei normale Schritte ist.<br />
# Bringe Karol den Rösslsprung bei, wie ihn die Springerfigur beim Schach ausführt. Erstelle ein Programm, so dass Karol mehrere Rösslsprünge ausführt und nach jedem Sprung eine Marke setzt.<br><br />
[[Bild:Screenshot_Roesselsprung.JPG]]<br />
<br><br />
[[Lösungsvorschlag Selbstdefinierte Methoden|Lösungsvorschlag]]<br />
|width=20px|<br />
|width=300px | <br />
|}<br />
<br />
<br />
== Parameter ==<br />
Mit Hilfe eines '''Parameters''' oder '''Übergabewertes''' können wir Programme flexibler gestalten, ohne ganze Programmteile neu schreiben zu müssen. Beispielsweise können wir das Programm<br />
<pre><br />
Schritt<br />
Schritt<br />
Schritt<br />
Hinlegen<br />
Hinlegen<br />
Hinlegen<br />
</pre><br />
kürzer schreiben als<br />
<pre><br />
Schritt(3)<br />
Hinlegen(3)<br />
</pre><br />
Wir übergeben dabei in der Klammer hinter dem Methodenaufruf die Anzahl der Wiederholungen. Neben ''Schritt'' und ''Hinlegen'' kann man auch ''Aufheben'' mit einem Parameterwert verwenden.<br />
<br />
<br />
Parameter können auch im Zusammenhang mit selbstdefinierten Anweisungen verwendet werden:<br />
<pre><br />
Anweisung Seite(X)<br />
Schritt(X)<br />
LinksDrehen<br />
*Anweisung<br />
<br />
Seite(5)<br />
Seite(3)<br />
Seite(5)<br />
Seite(3)<br />
</pre><br />
Mit dieser Anweisung können wir Karol ein Rechteck beliebiger Größe bauen lassen, in diesem Fall ein Rechteck der Größe 3x5. Zu beachten ist, dass als Parameter in Anweisungen grundsätzlich '''X''' zu verwenden ist.<br />
<br />
<br />
'''Aufgabe 1:''' Karol soll mit Hilfe von Anweisungen mit Parameterwert einen Irrgarten bauen.<br />
<br />
== Wiederholung mit fester Anzahl ==<br />
{|<br />
|width=800px|<br />
'''Aufgabe:'''<br />
Karol soll vier Ziegel in einer Reihe hintereinander legen.<br><br />
Erste Lösung durch sequentielles Anschreiben der Anweisungen:<br />
<pre><br />
Hinlegen<br />
Schritt<br />
Hinlegen<br />
Schritt<br />
Hinlegen<br />
Schritt<br />
Hinlegen<br />
Schritt<br />
</pre><br />
Bei größerer Zahl von Wiederholungen erweist sich das Ganze als ungünstig.<br />
'''Bessere Lösung:''' Wiederholung mit fester Anzahl<br />
<br />
<br />
<span style="font-size:12pt;">'''Wiederholung mit fester Anzahl'''</span><br><br />
Die Anweisungen im Wiederholungsteil werden nacheinander mehrfach ausgeführt (entsprechend der angegebenen Anzahl).<br><br />
Sprache Karol:<br />
<pre><br />
wiederhole n mal <br />
Anweisungen <br />
*wiederhole<br />
</pre><br />
<br />
Die günstigere Lösung für unsere Aufgabe sieht dann wie folgt aus:<br />
<pre><br />
wiederhole 4 mal<br />
hinlegen<br />
schritt<br />
*wiederhole<br />
</pre><br />
<br />
'''Aufgabe 1:''' Karol soll mit Ziegeln ein Quadrat auslegen.<br />
<br />
[[Bild:Screenshot_Quadrat.JPG]]<br />
<br />
<br />
<span style="font-size:12pt;">'''Geschachtelte Wiederholung'''</span><br><br />
<br />
'''Beispiel:''' Karol soll einen Quadratrand auslegen.<br />
<br />
[[Bild:Screenshot_Quadratrand.JPG]]<br />
<br />
'''Lösung'''<br />
<br />
<pre><br />
wiederhole 4 mal<br />
wiederhole 3 mal<br />
Hinlegen<br />
Schritt<br />
*wiederhole<br />
LinksDrehen<br />
*wiederhole<br />
</pre><br />
Der Quadratrand besteht aus vier Seiten (äußere Schleife). Jede Seite besteht wiederum aus drei Ziegeln (innere Schleife).<br />
<br />
<br />
<br><br />
'''Aufgabe 2'''<br><br />
Karol soll eine Welt [8x8] vollständig mit Kacheln auslegen. Schreibe dazu ein<br />
Programm, das Anweisungen für das Umdrehen und geschachtelte Wiederholungen<br />
enthält. Überlege dir zuerst eine Strategie zur Lösung der Aufgabe, bei der du sie in Teilprobleme zerlegst.<br />
<br />
[[Lösungsvorschlag Wiederholung mit fester Anzahl|Lösungsvorschlag]]<br />
|width=20px|<br />
|width=300px | <br />
|}<br />
<br />
== Wiederholung mit Anfangsbedingung ==<br />
<br />
{|<br />
|width=800px|<br />
Bestimmte Problemstellungen lassen sich mit den bisherigen Methoden und Kontrollstrukturen<br />
nicht zufrieden stellend bearbeiten. Die Lösung der Aufgabe „Gehe bis zur nächsten<br />
Wand“ hängt von der Startposition Karols ab. Um unabhängig von der Ausgangsstellung zu<br />
sein, muss Karol eine Methode kennen, die eine Anfrage, ob er noch weitergehen kann, mit<br />
WAHR oder FALSCH beantwortet. Der Aufruf derartiger Methoden wird mit „Bedingung“<br />
umschrieben.<br><br />
<br />
<br />
{{Kasten_blass|Karol hat auch Methoden, mit denen er auf eine Anfrage mit WAHR oder<br />
FALSCH antwortet. Der Aufruf einer Methode dieser Art heißt '''Bedingung'''.}}<br />
<br />
Von Karol vorgegebene Bedingungen sind: '''IstWand, NichtIstWand, IstZiegel, NichtIstZiegel,'''<br />
'''IstMarke, NichtIstMarke, IstSüden, IstNorden, IstOsten, IstWesten.'''<br />
<br />
Bei der Bedingung '''IstZiegel''' ist auch ein Parameterwert möglich, d.h. man kann z.B. eine Anweisung nur dann durchführen lassen, wenn zwei Ziegel vor Karol liegen (''wenn istZiegel(2) dann Anweisung'')<br />
<br />
'''Aufgabe:''' Karol soll, solange er nicht an eine Wand anstößt, vorwärts gehen.<br />
<br />
<br />
Er muss den Vorgang „Schritt“ solange wiederholen, bis er auf die Frage '''NichtIstWand''' mit<br />
WAHR antwortet, da man die Anzahl der möglichen Schritte nicht im Voraus kennt. Sie ist<br />
von der Ausgangsposition Karols abhängig.<br />
<br />
<br />
'''Lösung:''' Wiederholung mit Anfangsbedingung<br />
<br />
Die Anweisungen im Wiederholungsteil werden so oft wiederholt, solange<br />
die Bedingung WAHR ergibt. Die Überprüfung der Bedingung erfolgt am<br />
Anfang jeder Wiederholung.<br />
<br />
Sprache Karol:<br />
<pre><br />
wiederhole solange Bedingung<br />
Anweisungen<br />
*wiederhole<br />
</pre><br />
<br />
'''Aufgabe 1:'''<br><br />
Karol soll in einer rechteckigen Welt von einer Ecke aus genau einmal um die Welt<br />
herumlaufen und seine Strecke dabei mit Ziegeln belegen.<br />
<br />
'''Aufgabe 2:'''<br><br />
Wie Aufgabe 1. Aber nun soll Karol an einem beliebigen Ort an der Wand starten.<br />
<br />
[[Lösungsvorschlag Wiederholung mit Anfangsbedingung|Lösungsvorschlag]]<br />
|width=20px|<br />
|width=300px | <br />
|}<br />
<br />
== Zweiseitige bedingte Anweisung ==<br />
<br />
{|<br />
|width=800px|<br />
Das Programm für die Lösung der Aufgabe ''"Karol soll von einem beliebigen Punkt an der Wand<br />
aus einmal an der Wand entlang genau eine Runde laufen und dabei seine Ziegel hinlegen"'', lässt<br />
sich dadurch vereinfachen, dass wir ihn bei jedem Schritt entscheiden lassen, was er als nächstes<br />
tut:<br><br />
Solange er nicht an der Wand anstößt macht er jeweils einen Schritt. Stößt er an der Wand an<br />
dreht er sich nach links. Der Vorteil ist, dass wir nicht mehr anzugeben brauchen, wie oft Karol<br />
sich drehen muss, bis er seine Runde absolviert hat.<br />
<br />
'''Bedingte Anweisung (zweiseitig):'''<br><br />
In Abhängigkeit davon, ob die Bedingung erfüllt wird oder nicht, werden die<br />
Anweisungen1 bzw. die Anweisungen2 ausgeführt.<br />
<br />
Sprache Karol:<br />
<pre><br />
wenn Bedingung dann<br />
Anweisungen1<br />
sonst<br />
Anweisungen2<br />
*wenn<br />
</pre><br />
<br />
'''Aufgabe 1:'''<br><br />
Das Beispielprogramm "Karol soll von einem beliebigen Punkt an der Wand aus einmal an der<br />
Wand entlang genau eine Runde laufen und dabei seine Ziegel hinlegen" soll in ein Programm<br />
mit einer bedingten Anweisung umgewandelt und dadurch vereinfacht werden.<br />
<br />
'''Aufgabe 2:'''<br><br />
Wie Aufgabe 1, nur dass Karol von einem beliebigen Feld in der Welt startet und auch wieder an<br />
seinen Ausgangspunkt zurückkehrt.<br><br />
a) Lösung ohne Verwendung der bedingten Anweisung.<br><br />
b) Lösung unter Verwendung der bedingten Anweisung.<br />
<br />
'''Aufgabe 3:'''<br><br />
a) Karol hat eine Reihe von Ziegelsteinen vor sich. Dort wo ein Stein liegt, soll er ihn wegnehmen, dort wo keiner liegt, soll er einen Stein hinlegen.<br><br />
b) Nun soll Karol das Ganze 4 mal wiederholen, wobei er jeweils an der Wand entlang zurückgehen und zu seinem Ausgangspunkt zurückkehren soll.<br />
<br />
|width=20px|<br />
|width=300px | <br />
|}<br />
<br />
[[Lösungsvorschlag Zweiseitige bedingte Anweisung|Lösungsvorschlag]]<br />
<br />
<br />
== Einseitige bedingte Anweisung ==<br />
<br />
<br />
{|<br />
|width=800px|<br />
'''Aufgabe:'''<br><br />
Karol soll eine lückenhafte Ziegelreihe auffüllen, bis er an der Wand<br />
ankommt. Vor jedem Schritt muss er nur dann einen Ziegel legen, wenn<br />
vor ihm keiner liegt. Falls bereits ein Ziegel vor ihm liegt, geschieht nichts.<br />
<br />
'''Bedingte Anweisung (einseitig):'''<br />
Wenn die Bedingung WAHR ergibt, werden die Anweisungen ausgeführt.<br />
<br />
Sprache Karol:<br />
<pre><br />
wenn Bedingung dann<br />
Anweisungen<br />
*wenn<br />
</pre><br />
<br />
Lösung der obigen Aufgabe:<br><br />
<br />
<pre><br />
wiederhole solange NichtIstWand<br />
wenn NichtIstZiegel dann<br />
Hinlegen<br />
*wenn<br />
Schritt<br />
*wiederhole<br />
</pre><br />
<br />
'''Aufgabe:'''<br><br />
In einer Welt (9x8) sind 15 Marken beliebig verteilt. Karol soll von einem beliebigen<br />
Startpunkt ausgehend, alle Marken mit Ziegelsteinen belegen und dabei keine Marke<br />
vergessen. Teste das Programm mit verschiedenen Startpunkten von Karol.<br />
<br />
[[Lösungsvorschlag Einseitige bedingte Anweisung|Lösungsvorschlag]]<br />
|width=20px|<br />
|width=300px | <br />
|}<br />
<br />
<br />
==Übungsaufgaben==<br />
<br />
'''Aufgabe 1'''<br />
<br />
<br />
Baue in einer Welt (11x11) eine Schleife mit einem 1 Feld breiten Gang, durch den Karol gehen kann. Am Ende soll Karol auf einer Marke stehen.</div>Hoeherl033