Programmieren I: Grundlagen der Programmierung

Lernziele

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/

  1. Schreibe Code, führe aus (grüner Pfeil)
  2. Speichere regelmässig, in dem Code per Copy-Paste (CTRL C & V) in OneNote übertragen wird
  3. Alle Codes müssen auf OneNote sauber geordnet abgelegt werden. Vergisst man einen Code zu speichern, muss er nochmals geschrieben werden..
  • 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!

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:

  1. Zuerst musst du das Modul gturtle importieren, damit wir mit Turtlegrafik arbeiten können.
  2. Erzeuge einen neuen Turtle mit einem Namen. Man nennt dieses auch ein Turtle-Objekt.
  3. 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

Link zur Dokumentation mit allen Befehlen

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.

Tipps:

Aufgabe A2

Programmiere nun ein gleichseitiges Dreieck.

Aufgabe A3

Und nun ein regelmässiges Sechseck.

Aufgabe A4

Zeichne nun zwei identische Quadrate nebeneinander:

Tipps:

Aufgabe A5

Programmiere deinen Turtle so, dass er deinen Namen, Spitznamen oder zumindest deine Initialen abläuft.

Slides Variablen & 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.

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):

  1. Quadrat
  2. Dreieck
  3. Sechseck

Aufgabe B2

Zeichne eine Treppe mithilfe einer Variable und einer Schleife:

Aufgabe B3

Zeichne folgende Figur (Variable optional):

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.

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.

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

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() 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.

Aufgabe D1

Zeichne ein farbiges Quadrat mit dicken Linien und einer Hintergrundfarbe:

Aufgabe D2

Zeichne einen Smiley:

Aufgabe D3

Zeichne eine Ampel:

Slides 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.

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

  1. 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.

  2. 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.

Race

  1. 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.
  2. Zeige nachher die Turtle wieder an mit .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:

  • 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.

Aufgabe G1

Berechne mithilfe von Python. Verwende dazu die Rechenoperatoren in der Tabelle oben.

  1. $62342+43169 = $
  2. $287 \cdot 63 = $
  3. $7731 : 532 = $
  4. $\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!

Tipps:

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

Zeichne mit einer Turtle die folgende eckige Spirale:

Tipp 1:

Tipp 2:

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.“

Tipps:

Aufgabe G7

Zeichne mit einer Turtle die folgende Spirale:

Tipps:

Aufgabe G8

Zeichne mit einer Turtle die folgende Figur:

Tipps:

Aufgabe G9

Zeichne mit einer Turtle die folgende Figur:

Tipps:

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.

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!

Tipps:

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.

Tipps:

Aufgabe H5

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:

  1. Schreibe den Code in eine Endlosschleife:
while True:
    # hier kommt der Codeblock,
    # der wiederholt werden soll
  1. 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!")

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.

Löse die Aufgaben so elegant wie möglich. Verwende z.B. wann immer möglich Schleifen.

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

Aufgabe: Lord of the Rings

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.

Lösungen A

Lösungen B

Lösungen C

Lösungen D

Lösungen E

Lösungen G

Aufgaben H

Aufgaben I

  • gf_informatik/programmieren_i_sca.txt
  • Zuletzt geändert: 2025-01-07 11:01
  • von sca