Programmieren II: Python Grundlagen
Von Struktogrammen zu Python
Du kannst nun mit Struktogrammen einfache Programme schreiben. Damit wir diese auch einem Computer zum Ausführen geben können, müssen wir diese in einer Sprache formulieren, die ein Computer versteht. Wir wählen dazu die Programmiersprache Python. Die Elemente, die wir bei den Struktogrammen kennengelernt haben, gibt es auch in Python.
Struktogramm
Python
In einer Variablen kann ein Wert gespeichert werden. Zum Beispiel kann man der Variablen x
den Wert $42$ oder der Variablen name
den Wert "Albert Einstein"
zuweisen.
x = 42 name = "Albert Einstein"
Variablen haben unterschiedliche Datentypen:
x
ist ein Integer (kurz int), also eine ganze Zahlname
ist ein String, also Text. Dafür werden Anführungs- & Schlusszeichen ('
oder"
) verwendet.
Mit einer Schleife kann man einen Codeblock wiederholt ausführen lassen und zwar solange, wie eine vorgegebene Bedingung erfüllt ist.
Der Balken auf der linken Seite (hier blau) gibt an, welche Zeilen Code genau zum Codeblock der Schleife gehören.
while BEDINGUNG: # Codeblock der ausgeführt wird, solange (while) # Bedingung erfüllt ist. # Nachdem Codeblock komplett ausgeführt wurde, # wird Bedingung wieder neu überprüft.
Alle Zeilen Code, die zum Codeblock der Schleife gehören werden gleichmässig eingerückt. Verwende dazu die Tab-Taste oben links.
Mit einer Verzweigung kann man das Programm eine Entscheidung treffen: Je nach dem, ob eine vorgegebene Bedingung erfüllt ist oder nicht, nimmt der Code einen anderen Verlauf.
if BEDINGUNG: # Codeblock der ausgeführt wird, # falls (if) Bedingung erfüllt ist else: # Codeblock der ausgeführt wird, # der ansonsten ausgeführt wird, # falls also Bedingung NICHT erfüllt ist
Auch hier muss auf eine korrekte Einrückung geachtet werden.
Eingabe und Ausgabe:
Variablen, Verzweigungen, Schleifen in Python
Die oben aufgeführten Programmier-Konstrukte werden im Skript im Detail erklär.
Aufgaben A
Alle Befehle, die wir in Struktogrammen kennengelernt haben, gibt es in ganz ähnlicher Form auch für die Programmiersprache Python. In diesem ersten Aufgabenblock geht es darum, Struktogramme in Python und umgekehrt zu 'übersetzen'.
Löse diese Aufgaben zuerst auf Papier und erst dann am Computer, wenn dies im Auftrag vorgegeben wird.
Aufgabe A1
Teil I
Schlage deine Lösung zu Teil i) der Aufgabe C2 nach. Sie sollte in etwa so aussehen:
Schreibe das entsprechende Programm in Python (auf Papier).
Teil II
Teil III
Probiere deine Lösungen (eine nach der anderen) am Computer in TigerPython aus: Tippe deinen Code ab, verwende für Einrückungen die Tabulator Taste (oben links). Führe dann den Code aus (grüner Pfeil oder F5)
Aufgabe A2
Übersetze das Struktogramm zur folgenden Struktogramm, das einen Countdown ausgibt:
- zuerst auf Papier.
- Probiere deine Lösung dann am Computer aus.
Aufgabe A3
Übersetze alle Teilaufgaben aus der Aufgabe C1 auch nach Python, und zwar direkt am Computer.
Zusatzaufgaben A
Übersetze die Struktogramme der Zusatzaufgaben C4 / C5 auf Python.
Python Grundlagen
Kommentare
Auf den unteren Zeilen des obigen Beispiels findest du Kommentare. Diese beginnen mit einem Hashtag #
. Sämtlicher Code der folgt, wird von Python ignoriert. Damit kann man seinem Code zum Beispiel Überschriften oder Erklärungen anfügen. Möchte man Kommentare über mehrere Zeilen schreiben, verwendet man drei Anführungszeichen:
# single line comment """ multi line comment """
Vergleichsoperatoren
Für Bedingungen in Verzweigungen und Schleifen benötigen wir Vergleichsoperatoren:
Operator | Erklärung |
---|---|
x == 4 | x ist Zahl und hat Wert von genau 4 |
s == "Hallo" | s ist String und hat genau den Inhalt „Hallo“ |
x != 4 | x ist NICHT eine Zahl vom Wert (Ungleich-Operator). |
x > 5 | x ist Zahl grösser als 5 |
x >= 5 | x ist Zahl grösser gleich 5 |
x < 5 | x ist Zahl kleiner als 5 |
x <= 5 | x ist Zahl kleiner gleich 5 |
5 <= x <= 10 | x ist Zahl zwischen 5 und 10 (inklusive) |
Mathematische Operationen
Neben dem +
gibt es eine Vielzahl an mathematischen Operatoren:
Funktion | Python-Code | Resultat |
---|---|---|
Addition | 5+2 | 7 |
Subtraktion | 5-2 | 3 |
Multiplikation | 5*2 | 10 |
Division (Nachkommastellen) | 5/2 | 2.5 |
Ganzzahldivision | 5//2 | 2 |
Hoch (z.B. 5 hoch 2) | 5**2 | 25 |
Wurzel (z.B. Wurzel von 2, sqrt für square-root) | sqrt(2) | 1.4142135... |
Modulo (Rest der Ganzzahl-Division) | 5%2 | 1 |
Achtung: Für sqrt
muss noch das Mathe-Modul importiert werden:
from math import *
Strings (Zeichenketten)
Strings werden bekanntlich mit Anführungs- und Schlusszeichen geschriebene, zum Beispiel:
name = "Albert Einstein" # Ob doppeltes Anfuehrungs-/Schlusszeichen oder.... job = 'Physicist' # ... einfaches spielt keine Regel. In einem String darf man einfach nicht mischen.
Oft möchte man mehrere Strings und Zahlen zu einem einzelnen String kombinieren. Einzelne Strings können mit +
zusammengefügt werden. Möchte man eine Zahl-Variable x
an einen String anfügen, so muss man diese zuerst in einen String umwandeln: str(x)
. Ein String, der aus mehreren einzelnen Strings und Zahlen zusammengesetzt wurde, nennt man einen formatierten String. Wird der String mit print ausgegeben, so spricht man von einer formatierten Ausgabe. Beispiel:
firstname = "Albert" lastname = "Einstein" print("Full name is " + firstname + " " + lastname + "!")
Beachte, dass der Plus-Operator +
komplett unterschiedliche Bedeutungen haben kann, je nach Situation, in der er angewendet wird:
3 + 7
: Wird er auf zwei Zahlen angewendet, so handelt es sich um die normale mathematische Addition. Das Resultat ist also10
."Hallo " + "Klasse"
oder"3" + "7"
: Wird er auf zwei Strings angewendet, werden diese aneinander gehängt. Resultat:"Hallo Klasse"
, resp."37"
- Mischt man die beiden, z.B.
"Meine Lieblingszahl ist " + x
(wobeix = 42
), so erhält man einen Fehler. Um diesen zu beheben, muss man den Wert vonx
vorher noch in einen String umwandeln:"Meine Lieblingszahl ist " + str(x)
Praktisch sind auch die Befehle s.lower()
und s.upper()
, mit denen ein String s
in kleinbuchstaben, resp. GROSSBUCHSTABEN umgewandelt werden.
Zufallszahlen
Mithilfe des random-Moduls können ganz einfach Zufallszahlen erzeugt werden. Folgender Code simuliert den Wurf eines Würfels:
import random z = random.randint(1,6) # bestimmt eine Zufallszahl aus Bereich 1,2,3,4,5,6 print(z)
Beachte, dass die Zufallsfunktion randint heisst. Dies steht für 'random integer', also 'zufällige ganze Zahl'. Ganze Zahlen sind Zahlen ohne Nachkommastellen, also $\ldots, -3,-2,-1,0,1,2,3,\ldots$.
Verzweigungen im Detail
Im Kapitel haben wir bereits if-else-Verzweigungen kennengelernt:
if BEDINGUNG: # Codeblock der ausgeführt wird, # falls (if) Bedingung erfüllt (True) ist else: # Codeblock der ausgeführt wird, # der ansonsten ausgeführt wird, # falls also Bedingung NICHT erfüllt ist (False)
Diese sind sehr praktisch, wenn man im Code zwischen zwei verschiedenen Fällen unterscheiden will.
Gibt es aber drei oder mehr Fälle, muss man if-else-Verzweigungen ineinander verschachteln, wie zum Beispiel in der Schnaps, Bier & Sirup Aufgabe. Dadurch wird der Code sehr schnell unübersichtlich und fehleranfällig. Es ist dann besser, eine if-elif-else-Verzweigung zu programmieren, da man mit dieser beliebig viele Fälle unterscheiden kann:
if BEDINGUNG1: # Code, falls BEDINGUNG1 erfüllt ist. elif BEDINGUNG2: # Code, falls BEDINGUNG2 erfüllt ist, aber nicht BEDINGUNG1. else: # Code, falls keine der Bedingungen erfüllt ist.
Bemerkungen:
- Man kann beliebig viele elif-Befehle hintereinander schalten.
- Falls die Bedingung bei if oder einem elif erfüllt ist, werden alle darauffolgenden elifs gar nicht mehr überprüft.
Aufgaben B
Vorwissen: Weitere Grundlagen
Aufgabe B1
Python ist super im rechnen und macht jeden Taschenrechner vergessen. Studiere das folgende kurze Kapitel zu den mathematischen Operationen, welches eine Übersicht über die wichtigsten mathematischen Rechenoperationen beinhaltet.
Berechne mit Python und gib das Resultat aus:
- Addiere $7777$ und $8888$
- Subtrahiere $27312$ von $101432$
- Wie oft kommt $29$ in $1447$ vor?
- Ist $1764$ eine Quadratzahl oder nicht? Beispiel für Quadratzahlen: $49$, weil $7^2 = 49$
Aufgabe B2: Personendetails
Studiere das Kapitel zu Strings.
Schreibe ein Programm, in welchem eine Person der Reihe nach aufgefordert wird, ihren Namen, Wohnort und Alter (als Zahl, nicht String) einzugeben. Die Werte werden in passenden Variablen gespeichert. Die Details zur Person werden dann in einem schön formatierten String ausgegeben, z.B. „Fritz wohnt in Romanshorn und ist 42 Jahre alt!“
Aufgabe B3: Verbotenes Wort
Studiere das Kapitel zu Vergleichsoperatoren.
Schreibe ein Programm, in welchem man aufgefordert wird, ein Wort einzugeben. Alle Eingaben sind ok bis auf eine: Die des verbotenen Wortes „Voldemort“. Gibt man dieses Wort ein, soll eine deutliche Warnung angezeigt werden mit der Aufforderung, dieses Wort nie wieder einzugeben! Ansonsten erhält man die Rückmeldung, dass das Wort in Ordnung sei. Verwende dazu den Ungleich-Operator.
Aufgabe B4: Kettenrechnung
Weise der Variablen x
den Wert $7$ zu. Verändere nun die Variable nacheinander wie folgt:
- verdopple sie
- multipliziere mit 100
- dividiere ganzzahlig (keine Nachkommazahlen) durch 80
- rechne hoch drei
- subtrahiere 13
- ziehe die Quadratwurzel
- dividiere durch 10
Nun solltest du wieder 7 erhalten.
Aufgabe B5: Zähler
- Gib alle Zahlen $0,1,2, \ldots, 9$ mithilfe einer Schleife aus.
- Gib nun alle Werte von $0$ bis und mit $99$ aus. Hast du den Code im ersten Schritt richtig programmiert, musst du nur einen einzigen Wert ändern.
Aufgabe B6: Alter
Berechne dein Alter in Tagen, Stunden und Sekunden. Speichere zuerst dein Alter in Jahren in einer passenden Variablen, z.B.
my_age_in_years = 14
Berechne nun das Alter in:
- Tagen
- Stunden
- Sekunden
Effekte wie Schaltjahre oder Schaltsekunden darfst du bei der Berechnung nicht berücksichtigen.
Jeder Wert soll in einer Variablen mit passendem Namen, z.B. my_age_in_seconds
gespeichert werden. Gib nun die berechneten Werte in formatierten Strings als Sätze aus, z.B.:
- „I am 14 years old.“
- „I am … days old.“
- „…“
Wichtig! Ändert man nun den Wert von my_age_in_years
, so müssen sich alle daraus berechneten Werte entsprechend anpassen!
Aufgabe B7: Ganzzahldivision
Es sollen zwei Zahlen eingegeben werden. Der Code berechnet dann die Ganzzahldivision inklusive Rest der beiden Zahlen und gibt diese in einem formatierten String aus.
Beispiel: Werden $23$ und $5$ eingegeben, so ist die Ausgabe: „23 : 5 = 4 Rest 3“
Aufgaben C
Vorwissen: Python Grundlagen
In einer alten Aufgabe hast du mithilfe von repeat
ein Turtle ein Quadrat zeichnen lassen. Der repeat
befehlt ist eine Eigenheit von TigerJython und kein richtiges Python. Verwendest du repeat, outest du dich als uncool, weshalb wir von nun an an die Finger von repeat lassen und stattdessen while-Schleifen verwenden! Bei allen weiteren Prüfungen ist das Verwenden von repeat verboten!
Aufgabe C1
Lasse eine Turtle ein Quadrat ablaufen, diesmal aber mithilfe der while-Schleife.
Aufgabe C2
Kannst du auch eine Spirale zeichnen? Beim Quadrat bleiben Seitenlänge und Winkel immer gleich - welcher der beiden Werte ändert sich bei der Spirale?
Zeichne erst eine Spirale. Zeichne dann ein zweite Spirale ähnlich wie im Bild. Zeichne dazu mit einer while-Schleife die eine. Versetze dann die Position deiner Turtle mit setX
und setY
(oder setPos
) und zeichne die Zweite Spirale mit einer neuen while-Schleife.
Aufgabe C3
Aufgabe C4 (optional)
Zusatzaufgabe C (Uhr)
Nutze TurtleGraphics, um eine Uhr zu simulieren. Wähle selbst aus, ob es eine traditionelle SBB-Uhr oder eine Digitaluhr sein soll:
Schicke das Endresultat per Teams der Lehrperson.
Aufgaben D
Vorwissen: Verzweigungen im Detail
Bei diesen Aufgaben geht es um folgendes:
- Schleifen mit elif zu programmieren
- etwas längere Programme schreiben
Aufgabe D1
Das Programm soll:
- den Benutzer nach dem Alter fragen
- Ausgeben, ob der Benutzer Schnaps, Bier oder Sirup trinken darf.
Programmiere die Schnaps, Bier & Sirup Aufgabe mit einer if-elif-else-Verzweigung.
Aufgabe D2
Die Benutzerin wird aufgefordert, eine Zahl einzugeben. Der Code analysiert, ob die Zahl positiv, Null oder negativ ist und gibt eine entsprechende Nachricht.
Aufgabe D3
Teil I
Der Benutzer wird aufgeforder, eine der folgenden Eingaben zu machen:
- „q“ für Quadrat
- „k“ für Kreis
- „r“ für Rechteck
- „…“ für eigene Figur
Die Turtle zeichnet dann die entsprechende Figur. Vermeide Code-Repetitionen, verwende stattdessen Schleifen!
Wird etwas anderes eingegeben, so soll eine der folgenden Varianten zum Zug kommen (entscheide selbst):
- Variante 1: einfach eine Rückmeldung, dass unzulässige Eingabe
- Variante 2: Turtle läuft ein Fragezeichen ab
Teil II
Erweitere nun deinen Code wie folgt:
- Nach der Eingabe für die Form soll der Benutzer die Farbe für den Stift und die Füllfarbe auswählen können (Tipp:
farbe = str(input("Farbe eingeben (z.B. 'red'): ")
). Mehr zu Farben findest du hier. - Der Stift wird auf die entsprechende Farbe gesetzt:
t.color(farbe)
. - Flächen füllen mit
t.begin_fill()
undt.end_fill()
.
Aufgabe D4
Schritt 1
Schreibe ein kleines Mathe-Quiz-Spiel. Der Benutzer soll eine Additionsrechnung erhalten, die er lösen soll. Nachdem er das Resultat eingegeben hat, soll er die Rückmeldung erhalten, ob das Resultat korrekt war oder nicht.
Schritt 2
Erweitere nun dein Mathe-Quiz. In diesem soll die Aufgabe per Zufall generiert werden. Nutze den Zufallsgenerator von Python, um die beiden Zahlen, die addiert werden sollen, zufällig zu wählen.
Dazu musst du das random-Modul einbinden.
import random # schreibe dies ganz oben in deinem Code ... x = random.randint(0,10) # wählt zufällig eine Zahl aus den Zahlen 0,1,2,3,...,9,10 aus ...
Schritt 3
Erweitere nun dein Spiel wie folgt: Insgesamt sollen 10 Runden gespielt werden, wobei in jeder Runde eine Zufallsaufgabe generiert wird (wie in Schritt 2). Es soll mitgezählt werden, wie viele Aufgaben richtig gelöst wurden. Am Schluss soll der Spieler eine entsprechende Rückmeldung erhalten, z.B.:
Du hast 7 von 10 Aufgaben richtig gelöst.
Schritt 4
Gleich wie Schritt 3, die Rückmeldung soll aber erweitert werden. Je nach erreichter Anzahl Punkte soll eine andere Meldung erscheinen:
Erreichte Punkte | Meldung |
10 | Perfekt, du hast alle Aufgaben richtig gelöst! |
8-9 | Sehr gut, du hast fast alle Aufgaben richtig gelöst! |
6-7 | Nicht schlecht, du hast mehr als die Hälfte der Aufgaben richtig gelöst! |
5 | Genügend, du hast die Häfte der Aufgaben richtig gelöst |
1-4 | Ungenügend, du hast leider weniger als die Hälfte der Aufgaben richtig gelöst |
0 | Leider hast du alle Aufgaben falsch gelöst. Zurück in die Primarschule! |
Aufgabe D5 (optional)
Mache eine Kopie von deinem Mathe-Quiz. Erweitere deinen Code nun so, dass neben der Addition auch Subtraktionen und Multiplikationen vorkommen können. Die Division sollte weggelassen werden, da es dort schnell Aufgaben gibt, die man kaum lösen kann. Welche der drei Operationen an der Reihe ist, soll ebenfalls der Zufall entscheiden.