Automaten und Programmieren wichtiges, anfänglich auch einfaches Konzept der Informatik, vor allem der theoretischen Informatik, Stoff 5. Klasse Lichtschalter: Schaltet Licht ein und aus: Zwei Zustände Ein Schalter: Wirkung des Schalters hängt von dem Ausgangszustand ab und beeinflusst den Folgezustand Getränkeautomat: einfachste Form: Knöpfe für Wahl des Getränks, Schlitz zum Einwerfen der Münzen, es ist uns im Normalfall gleichgültig, wie der Automat funktioniert, Geldrückgabe Im folgenden Beispiel ein einfacher Automat, der 50 c und 1 € - Münzen annimmt (akzeptiert), wozu Sensoren nötig sind, die feststellen, um welche Münze es sich handelt, der außerdem zwei Getränke zur Wahl anbietet und keinen Resetknopf besitzt. 1€ 0,0 50c 0,5 50c 1,0 50c 1,5 1€ Cola Fanta Übungen für Schüler: 1.1 a) 50 c, 1 € und 2 € Münzen b) mehrere verschieden teure Getränke c) Resetknopf d) Extrazucker, kein Becher beim Kaffeautomaten 1.2 Caps-Lock- (Feststell-) Taste 1.3 Waschmaschine (Vorspülen ja/nein, 3 Temperaturen, Schleudern ja/nein) 1.4 Ganglichtschalter 1.5 Markise, die gesteuert von Windmesser und Sonnenfühler den Motor betätigt 1.6 Warnblinklampe, die bei geschlossener Autotür und laufendem Moter auf den nicht verwendeten Sicherheitsgurt hinweist 1.7 Warnsirene, die bei offener Autotür und aufgedrehten Scheinwerfern alarmiert Automat ist im wesentlichen eine Blackbox, was innen passiert, ist im Normalfall egal; Zustände: Speichern sozusagen, was schon passiert ist, ein definierter Startzustand, zumindest ein Endzustand, muss nicht erreicht werden Knöpfe zur Eingabe der Zeichen (Buchstaben eines Alphabets), wobei immer nur 1 Knopf gedrückt sein kann, Mittels der Knöpfe werden Übergänge von einem Zustand zu einem anderen ausgelöst als Ausgabe zumindest eine Möglichkeit, zu informieren, ob ein Wort bestehend aus Zeichen vom Anfangszustand zu einem Endzustand führt Endliche Automaten besitzen eine endliche Anzahl von Zuständen sowie ein endliches Alphabet E. Hopfenwieser 1/9/ Einstieg in das Programmieren Professionelle Programmierumgebungen eignen sich im Unterricht nur schlecht für erste Schritte im Programmieren. Die Bedienung der Programmierumgebung, das Zusammenspiel der verschiedenen Komponenten wie Programmeditor, Compiler, Debugger oder Bibliotheken ist nicht auf Anhieb verständlich. Für Einsteiger ist auch die Syntax gängiger Programmiersprachen wie C/C++ oder Java alles andere als intuitiv. Und mit dem Einzug objektorientierter Programmierung stellt sich im Unterricht eine weitere Herausforderung: Die Kernideen objektorientierter Programmierung sind auf das Programmieren im Grossen ausgerichtet und liegen außerhalb des Erfahrungsbereichs von Schüler/innen und Schülern. Kurz und gut: Professionelle Programmiersprachen und Programmierumgebungen sind für die ersten Programme im Unterricht wenig geeignet. Wie soll der Einstieg ins Programmieren erfolgen? Es ist den folgenden Anforderungen Rechung zu tragen: • Programmiersprache mit kleinem, rasch überblickbarem Sprachumfang • Visuelle Darstellung des Programmablaufs • Konkrete, anschauliche Problemstellungen • Problemstellungen, die nur zu einem geringen Teil aus der Mathematik stammen Programmieren mit Hilfe von Automaten: geeignet für die 5. Klasse (aber auch schon für jüngere Schüler) http://www.educeth.ch/informatik/karatojava/ Kara basiert auf dem Konzept endlicher Automaten, ist alltagsnah und trotzdem ein theoretisch fundiertes und mächtiges Programmiermodell. Verschiedene Programmierumgebungen (Kara, MultiKara, TuringKara, JavaKara, Lego Mindstorms) eröffnen spielerische Zugänge zu grundlegenden Programmierkonzepten mit unterschiedlichem Schwierigkeitsgrad für allgemeinbildende Schulen bis hin zu Diplomstudiengängen in der Informatik. Kara ist vor allem für Schüler/innen gedacht, die gar keine oder nur sehr wenig Programmiererfahrung haben. Auf spielerische Art und Weise machen sich die Schüler/innen mit fundamentalen Ideen der Programmierung vertraut. Kara wird erfolgreich auf verschiedenen Schulstufen (Berufsbildende Schulen, Gymnasien, Fachhochschulen etc.) eingesetzt. Lernziele beim Einsatz von Kara - Grundlagen der Programmierung. Mit endlichen Automaten kann eine der fundamentalen Ideen von Algorithmen einfach illustriert werden. Ein Programm ist die Spezifikation eines eindeutig bestimmten zeitlichen Ablaufes von Ereignissen - analog zum Regieplan in einem Theater. Die Abläufe müssen auch auf externe Ereignisse reagieren können. Um ein korrektes Systemverhalten zu garantieren, braucht es eine statische Spezifikation, welche die korrekten Abläufe von der noch viel größeren Vielfalt E. Hopfenwieser 2/9/ - der inkorrekten Abläufe trennt. Kara illustriert diese grundlegende Idee an einfachen Beispielen. Zudem lassen sich auch Konzepte wie Boole'sche Aussagenlogik und Programmverifikation (Pre-Conditions, Invarianten etc.) aufzeigen. Modell der endlichen Automaten. Endliche Automaten sind eines der einfachsten Berechnungsmodelle der Informatik. Mit ihnen kann das Verhalten vieler aus dem Alltag bekannter Automaten beschrieben werden. Kara veranschaulicht das Konzept endlicher Automaten. Um die Kara-Umgebungen laufen zu lassen, benötigen Sie Java J2SE (Java 2 Standard Edition) Version 1.2 oder neuer. Dieses gibt es in zwei Varianten: Das Java Runtime Environment (JRE) dient dazu, Java-Programme auszuführen; das SDK (Software Development Kit) beinhaltet den Compiler, um Java-Programme zu entwickeln. Das SDK enthält das JRE. Um Kara, MultiKara oder TuringKara zu starten, benötigen Sie das Java Runtime Environment (JRE); für JavaKara benötigen Sie das SDK. Sun bietet das JRE und das SDK für diverse Plattformen an: http://java.sun.com/j2se/downloads.html Es gibt 2 Oberflächen: Beide enthalten alle Umgebungen sowie zu jeder Umgebung eine Anzahl unterschiedlich schwerer Aufgaben. allkara.jar beinhaltet zusätzlich auch die Lösungen zu den Aufgaben, allkara-x.jar enthält keine Lösungen. Auf den meisten Plattformen können Sie nach der Installation des JRE oder des SDK die Programme durch Doppelklicken auf die allkara.jar-Datei starten. Bei den ersten Programmierschritten sollte nicht die relativ komplexe Syntax einer Sprache im Vordergrund stehen. Die Schüler/innen sollen sich zu Beginn auf das Wesentliche konzentrieren: auf das Denken in Abläufen, auf die Logik und Korrektheit ihrer Programme. Um dieses Ziel zu erreichen, kann man das Programmiermodell sehr stark einschränken und statt einer allgemeinen Programmiersprache endliche Automaten benutzen. Diese Idee hat verschiedene Vorteile: Die Komplexität von endlichen Automaten ist deutlich geringer als die Komplexität allgemeiner Programmiersprachen. Das ist gerade für den Einstieg ins Programmieren ein nicht zu unterschätzender Vorteil! Der Speicher in Form von Zuständen erübrigt die Deklaration von Variablen und Datenstrukturen. Endliche Automaten begegnen uns im Alltag laufend und können etwa am Beispiel eines Geldautomaten anschaulich erklärt werden. Ein endlicher Automat verknüpft den Speicher (seine Zustände) mit der Kontroll-Logik (die Zustandsübergänge). Will der Programmierer einen endlichen Automaten für ein gegebenes Problem erstellen, ist seine Arbeit einfacher, wenn er am Anfang alle Zustände des Automaten gedanklich erfasst, die bei der Lösung des Problems auftreten könnten. Er wird so ermutigt, die Aufgabe „ganzheitlich“ anzugehen. Dieses Vorgehen steht im Gegensatz zur „konventionellen“ Programmierung. Dort werden Anfänger oft verleitet, Programme zeilenweise „drauflos zu hacken“ und zusätzliche Variablen, Funktionen etc. schrittweise einzuführen. Bei diesem Vorgehen vermischt der Programmierer die Phasen der Problemanalyse und der eigentlichen Programmierung. Beim Erstellen der endlichen E. Hopfenwieser 3/9/ Automaten muss die Analyse vor der Programmierung erfolgen – was auch für Schüler/innen mit Programmiererfahrung eine lehrreiche Erfahrung ist. Kara ist ein Marienkäfer [Reichert 2000], der in einer einfachen grafischen Welt auf dem Bildschirm lebt. Karas Programme werden rein grafisch mit der Maus als endliche Automaten erstellt. Der Vorteil davon ist, dass jedes erstellte Programm sofort gestartet werden kann, weil keine Syntaxfehler wie fehlende Strichpunkte auftreten können. So wird die Einarbeitungszeit kurz gehalten. Wie sich bei mehreren Einführungskursen bestätigt hat, können Anfänger/innen typischerweise innerhalb von nur einer Stunde mit der Programmierumgebung von Kara so gut umgehen, dass sie sich auf das Lösen von anspruchsvolleren Aufgaben konzentrieren können. Die Oberfläche: Kara kennt nur wenige Befehle: einen Schritt vorwärts machen, auf dem aktuellen Feld um 90° nach links oder nach rechts drehen, ein Kleeblatt hinlegen oder aufnehmen. Damit Kara programmiert werden kann, verfügt er über Sensoren, mit deren Hilfe er seine unmittelbare Umgebung wahrnimmt. Kara kann bei jedem Zustandsübergang eine beliebige (konstante) Anzahl von Befehlen ausführen, in Abhängigkeit von den aktuellen Sensorenwerten: E. Hopfenwieser 4/9/ Stehe ich vor einem Baumstumpf? Ist links neben mir ein Baumstumpf? Ist rechts neben mir ein Baumstumpf? Stehe ich vor einem Pilz? Stehe ich auf einem Kleeblatt? Das ist alles, was Kara über die Welt weiß. Er weiß nicht, auf welchem Feld er steht oder in welche Himmelsrichtung er schaut. Natürlich könnte man Kara mit mehr Sensoren ausrüsten. Aber die vorhandenen fünf Sensoren reichen aus, um viele interessante und anspruchsvolle Aufgaben zu lösen. Da Kara seine Umgebung nicht nur wahrnimmt, sondern auch die Fähigkeit hat, sie zu verändern, kann er die Umgebung als externen Speicher benutzen. Die Programmierung: Am Anfang muss geklärt werden, welche Zustände vorkommen können, welche Sensoren eingesetzt werden müssen und welche Übergänge es daher geben muss. Man kann Sensoren zu einem Zustand auswählen, wenn man den Zustand erzeugt, bzw. wenn man ihn bearbeitet. E. Hopfenwieser 5/9/ Die Programmierung erfolgt bei Entscheidungen über die Abfrage der Sensoren. Diese können die Werte Yes, No bzw. Yes or No melden. Die Auswahl trifft man durch wiederholtes Anklicken. Zusätzlich kann man vom linken Rand noch einige Befehle in die Zeile ziehen und schließlich muss man nur noch festlegen, welcher Zustand als nächstes folgt. Programmierung von Schleifen erfolgt über die Rückkehr zu früheren Zuständen. Beispiele mit unterschiedlichem Schwierigkeitsgrad von leicht bis mittelschwer: 2.1. Kara läuft in einer bestimmten Welt auf einem vorgegebenen Weg und muss dabei alle Kleeblätter aufheben. 2.2. Kara läuft solange, bis sie vor einem Baum, auf einem Blatt steht. 2.3. Kara läuft solange, bis sie auf das zweite Blatt gelaufen ist. 2.4. Kara muss ein Muster invertieren. Sie läuft auf Kleeblättern, liegt ein Kleeblatt, so wird es aufgehoben, andernfalls hingelegt. Bei einem Baum endet der Weg! Erschwerung: In der Reihe darunter sollen dann die Kleeblätter in genau der gleichen Anordnung liegen 2.5. Kara muss ein Muster legen. Jedes 2. Feld in einer Reihe soll ein Kleeblatt enthalten. 2.6. 2 Reihen sollen versetzt mit Kleeblättern belegt sein. 2.7. Kara soll in einem (nicht notwendigerweise geraden) Tunnel aus Bäumen entlang laufen. 2.8. Kara soll an einem (nicht notwendigerweise geraden) Zaun aus Bäumen unendlich lang entlang laufen. 2.9. Kara soll an einer Baumreihe entlang laufen, bis sie zu einer Lücke kommt, dann soll sie wieder auf den Ausgangsplatz zurücklaufen. (Mit einem Kleeblatt markieren! Dabei dürfen keine Kleeblätter auf ihrem Weg liegen, da sie sonst den Ausgangspunkt nicht wieder findet.) 2.10. Kara soll aus einem sehr einfachen Labyrinth herausfinden. es sind lauter waagrechte Abgrenzungen aus Bäumen, bei denen jeweils ein Lücke ist um in die nächsthöhere Zone zu gelangen. Am Beginn steht sie in der untersten Reihe und schaut hinauf, der Ausgang aus dem Labyrinth ist ganz oben (Diese ist zuerst immer ein Feld breit, später können es auch unterschiedlich viele Felder sein) 2.11. Kara soll auf einer rechteckigen Lichtung, die völlig von Bäumen umgeben ist, ein Kleeblatt finden. 2.12. In der Spalte ganz links stehen lauter Bäume, in den nächsten drei Spalten verteilt Pilze und zwar genau einer pro Reihe. Kara soll alle Pilze vor die Bäume schieben. 2.13. Kara wird zur Slalomfahrerin: Vor ihr stehen einzelne Bäume in einer geraden Reihe mit Lücken. Sie beginnt mit einem "Rechtsschwung" Alles in allem sind das sehr gute Übungen für die Kombination von Schleifen und Abfragen. Das Verständnis der Schüler für Algorithmik wird an diesen einfachen Problemen außerordentlich geschult, wie ich aus Versuchen berichten kann. Beim Programm Kara sind einige dieser Übungen ohne und mit Lösungen enthalten sowie eine Menge weiterer, auch schwierigerer! E. Hopfenwieser 6/9/ Einstiege in das Programmieren mit einer Programmiersprache (eventuell 5., besser 6. Klasse) Programmieren beschäftigt sich im weiteren Sinn mit Methoden und Denkweisen bei der Lösung von Problemen mit Hilfe von Computern und im engeren Sinn mit dem Vorgang der Programmerstellung. Denken, Problem lösen kann mit den bereits vorgestellten Algorithmen geübt werden, in weitere Folge wird man aber auf „richtige“ Programmierung übergehen wollen und müssen. Die folgenden Beispiele verwenden graphische Hilfsmittel, um dem Schüler die Auswirkungen der Programme vorzuführen. Alle Programme beruhen auf der Idee von Richard E. Pattis aus dem Jahr 1981: „A Gentle Introduction to the Art of Programming“ Das Grundkonzept besteht darin, eine Figur (Roboter, Hamster, Käfer) so zu programmieren, dass er in einer zwei- oder dreidimensionalen Welt Aufgaben erledigt. Der Befehlssatz ist dabei klarerweise sehr eingeschränkt und es gibt keine Ein- und Ausgabe von Zahlen oder Zeichen. Es ist aber sehr anschaulich, macht Burschen und Mädchen gleichermaßen viel Spaß und grenzt die Schüler, die mathematisch nicht so begabt sind, nicht aus, wie das leicht passiert, wenn man, wie oft üblich, vorwiegend mathematische Beispiele bringt. Dabei gibt es einige nennenswerte Möglichkeiten: • Robot Karol • Java Hamster • KaraToJava Bei allen drei Programmen gilt, dass es jeweils zwei zusammengehörige Files geben sollte, da das Programm ja zu einer bestimmten Umgebung passen muss. Es ist aber auch möglich, mehrere Welten abzuspeichern, die zu einer bestimmten Problemstellung passen. Alle drei stehen im Internet frei zur Verfügung. Robot Karol: Programmiersprache deutsch („Wiederhole“), es gibt beim Programm eine Übersicht aller Befehle und Strukturen. Man kann Programme schrittweise abarbeiten lassen wie „Kara mit endlichen Automaten“; es ist aber auch möglich, das Programm vollständig ablaufen zu lassen Die Welt kann zwei- und dreidimensional dargestellt werden. Für den Roboter Karol gibt es ein Vielzahl von Einstellungen. Programmteile können durch die Angabe des Befehls „schnell“ auch sehr schnell (Schnelldurchlauf) ausgeführt werden. Trenner: Lücken, neue Zeile oder „;“, Kommentare: { } Fertige Programmteile können in einer Bibliothek abgespeichert werden Das slowakische Programm wurde von Uli Freiberger ins Deutsche übertragen. http://www.schule.bayern.de/karol/ 3.1. Karol läuft in einer bestimmten Welt auf einem vorgegebenen Weg und muss dabei alle Ziegel aufheben. 3.2. Karol läuft solange, bis er vor einem Ziegel, auf einer Marke steht. 3.3. Karol läuft solange, bis er auf die zweite Marke gelaufen ist. 3.4. Karol muss ein Muster invertieren. Er läuft auf Marken, liegt eie Marke, so wird sie gelöscht, andernfalls gesetzt. Bei einem Ziegel endet der Weg! Erschwerung: In der Reihe darunter sollen dann die Marken in genau der gleichen Anordnung liegen 3.5. Karol muss ein Muster legen. Jedes 2. Feld in einer Reihe soll eine Marke enthalten. 3.6. 2 Reihen sollen versetzt mit Ziegeln belegt sein. E. Hopfenwieser 7/9/ 3.7. Karol soll in einem (nicht notwendigerweise geraden) Tunnel aus Ziegeln entlang laufen. 3.8. Karol soll an einer (nicht notwendigerweise geraden) Mauer aus Ziegeln lang entlang laufen. 3.9. Karol soll an einer Baumreihe entlang laufen, bis er zu einer Lücke kommt, dann soll er wieder auf den Ausgangsplatz zurücklaufen. (Einer Marke setzen! Dabei dürfen keine Marken auf ihrem Weg sein, da sie sonst den Ausgangspunkt nicht wieder findet.) 3.10. Karol soll aus einem sehr einfachen Labyrinth herausfinden. es sind lauter waagrechte Abgrenzungen aus Ziegeln, bei denen jeweils ein Lücke ist um in die nächsthöhere Zone zu gelangen. Am Beginn steht er in der untersten Reihe und schaut hinauf, der Ausgang aus dem Labyrinth ist ganz oben (Diese ist zuerst immer ein Feld breit, später können es auch unterschiedlich viele Felder sein) 3.11. Karol soll auf einer rechteckigen Lichtung, die völlig von Ziegeln umgeben ist, eine Marke finden. 3.12. Karol wird zum Slalomfahrer: Vor ihm stehen Ziegel in einer geraden Reihe mit Lücken. Bei einem Stoß aus 2 Ziegeln läuft er rechtsherum, bei einem einzigen Ziegel läuft er links herum. Bei drei oder mehr Ziegeln bleibt er stehen. Java Hamster und KaraJava: Beide Programme führen spielerisch in das Programmieren mit Java ein. Bei beiden ist es möglich, Abfragen, Schleifen und Methoden ohne oder mit Parameterübergabe zu programmieren. Es steht die komplexe Java-Syntax und natürlich auch alle Datentypen zur Verfügung. Daher ist die Syntax englisch, das Programm muss abgespeichert und kompiliert werden und es gibt keine Einzelschrittausführung. Die Verwendung von Booleschen und Integer-Variablen sowie von Zufallsfunktionen ist ganz natürlich, für die Verwendung von Fließkommazahlen ist es schon bedeutend schwieriger, Beispiele zu finden. Das Programm Java Hamster stammt vom deutschen Informatiker Dietrich Boles und ist im Internet frei erhältlich. Dietrich Boles verwendet es an der Universität Oldenburg zur Ausbildung von Programmieranfängern. Es gibt nur die 4 Befehle vor(), linksUm(), nimm(), gib() sowie die „Testbefehle“ vornFrei(), maulLeer(), kornDa(). Das Buch von Boles „Programmieren spielend gelernt mit dem Java-Hamster-Modell“ enthält einen ausgezeichneten, didaktischen Aufbau und zahlreiche Übungsbeispiele zu den Konzepten der imperativen Programmierung (Anweisungen und Programme, Prozeduren und Kontrollstrukturen, Variablen und Ausdrücke und Rekursionen). Boles möchte eine Fortsetzung herausgeben, die Objekte, Klassen, Arrays, Vererbungsmechanismen, Polymorphismus und dynamisches Binden sowie Grundlagen der parallele Programmierkonzepte mit Prozessen bzw. Threads Interprozesskommunikationm Synchronisation und Schedulingmechanismen beinhaltet. Es soll im Frühjahr 2004 erscheinen. Da bei Boles nur so wenige Befehle existieren, ist die Ausführung der Programme oft nicht so einfach zu überblicken, was die Anschaulichkeit verringert. http://www-is.informatik.uni-oldenburg.de/~dibo/hamster/ KaraToJava benötigt im Allgemeinen keine Installation. Wie beim Java Hamster muss Java installiert sein, man muss KaraToJava jedoch nicht installieren, es reicht das File allKara(x).jar anzuklicken. Für Schüler zu Hause dürfte es daher etwas leichter sein. Das Programmieren ist für Schüler aber etwas komplexer. Schon allein vom Anblick her wirkt es wesentlich schwieriger, aber auch wesentlich „java-näher“; man macht auch wesentlich häufiger Syntaxfehler. Kara ist ein Objekt mit den entsprechenden Attributen und Methoden. Die Befehle lauten daher kara.move (), kara.turnRight(), ..., Wahrheitswerte analog kara.onLeaf(), kara.mushroomFront() usw.. E. Hopfenwieser 8/9/ Der Befehlssatz ist etwas komplexer als beim Java Hamster, da es z. B. Abfragen gibt, ob sich links oder rechts oder vorne ein Baum befindet, dadurch fällt allerdings die sich sehr zwanglos ergebende Notwendigkeit weg, selbst entsprechende Funktionen zu programmieren. Leider kann man viele der Übungen aus dem Buch zum Java Hamster nicht nachvollziehen, da Kara stets nur ein Blatt auf ein Feld legen kann und analog nur ein Blatt aufheben kann, andrerseits aber beliebig viele Blätter mit sich tragen kann, wodurch einige gute Beispiele, die beim Java Hamster möglich waren, wegfallen. Auf der Homepage findet man eine Reihe schöner Beispiele bis hin zu Rekursionen. Die Programmautoren Reichert u. a. haben im September 2003 ein Buch herausgebracht: „Programmieren mit Kara. Ein spielerischer Zugang zur Informatik“ http://www.educeth.ch/informatik Nach der Phase des Kennenlernens und Einübens der Syntax, der Schulung der Problemanalyse und der Problemlösefähigkeiten erfolgt der Umstieg auf „normales“ Java, wobei ich das Buch „Sprechen Sie Java“ von Prof. Hanspeter Mössenböck, Uni Linz, erwähnen muss. Mössenböck umgeht die anfänglichen Probleme bei der Ein- und Ausgabe von Daten durch Einführung von zwei neuen Klassen, In und Out. Mit Hilfe der Klasse In kann von der Tastatur und von Files eingelesen werden; es können Zeichen, Strings, Integer und Long Integer sowie Float und Double Zahlen, aber auch Boolean Werte, Zeilen oder ganze Files eingelesen werden. Die Ausgabeklasse Out stellt die entsprechenden Ausgabemethoden für Standardausgabe oder Files zur Verfügung. Beide liefern auch einen Boolean-Wert zurück, der über den Erfolg des Befehls informiert und für das Exception Handling verwendet werden kann. Mössenböck bespricht in seinem Buch auch die dynamischen Datenstrukturen, die mir ein besonderes Anliegen sind und auf jeden Fall Stoff im Wahlpflichtfach sein sollten, wobei ich in einer schwachen, langsamen Gruppe lediglich die Konzepte präsentiert habe, ohne es im Programm umzusetzen. Selbstverständlich sind in seinem Buch auch die Kapitel der Vererbung, der Threads und der Ausnahmebehandlung enthalten. E. Hopfenwieser 9/9/