TigerJython4Kids | HomeTurtlegrafikRobotikDatenbanken |
DU LERNST HIER... |
|
PROGRAMMSTRUKTUR SEQUENZ |
Ein Computerprogramm besteht aus einer Folge von Programmzeilen, die der Reihe nach (als Sequenz) abgearbeitet werden. Damit du die Käferbefehle verwenden kannst, musst du mit from cpglow import * das Modul cpglow importieren.
Die Befehle werden grundsätzlich Englisch geschrieben und enden immer mit einer Parameterklammer. Diese kann weitere Angaben für den Befehl enthalten. Die Gross-/Kleinschreibung musst du exakt einhalten. Mit forward() bewegt sich der Käfer einen Schritt vorwärts in der aktuellen Bewegungsrichtung. Bei Programmstart zeigt die Bewegungsrichtung nach oben. Mit left(90) dreht der Käfer um 90 Grad nach links und mit right(90) um 90° nach rechts. Dies macht sich aber erst beim nächsten forward()-Befehl bemerkbar. Mit deinem Programm zeichnet der Käfer die daneben abgebildete Spur:
Du kannst das Programm eintippen oder aus der Vorlage kopieren. Dazu klickst du auf In Zwischenablage kopieren und fügst es mit Ctrl+V in das TigerJython-Fenster ein.
|
WIEDERHOLUNG MIT REPEAT |
from cpglow import * makeGlow() repeat 4: forward() forward() left(90) |
Achte auf eine korrekte Einrückung! from cpglow import * makeGlow() setPos(-2, -2) repeat 4: repeat 4: forward() right(90) |
FUNKTIONEN (BENANNTE PROGRAMMBLÖCKE) |
Mit benannten Programmblocks, in Python Funktionen genannt, machst du deine Programme übersichtlicher. Zudem kannst du Funktionen mehrmals aufrufen. Die Verwendung von Funktionen ist von grosser Wichtigkeit, denn du vermeidest dadurch, dass du gleichen Code mehrmals im Programm hinschreiben musst (Codeduplikation) und du kannst Probleme in kleinere Probleme zerlegen.
Wähle als Funktionsnamen einen Bezeichner, dass etwas darüber aussagt, was die Funktion macht. Du darfst keine Spezialzeichen (Leerschläge, Umlaute, Akzente, Satzzeichen, usw.) verwenden. Beginne den Namen immer mit einem kleinen Buchstaben. Im folgenden Programm definierst du eine Funktion square(), die ein Quadrat zeichnet, und führst sie dann aus. from cpglow import * makeGlow() def square(): repeat 4: forward() forward() left(90) square()
from cpglow import * makeGlow() def square(): repeat 4: forward() forward() left(90) setSpeed(80) repeat 4: square() right(90) |
VARIABLEN |
Dazu verwendest du den Befehl v = v + 20, der auf den ersten Blick wie eine unsinnige Gleichung aussieht, aber dem Computer sagt, er soll den bestehenden Wert von v holen und 20 dazu zählen, und nachher das Resultat wieder in v abspeichern. Der Befehl showTrace(False) bewirkt, dass der Käfer keine Spuren hinterlässt. from cpglow import * makeGlow() def square(): repeat 4: forward() forward() right(90) v = 30 showTrace(False) setPos(-1, -1) repeat 4: setSpeed(v) square() v = v + 20 |
WIEDERHOLUNG MIT WHILE |
Die while-Schleife ist eine der wichtigsten Programmstrukturen überhaupt. Sie kann allgemein für jede Art von Wiederholungen verwendet werden und kommt in praktisch allen Programmiersprachen vor. Eine while-Schleife wird mit dem Schlüsselwort while eingeleitet gefolgt von einer Bedingung und einem Doppelpunkt. So lange die Bedingung erfüllt ist, werden die Befehle im nachfolgenden Programmblock wiederholt. Umgangssprachlich würde man dies wie folgt ausdrücken: Solange die Bedingung wahr, führe aus ... In der Bedingung werden in der Regel die Vergleichsoperatoren < (kleiner), <= (kleiner-gleich), > (grösser) >= (grösser-gleich), == (gleich), != (verschieden) verwendet. Beachte die Verdoppelung des Gleichheitszeichens beim Test auf Gleichheit (damit es nicht mit einer Zuweisung verwechselt wird).
from cpglow import * makeGlow() setSpeed(90) showTrace(False) a = 0 while a <= 360: forward() forward() back() back() left(45) a = a + 45
from cpglow import * makeGlow() def square(): repeat 4: forward() forward() left(90) clear() setSpeed(90) showTrace(False) setPos(2, 0) left(45) while True: square() |
WIEDERHOLUNG MIT FOR IN RANGE |
Mit for x in range(-2, 3) durchläuft also x die Werte -2, -1, 0, 1, 2. Dabei werden die LEDs in der obersten Reihe nacheinander eingeschaltet. Mit sleep(500) kannst du die Programmausführung 500 Millisekunden anhalten, damit du den Ablauf besser beobachten kannst. from cpglow import * makeGlow() clear() for x in range(-2, 3): setPos(x, 2) sleep(500) |
IF - ELSE - STRUKTUR (SELEKTION) |
Mit der Selektion kannst du bewirken, dass bestimmte Programmblöcke nur unter gewissen Bedingungen ausgeführt werden. Die Selektion wird mit dem Schlüsselwort if eingeleitet, gefolgt von einer Bedingung. Die Anweisungen im if werden nur dann ausgeführt, wenn die Bedingung wahr ist, sonst werden die Anweisungen nach else ausgeführt. In der if-Bedingung werden üblicherweise die Vergleichsoperatoren >, >= , < , <= , == , != verwendet. Die Anweisungen im if- bzw. else-Block müssen eingerückt sein. Der else-Teil kann auch wegfallen.
from cpglow import * makeGlow() right(90) x = 0 showTrace(False) while True: forward() x = x + 1 if x == 3: setPos(-2, 0) x = -2 Im nächsten Programm soll der Käfer zufällig zwei Schritte vorwärts oder zwei Schritte rückwärts laufen, dann kurz anhalten, die Spur löschen und an die Anfangsposition zurückkehren. Diese Bewegung soll er 10 Mal wiederholen.
from cpglow import * from random import randint makeGlow() setSpeed(80) repeat 10: r = randint(0, 1) if r == 1: forward() forward() else: back() back() sleep(300) clear() setPos(0, 0) |
MERKE DIR... |
Die grundlegenden Programmstrukturen sind Sequenz, Wiederholung und Selektion. Bei einer Sequenz werden die Befehle der Reihe nach abgearbeitet. Mit einer Wiederholung werden Programmblocks mehrmals ausgeführt. Im TigerJython kannst du dazu die repeat-; while- oder for-Schleifen verwenden. Die Selektion mit if und else bewirkt, dass bestimmte Anweisungen nur unter gewissen Bedingungen ausgeführt werden. Der else-Teil kann auch entfallen. Funktionen sind wichtig für die strukturierte Programmierung. Sie vermeiden die Codeduplikation und dienen dazu, Probleme in kleinere Teilprobleme zu zerlegen. Man spricht auch von Modularisierung. |
ZUM SELBST LÖSEN |
|
Das Keyword repeat gehört nicht zur Syntax von Python, sondern wurde speziell in TigerJython eingebaut, damit schon sehr früh, d.h. vor der Einführung von Variablen, Wiederholstrukturen möglich sind. Diese werden als ganz natürlich empfunden, denn auch im Alltag spricht man davon, eine Aktion n-mal zu wiederholen.
Will man zu Python kompatibel bleiben, so kann später repeat n: immer durch
for i in range(n):
ersetzt werden.
Endlosschleifen können durch Weglassen der Zahl der Wiederholungen, also mit
repeat:
eingeleitet werden.
Der Variablenbegriff ist von grundlegender Bedeutung, aber eine didaktische Herausforderung.
Es gibt im Wesentlichen drei verschiedene methodische Ansätze. Da wir bei der micro:bit-Robotik Variablen nur in einfachen Zusammenhängen verwenden, wählen wir den pragmatischen Einsatz.
Low-Level-Modell | Vorteile | Nachteile |
Eine Variable wird wie im Maschinecode/Assembler als ein reservierter Hauptspeicherplatz angesehen, der über seine Adresse angesprochen wird |
Anschaulicher Bezug zur Maschinenstruktur |
Adressen sind zwar im Assembler, C/C++ und anderen Programmiersprachen mit Zeigern (Pointer) wichtig, spielen aber in in der Praxis bei vielen anderen Programmiersprachen nur noch eine untergeordnete Rolle oder sind sogar verpönt |
Boxmetapher | Vorteile | Nachteile |
Eine Variable wird als eine Box- (oder Schublade) aufgefasst, die mit einem Namen angeschrieben ist und in der sich der Wert befindet
|
Eine Variable wird als eine Box- (oder Schublade) aufgefasst, die mit einem Namen angeschrieben ist und in der sich der Wert befindet |
Die Box kann auch leer sein, eine Variable hat aber immer einen Wert.
Die Box kann auch mehrere Dinge enthalten, eine Variable aber nicht.
Das Boxmetapher ist für Python falsch, da eine Variable hier immer eine Referenz auf ein Objekt ist (auch für Zahlen) |
Pragmatischer Ansatz | Vorteile | Nachteile |
Variablen sind Bezeichner für einen Wert, der verändert werden kann. Es gibt also einen Bezug oder eine Verbindung (engl. bindung) zwischen dem Namen (Alias) und ihrem Wert (der irgendein Datentyp sein kann) |
Der Ansatz entspricht der intuitiven Auffassung von Namen: "Hans ist ein Bezeichner für eine Person". Man "verliert" keine Zeit mit problematischen Erklärungen |
Man bleibt vage, was die Implementierung der Variablen (das Speichermodell) angeht |