Programmieren I: Grundlagen der Programmierung
1. Einführung
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/
Arbeiten mit TigerPython
- Öffne die Web-IDE: https://webtigerpython.ethz.ch/
- Schreibe Code, führe aus (grüner Pfeil)
- Speichere regelmässig, in dem Code per Copy-Paste (CTRL C & V) in OneNote übertragen wird
- Alle Codes müssen auf OneNote sauber geordnet abgelegt werden. Vergisst man einen Code zu speichern, muss er nochmals geschrieben werden..
Tipps
- Im Dossier gibt es viele kleine Code-Beispiele. Tippe diese jeweils von Hand ab und versuche, alles zu verstehen. Wenn du den Code per Copy-Paste kopierst, lernst du gar nichts!
2. Einfache Bewegungen
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:
- Zuerst musst du das Modul gturtle importieren, damit wir mit Turtlegrafik arbeiten können.
- Erzeuge einen neuen Turtle mit einem Namen. Man nennt dieses auch ein Turtle-Objekt.
- Gib deinem Turtle den Befehl, 100 Pixel vorwärts zu laufen.
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 |
Aufgaben A
Aufgabe A1
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.
Aufgabe A2
Aufgabe A3
Aufgabe A4
Aufgabe A5
Programmiere deinen Turtle so, dass er deinen Namen, Spitznamen oder zumindest deine Initialen abläuft.
3. Variablen und Schleifen
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.
Aufgaben B
Aufgabe B1
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):
- Quadrat
- Dreieck
- Sechseck
Aufgabe B2
Aufgabe B3
Aufgabe B4
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.
Aufgabe B5
Zeichne nun ein grosses und ein kleines Quadrat nebeneinander. Verwende wieder Variablen und Schleifen.
4. Kreisbogen
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:
- Zahl r: Radius des Kreises in Pixel
- Zahl w: Winkel in Grad
Zum Beispiel zeichnet man mit dem Befehl rightArc(100, 180)
einen Halbkreis (180 Grad Winkel) mit Radius 100 Pixel.
Aufgaben C
Freiwillig: Mit setPenColor("red")
die Farbe ändern.
Aufgabe C1
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.
Aufgabe C2
Zeichne nun folgende Figur, welche aus lauter Halbkreisen besteht:
Tipp: Verwende hier leftArc(...)
und rightArc()
.
Aufgabe C3
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
5. Farben (optional)
Wir können nun auch etwas Farbe ins Spiel bringen:
- Mit
setPenColor("red")
kann man die Farbe des Stifts festlegen. - Mit
setPenWidth(10)
kann man die Dicke des Stifts festlegen. - Mit
clear("black")
ganz am Anfang des Codes (bevor man Turtle erzeugt) kann man die Hintergrundfarbe festlegen. - Mit
setFillColor("blue")
,startPath()
undfillPath()
kann man eine Fläche farbig ausfüllen.
In der Dokumentation findet man genauere Erklärungen zu diesen (und allen anderen) Turtle-Befehlen.
Aufgaben D
Aufgabe D1
Aufgabe D2
Aufgabe D3
6. Verzweigungen
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. |
Aufgaben E
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.
Aufgabe E1
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.
Aufgabe E2
- Die Benutzerin soll dazu aufgefordert werden, den Buchstaben „q“ einzugeben. Fall sie dies macht, soll ein Quadrat gezeichnet werden. Falls irgendetwas anderes eingegeben wird, soll nichts gezeichnet werden. Stattdessen soll ausgegeben werden (mit
print("...")
), dass eine unzulässige Eingabe gemacht wurde.
- Modifiziere nun den Code oben so, dass man (neben „q“ für Quadrat) auch „d“ eingeben kann, damit ein Dreieck gezeichnet wird.
Aufgabe E3
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.
Aufgabe E4
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 ==
: < , > , <= , >=
.
Aufgabe E5
Positiv, Null oder negativ? Die Benutzerin wird aufgefordert, eine Zahl einzugeben. Der Code gibt aus „positiv“, „Null“ oder „negativ“.
Aufgabe E6
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.
Zusatzaufgaben I
Race
- Zeichne mit Turtle eine eigene Map mit einer Rennbahn und weiteren Elementen (Gewässer, Bäume, Häuser, Menschen, …). Verwende für diesen Teil den
.hideTurtle()
Befehl, damit die Map sofort gezeichnet ist. - Zeige nachher die Turtle wieder an mit
.showTurtle()
und lasse die Turtle auf der Rennbahn Runden drehen. Mitrepeat:
kann ein Code unendlich oft wiederholt werden.
Beispiel:
7. Rechnen & Strings
Rechnen
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
Strings
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:
- Vor dem String muss zwingend
f
stehen, was für formatiert steht. - Die Variable, von der der Wert eingefügt werden soll, muss in geschwungenen Klammern
{...}
stehen.
Aufgaben G
Aufgabe G1
Berechne mithilfe von Python. Verwende dazu die Rechenoperatoren in der Tabelle oben.
- $62342+43169 = $
- $287 \cdot 63 = $
- $7731 : 532 = $
- $\cfrac{(24\cdot 9)^3+10077697}{13} = $
Aufgabe G2
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:
- Eingaben:
- „Hans Müller“
- 42
- „Romanshorn“
- Ausgabe: „Du heisst Hans Müller, bist 42 Jahre alt und wohnst in Romanshorn.“
Aufgabe G3
Frage die Benutzerin nach ihrem Alter (in Jahren). Berechne nun ihr Alter …
- in Jahren
- in Monaten
- in Tagen
- in Sekunden
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
Aufgabe G4
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?
Aufgabe G5
Aufgabe G6
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:
- Frage Benutzer nach Anzahl M&M in der Tüte.
- Frage Benutzer nach Anzahl Freunden.
- Der Code gibt dann schön formatiert aus, wie viele M&M jede Person erhält …
- … und wie viele übrig bleiben.
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.“
Aufgabe G7
Aufgabe G8
Aufgabe G9
8. While-Schleife
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.
Aufgaben H
Aufgabe H1
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
Aufgabe H2
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!
Aufgabe H3
Quadrat III: Lasse wieder eine Turtle ein Quadrat zeichnen - aber mit while!
Aufgabe H4
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.
Aufgabe H5
Gib die ersten $100$ Zahlen der 7er-Reihe aus, also $7,14,21,\ldots$.
9. Endlosschleifen und Break
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:
- Schreibe den Code in eine Endlosschleife:
while True: # hier kommt der Codeblock, # der wiederholt werden soll
- Sobald der Codeblock aber doch abgebrochen werden soll (z.B. wegen GameOver oder beim erfolgreichen Abschliessen des Spiels oder weil die Benutzerin keine Lust mehr hat), schreibt man das Keyword
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!")
Aufgaben I
Löse alle Aufgaben mit while-Schleifen und break.
Aufgabe I1
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.
Aufgabe I2
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.
Aufgabe I3
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.
Zusatzaufgaben
Löse die Aufgaben so elegant wie möglich. Verwende z.B. wann immer möglich Schleifen.
Basic
Aufgabe: Wiederholen
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).
Aufgabe: 5er-Reihe
Gib alle Zahlen der 5er Reihe aus im Bereich $5,10,...,500$.
Aufgabe: Summe gerader Zahlen
Berechne die Summe aller gerader Zahlen von $2$ bis und mit $100$.
Aufgabe: Unendlicher Zähler
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
Anspruchsvoll
Aufgabe: Lord of the Rings
Erzeuge das folgende Bild auf clevere Art und Weise.
Tipp: Verwende zwei ineinander verschachtelte Schleifen.
Lösungen
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.