Ein Computer ist zunächst einfach mal eine Maschine, die wahnsinnig schnell arbeiten (rechnen) kann. Damit man zum Beispiel ein Spiel spielen können, muss irgend jemand dem Computer also sagen, was er denn genau zu tun hat. Jemand muss also ein Computerprogramm, oder Code, schreiben. Dieses besteht aus Befehlen, die der Computer auszuführen hat. Damit der Computer auch versteht, was er machen soll, müssen Programmierer und Computer 'die gleiche Sprache' sprechen. Es gibt sehr viele unterschiedliche solche Programmiersprachen mit unterschiedlichen Anwendungsbereiechen und Vor- und Nachteilen.
Wir wählen hier die Programmiersprache Python. Im Jahre 2020 ist diese Sprache sicher in der Top 3 der wichtigsten Programmiersprachen - wenn nicht sogar auf dem ersten Platz. Dazu kommt, dass Python im Vergleich zu anderen Sprachen, z.B. C++ (C Plus Plus), Java oder C# (C Sharp) relativ einfach zu erlernen ist.
Wenn wir einen Satz mit vielen Schreibfelern und Grammatikfehler lesen, so sind wir meist trotzdem in der Lage, den Satz zu verstehen. Im Gegensatz zu uns hat ein Computer aber keine Intelligenz und ist deshalb nicht in der Lage, einen Text selbst zu interpretieren. Ein Computer kann ein Programm nur ausführen, wenn es gar keine Fehler, sogenannte Bugs, hat. Es ist deshalb ganz wichtig, dass man sich an die formalen Vorgaben der Programmiersprache hält.
Wie gesagt werden wir in der Programmiersprache Python programmieren. Wir brauchen aber noch ein Programm, um unseren Code zu schreiben und auszuführen, eine sogenannte IDE (Integrated Development Environment, auf Deutsch Entwicklungsumgebung). Typischerweise sind Entwicklungsumgebungen Programme, die man auf seinem Computer installiert. Mittlerweile gibt es aber auch zahlreiche Online-Entwicklungsumgebungen, mit denen man arbeiten kann. Wir werden zuerst mit einer solchen arbeiten: https://webtigerpython.ethz.ch/
Tippe folgenden Code in den Editor:
from gturtle import * fritz = Turtle() fritz.forward(100)
Verwende anstelle von fritz deinen Namen (keine Bindestriche im Namen!)
Erklärung der Zeilen:
Du kannst deinem Turtle nun auch sagen, er soll sich um einen gewissen Winkel drehen oder rückwärts laufen. Die wichtigsten Befehle sind:
Befehl | Beschreibung |
---|---|
forward(s) | s Schritte (in Pixel) vorwärts bewegen |
back(s) | s Schritte rückwärts bewegen |
right(w) | um den Winkel w (in Grad) nach rechts drehen |
left(w) | um den Winkel w nach links drehen |
setPos(-100,50) | Setzt Turtle an Position (-100,50) |
setX(30) | setzt x-Koordinate des Turtles |
setY(30) | setzt y-Koordinate des Turtles |
setHeading(w) | setzt die Richtung der Turtle (0 gegen oben, im Uhrzeigersinn) |
hideTurtle() | Turtle versteckt sich, darauf folgende Befehle werden instantan ausgeführt |
Programmiere deine Turtle so, dass es ein Quadrat abläuft. Die Position, in der sich die Turtle am Schluss befindet ist irrelevant. Auch ob die Figur etwas kleiner oder grösser gerät ist egal.
Programmiere deinen Turtle so, dass er deinen Namen, Spitznamen oder zumindest deine Initialen abläuft.
Folgender Code erzeugt ein Quadrat mit Seitenlänge 120 Pixel:
from gturtle import * fritz = Turtle() fritz.forward(120) fritz.left(90) fritz.forward(120) fritz.left(90) fritz.forward(120) fritz.left(90) fritz.forward(120) fritz.left(90)
Nun möchten wir das Quadrat aber grösser machen zu Seitenlänge $200$ Pixel. Dazu müssen wir jetzt die vier Werte mit $120$ zu $200$ ändern, was etwas umständlich ist. Es gibt einen einfacheren Weg: Wir speichern die gewünschte Seitenlänge in einer Variable, z.B. l = 200
. Nun können wir einfach fritz.forward(l)
schreiben und es wird für l
der Wert $200$ eingefügt:
from gturtle import * fritz = Turtle() l = 200 fritz.forward(l) fritz.left(90) fritz.forward(l) fritz.left(90) fritz.forward(l) fritz.left(90) fritz.forward(l) fritz.left(90)
Wenn wir die Seitenlänge nun wieder ändern wollen, so müssen wir nur den Wert der Variablen ändern, z.B. l = 50
. Wichtig ist immer, dass man die Variable festlegt bevor man sie verwendet, also oberhalb im Code.
Weiter fällt auf, dass dieser Codeblock viel Copy-Paste beinhaltet: Der folgende Codeblock kommt 4x direkt hintereinander vor:
fritz.forward(l) fritz.left(90)
Deshalb können wir auch einfach sagen, dass dieser Codeblock 4x hintereinander wiederholt (→ repeated) werden soll:
repeat 4: fritz.forward(l) fritz.left(90)
Da ein Codeblock mehrfach hintereinander ausgeführt wird, spricht man von einer Schleife. Beachte, dass der Codeblock, der wiederholt werden soll, eingerückt sein muss. Verwende dazu die Tabulatortaste. Weiter ist es wichtig, den Doppelpunkt im repeat-Befehl nicht zu vergessen.
Nun wollen wir einige der Figuren aus A nochmals zeichnen, diesmal aber mithilfe von Variablen und Schleifen. Löse jede Aufgabe mit einem eigenen Code (also nicht alle Figuren zusammen):
In einer A-Aufgabe hast du zwei Quadrate nebeneinander gezeichnet. Wahrscheinlich war dieser Code ziemlich lange. Schreibe jetzt einen Code, der das gleiche Bild erzeugt, der aber viel kürzer ist, indem du zwei Schleifen verwendest: Eine Schleife für jedes der Quadrate.
Zeichne nun ein grosses und ein kleines Quadrat nebeneinander. Verwende wieder Variablen und Schleifen.
Um eine Turtle namens fritz einen Punkt mit Radius 20 Pixel zeichnen zu lassen, tippe einfach:
fritz.dot(20)
Bisher haben wir unsere Turtles ausschliesslich gerade Linien laufen lassen. Um auf einem Bogen (engl. „arc“) zu gehen, verwende die Befehle
fritz.rightArc(r, w) fritz.leftArc(r, w)
Diese beiden Funktionen zeichnen einen Bogen nach rechts (rightArc
) und nach links (leftArc
). Diesen Funktionen muss man zwei Zahlen als Argumente übergeben:
Zum Beispiel zeichnet man mit dem Befehl rightArc(100, 180)
einen Halbkreis (180 Grad Winkel) mit Radius 100 Pixel.
Freiwillig: Mit setPenColor("red")
die Farbe ändern.
Verwende die Befehle dot(), forward(), right(), left()
, um folgende Figur zu zeichnen:
Versuche nun deinen Code zu kurz wie möglich zu schreiben. Vermeide Code-Wiederholungen, in dem du eine Schleife programmierst. Definiere wo sinnvoll Variablen.
Zeichne nun folgende Figur, welche aus lauter Halbkreisen besteht:
Tipp: Verwende hier leftArc(...)
und rightArc()
.
Zeichne nun folgende Figur, welche aus drei Halbkreisen besteht:
Beachte, dass der grosse Halbkreis einen doppelt so grossen Radius hat wie die kleinen beiden Halbkreise. Man kann deshalb den grossen Radius über den kleinen Radius definieren:
radius_1 = 70 # lege kleinen Radius fest radius_2 = 2 * radius_1 # grosse Radius wird als 2x der kleine Radius definiert
Wir können nun auch etwas Farbe ins Spiel bringen:
setPenColor("red")
kann man die Farbe des Stifts festlegen.setPenWidth(10)
kann man die Dicke des Stifts festlegen.clear("black")
ganz am Anfang des Codes (bevor man Turtle erzeugt) kann man die Hintergrundfarbe festlegen.setFillColor("blue")
, startPath()
und fillPath()
kann man eine Fläche farbig ausfüllen.In der Dokumentation findet man genauere Erklärungen zu diesen (und allen anderen) Turtle-Befehlen.
In Verzweigungen werden Bedingungen überprüft. Je nachdem, wird unterschiedlicher Code ausgeführt.
Beispiel 1:
answer = input("Was gibt 37 + 5?") if answer == 42: print("Korrekt!") else: print("Falsch!") print("Auf Wiedersehen")
Beispiel 2:
answer = input("Was gibt 37 + 5?") if answer == 42: print("Korrekt!") elif answer == 40: print("Fast, um 1 zu tief!") elif answer == 41: print("Fast, um 1 zu hoch!") else: print("Falsch!") print("Auf Wiedersehen")
Beispiel 3:
money = input("Wie viel Geld hast du?") if money >= 1000000: print("Du bist Millionär!") else: print("Du bist kein Millionär!")
Vergleichsoperatoren:
Vergleichsoperator | Überprüft ob … |
---|---|
x == y | x gleich y ist. |
x != y | x ungleich y ist. |
x > y | x grösser als y ist. |
x < y | x kleiner als y ist. |
x >= y | x grösser oder gleich y ist. |
x <= y | x kleiner oder gleich y ist. |
Beachte: Einige Aufgaben sollen mit TurtleGraphics gelöst werden, andere ohne. Den TurtleCode from gturtle import *
usw. soll nur dann geschrieben werden, wenn man auch eine Turtle hat.
Schreibe einen Code, in dem die Benutzerin dazu aufgefordert wird, deine Lieblingszahl zu erraten. Gelingt es ihr, so wird ihr gratuliert. Falls nicht, wird sie dafür kritisiert, dass sie dies nicht weiss.
print("...")
), dass eine unzulässige Eingabe gemacht wurde.Witz-Sammlung: Notiere 3 bis 5 (durchaus flache) Witze. Die Benutzerin soll aufgefordert werden, eine Zahl 1-… einzugeben. Gibt sie eine 1/2/3 ein, so soll der erste/zweite/dritte Witz angezeigt werden. Macht sie eine falsche Eingabe, so soll einfach nicht passieren.
Volljährig Checker: Die Benutzerin wird aufgefordert, ihr Alter einzugeben. Überprüfe ob sie volljährig ist oder nicht und gib entsprechend „volljährig“ oder „minderjährig“ aus. Beachte, dass es hier einen anderen Vergleichsoperator braucht als ==
: < , > , <= , >=
.
Positiv, Null oder negativ? Die Benutzerin wird aufgefordert, eine Zahl einzugeben. Der Code gibt aus „positiv“, „Null“ oder „negativ“.
Grössere Zahl: Die Benutzerin wird aufgefordert, hintereinander zwei Zahlen einzugeben. Speichere diese zwei Zahlen in unterschiedlichen Variablen. Die grössere der beiden Zahlen soll dann ausgegeben werden.
Beispiel: Falls zuerst $5$ und dann $7$ eingegeben wird, soll $7$ ausgegeben werden.
.hideTurtle()
Befehl, damit die Map sofort gezeichnet ist..showTurtle()
und lasse die Turtle auf der Rennbahn Runden drehen. Mit repeat:
kann ein Code unendlich oft wiederholt werden.Beispiel:
Mit Python kann man besser rechnen als mit jedem Taschenrechner. Unter anderem gibt es alle gängigen Rechenoperationen wie $+,-,\cdot,/$ und viele weitere mathematische Operatoren in Python:
Funktion | Python-Code |
---|---|
Addition | 7 + 3 |
Subtraktion | 7 - 3 |
Multiplikation | 7 * 3 |
Division (mit Nachkommastellen) | 7 / 3 |
Ganzzahldivision | 7 // 3 |
Modulo (Rest der Ganzzahl-Division, Bsp. 17 % 5 = 2 ) | 17 % 2 |
Hoch (z.B. 2 hoch 5) | 2**5 |
Erinnerung: Wenn wir einer Variable einen Wert zuweisen, verwenden wir die Zuweisungsanweisung =
. Dieser weist der Variablen auf der linken Seite den Wert auf der rechten Seite zu, also z.B. x = 42
. Damit kann man auch den Wert einer Variable erhöhen oder verringern:
x = 42 # Variable x mit Wert 42 print(x) # Ausgabe: 42 x = x + 1 # Rechte Seite ergibt 43. Dieser Wert wird nun x zugewiesen print(x) # Ausgabe: 43
Ein String ist nichts anderes als Text, der zum Beispiel in einer Variable gespeichert wird:
name = "Hans Müller" # Variable name hat Wert "Hans Müller" und ist ein String
(Überigens ist dieser Name laut ChatGPT der 'schweizeriste' Name).
Wir werden nun vermehrt Werte berechnen, die wir dann in einem schönen Format ausgeben wollen. Am einfachsten geht dies mit sogenannten f-Strings: Diese erlauben es einem, einen String mit dem Wert einer Variable zu kombinieren:
age = input("Wie alt bist du?") # Benutzerin wird nach Alter gefragt, wird in Variable age gespeichert. print(f"Du bist {age} Jahre alt") # Der Wert der Variable age (also das Alter) wird im String eingefügt.
Falls die Benutzerin $15$ eingibt, gibt der Code dann also „Du bist 15 Jahre alt“ aus. Beachte:
f
stehen, was für formatiert steht.{...}
stehen.Berechne mithilfe von Python. Verwende dazu die Rechenoperatoren in der Tabelle oben.
Frage die Benutzerin der Reihe (separate input-Befehle) nach ihrem Namen, Alter und Wohnort. Gib dann eine schöne Zusammenfassung aller Eingaben mittels eines schön formatierten Strings (f-String) aus.
Beispiel:
Frage die Benutzerin nach ihrem Alter (in Jahren). Berechne nun ihr Alter …
Gib die Resultate schönt formatiert aus. Keep it simple, ignoriere Schaltjahre.
Beispiel: Falls Eingabe $7$ ist, sollen Ausgaben sein:
Alter in Jahren: 7 Alter in Monaten: 84 Alter in Tagen: 2555 Alter in Sekunden: 220752000
Programmiere einen Countdown. In der Konsole soll also ausgegeben werden:
10 9 8 7 6 5 4 3 2 1 Los!
Optional: Summiere alle Zahlen auf. Berechne also $10 + 9 + 8 + \ldots + 1$. Was erhält man, wenn man den Countdown bei $100$ startet?
M&M-Verteiler: Zusammen mit ein paar Freunden kaufst du dir eine Tüte M&M. Diese werden dann gleichmässig verteilt. Schreibe nun folgenden Code:
Beispiel: Für $39$ M&M und $4$ Freunde soll ausgegeben werden: „Es gibt 9 M&M pro Person und es bleiben 3 Stück übrig.“
Slides: Bedingungen & while-Schleife
Mit einer Schleife kann man einen Codeblock wiederholt ausführen lassen und zwar solange, wie eine vorgegebene Bedingung erfüllt ist.
while <Bedingung>: # Hier Codeblock, der wiederholt werden soll, # solange die Bedingung erfüllt ist. # Allen Zeilen, die zum Codeblock gehören # müssen eingerückt sein. # hier Code, der NACH der while-Schleife ausgeführt werden soll
Alle Zeilen Code, die zum Codeblock der Schleife gehören werden eingerückt. Verwende dazu die Tab-Taste oben links. Nachdem der ganze Codeblock ausgeführt wurde, wird die Bedingung erneut überprüft. Ist sie immer noch erfüllt, wird der gleiche Codeblock wieder ausgeführt usw.
Ab sofort gilt ein komplettes Verbot der repeat-Schleife. Verwende stattdessen die while-Schleife.
Zählen: Gib alle Zahlen von $0$ bis und mit $42$ in der Konsole aus. Verwende eine while-Schleife.
Ausgabe:
0 1 2 ... 41 42
It's (not) the final countdown: Programmiere wieder einen Countdown, diesmal aber natürlich mit einer while-Schleife.
Ausgabe:
10 9 8 ... 2 1 Los!
Quadrat III: Lasse wieder eine Turtle ein Quadrat zeichnen - aber mit while!
Summieren: Berechne die Summe aller natürlicher Zahlen bis und mit $100$, also: $$1 + 2 + 3 + \ldots + 98 + 99 + 100 = ???$$ Guess what? Genau, man soll wieder eine while-Schleife programmieren.
Gib die ersten $100$ Zahlen der 7er-Reihe aus, also $7,14,21,\ldots$.
Eine While-Schleife wiederholt einen Codeblock solange, wie deren Bedingung erfüllt ist. Falls die Bedingung immer erfüllt ist, liegt eine Endlosschleife vor. Oft programmiert man aus Versehen eine Endlosschleife, es gibt aber auch viele Situationen, in denen dies erwünscht ist. Zum Beispiel will man typischerweise ein Game so lange spielen können, bis man keine Lust mehr hat (oder einem die Eltern zwingen, aufzuhören). Man verfolgt dann beim Programmieren den folgenden Ansatz:
while True: # hier kommt der Codeblock, # der wiederholt werden soll
break
. Dies bricht die Schleife per sofort ab.Beispiel: Die Benutzerin soll aufgefordert werden, die nerdigste Zahl der Welt (also $42$) einzugeben: „Gib die nerdigste Zahl der Welt ein“. Sobald sie $42$ eingegeben hat, soll die Schleife abgebrochen und der Benutzerin gratuliert werden:
while True: number = input("Gib die nerdigste Zahl der Welt ein") if number == 42: break else: print("Leider nicht, versuche es noch einmal") print("Gratuliere, du hast die richtige Zahl, 42, eingegeben!")
Löse alle Aufgaben mit while-Schleifen und break.
Negative Zahl: Die Benutzerin soll solange aufgefordert, eine negative Zahl einzugeben, bis sie es geschafft hat. Gibt sie eine falsche Zahl ein, soll sie erneut aufgefordert werden.
Code für Geheimtür: Der Benutzer soll aufgefordert werden, das geheime Passwort („spaghetti“) einzugeben. Gibt er es falsch ein, wird ausgegeben „Zugang verweigert“. Macht er es richtig, wird „Zugang gewährt“ ausgegeben und der Code abgebrochen.
Unendliche Summe: Die Benutzerin soll unendlich oft hintereinander aufgefordert werden, eine Zahl einzugeben. Die neu eingegebene Zahl wird zu den bisherigen hinzuaddiert und das aktuelle Resultat ausgegeben.
Um das Programm abzubrechen, kann die Benutzerin „q“ (für Quit) eingeben.
Löse die Aufgaben so elegant wie möglich. Verwende z.B. wann immer möglich Schleifen.
Bart hat mal seine Carbonara wieder mit Rahm gekocht! Zur Strafe muss er 100x „Kein Rahm in die Carbonara!“ schreiben. Da du ein Herz für Bart hast, möchtest du ihm helfen und ihm einen Code schreiben, der ihm die Arbeit abnimmt (auch wenn er seine Strafe eigentlich verdient hat).
Gib alle Zahlen der 5er Reihe aus im Bereich $5,10,...,500$.
Berechne die Summe aller gerader Zahlen von $2$ bis und mit $100$.
Im Sekundentakt soll herauf gezählt werden: $1,2,3,4,5,...$. Um einen Delay von 1s einzubauen, gehe wie folgt vor:
import time # importiere ganz oben im Code ... time.sleep(1) # Befehl, dass für 1s soll pausieren
Erzeuge das folgende Bild auf clevere Art und Weise.
Tipp: Verwende zwei ineinander verschachtelte Schleifen.
Achtung: Meist gibt es mehrere Lösungen. Nur weil deine Lösung anders ist als diejenige in den Musterlösungen unten, bedeutet dies nicht, dass deine nicht richtig/gut ist. Sende oder zeige im Zweifelsfall deine Lösung dem Lehrer.