Listen https://wiki-gts-11-1.gts-leipzig.de/en/oop/liste
https://compute-it.toxicode.fr/?progression=python
https://silentteacher.toxicode.fr/hour_of_code.html?theme=basic_python
Für die Klausur zugelassen:
Definition: Algorithmus
Ein Algorithmus ist eine Verarbeitungsvorschrift, die aus einer endlichen Folge von eindeutig ausführbaren Anweisungen besteht, mit der man eine Vielzahl gleichartiger Aufgaben lösen kann.
Ein Algorithmus gibt an, wie Eingabegrößen schrittweise in Ausgabegrößen umgewandelt werden.
| Eigenschaften | Beschreibung |
|---|---|
| Finitheit | Endliche Beschreibung des Algorithmus (endliche Anzahl von Codezeilen) |
| Terminiertheit | Ausführung endet für alle Eingaben in endlicher Zeit |
| Deterministisch | Es gibt zu jedem Zeitpunkt der Ausführung nur eine Möglichkeit der Fortsetzung. |
| Determiniertheit | Gleiche Startbedingungen führen zum gleichen Ergebnis. Ein deterministischer Algorithmus ist determiniert, aber nicht umgekehrt. |
| Ausführbarkeit | jede Anweisung muss für den Prozessor (den Ausführenden) verständlich und umsetzbar sein; jeder Algorithmus ist demzufolge nur ein Algorithmus bezüglich eines Prozessors |
| Allgemeingültigkeit | das Verfahren löst eine Klasse von Problemen (nicht nur ein singuläres) |
Aufgabe 1:
Entscheiden Sie begründet, ob es für folgenden Probleme Algorithmen gibt, die alle Eigenschaften erfüllen.
Aufgabe 2:
Welche Eigenschaften erfüllen folgende Algorithmen nicht?
Es existieren unterschiedliche Ansätze, Software zu entwickeln und Probleme zu lösen. Dabei werden verschiedene Programmierparadigmen unterschieden.
Ein Paradigma (Plural Paradigmen) ist eine grundsätzliche Denkweise.
Übersetzt aus dem griechischen bedeutet es „Beispiel, Vorbild, Muster“ auch „Weltsicht“ oder „Weltanschauung“.
Quelle: https://de.wikipedia.org/wiki/Paradigma
In der imperativen Programmierung beschreibt man WIE ein Ergebnis Schritt für Schritt erreicht wird, während man in der deklarativen Programmierung angibt, WAS das Ergebnis sein soll, ohne den genauen Ablauf festzulegen.

Programme werden in Prozeduren (auch Funktionen oder Methoden genannt) unterteilt werden. Der Fokus liegt auf einer schrittweisen Abarbeitung von Anweisungen. Grundstrukturen
Hier ein Wiederholung der prozeduralen Konzepte prozedural
https://strivemath.org/ide
Tolle Tutorials beim @Coding Train
Aufgabe 1:
Implementieren Sie einen Ball, der von der oberen Seite des Canvas nach unten fällt.Erweitern Sie das Programm:
a) Bälle die das Feld unten verlassen, erscheinen wieder oben.
b) 3 Bälle an unterschiedlien zufälligen Positionen.
c) Bälle in unterschiedlichen Farben.
d) Bälle fallen mit unterschiedlichen Geschwindigkeiten.
e) Neben Bällen auch Quadrate, Dreiecke, usw.
f) Bälle ändern beim Anklicken die Farbe.
# Fallender Ball
# Eigenschaften des Balls
pos_x = windowWidth / 2
pos_y = windowHeight
# Methode einmal zum Start ausgeführt
def setup():
createCanvas(windowWidth,windowHeight)
# Methode zeichnet einen Frame / wird unendlich häufig ausgeführt
def draw():
# Nötig um Variablenwerte zu ändern
global pos_x, pos_y
# Zurücksetzen des Bildes
background("black")
# Ball zeichnen
fill(200,200,200)
circle(pos_x, pos_y, 20)
# Neue Position berechnen und zurücksetzen falls Ball das Bild verlässt
pos_y = pos_y - 10
if pos_y < 0:
pos_y = windowHeight
pos_x = random(0, windowWidth)
Probleme bei der Umsetzung
Die Implementierung eines Balls war verhältnismäßig einfach. Aber das Hinzufügen neuer Bälle führte zu vielfältigen Problemen. Für jeden Ball mussten alle Eigenschaften (Variablen für x-Position, y-Postion, Geschwindigkeit, Farbe) kopiert und umbenannt werden. Zudem musste der Code für das Verhalten des Balls (Bewegung und Wiedererscheinen nach dem Verlassen des Feldes) kopiert und angepasst werden.
Mit dem prozeduralem Paradigma scheinen wir hier an unseren Grenzen zu stoßen.
Es gibt viele Merkmale guten Codes wie zum Beispiel
Ständige Wiederholungen im Code gehören sicher nicht dazu. Zukünftig wollen wir folgendes Prinzip für guten Code einhalten.
DRY = “Don’t Repeat Yourself”
Zentrales Prinzip in der Softwareentwicklung, nachdem jede Information, Logik oder Struktur nur einmal im Code existieren sollte. Wird dieselbe Logik an mehreren Stellen wiederholt, erhöht das die Wahrscheinlichkeit von Fehlern, erschwert die Wartung und macht Änderungen aufwendiger, weil man sie an vielen Stellen gleichzeitig durchführen müsste.
Zur Verbesserung der Code-Qualität kann das objektorientierte Paradigma angewendet werden
Umsetzung der fallenden Bälle in OOP
| Ball |
|---|
| + pos_x:int + pos_y:int + diameter:int + speed_y:int + color: tuple[int,int,int] |
| # Konstruktur + __init__(speed_y:int): Ball + draw(): None + move(): None |
Die Grafik kann auch als Klasse dargestellt werden (auch wenn hier ohne class implementiert, wird vom Framework eine Klasse erstellt).
| Grafik |
|---|
| + baelle:list[Ball] |
| + setup(): None + draw(): None |
Hier die Umsetzung der Klasse Ball: https://strivemath.org/ide/34c70ea5-5727-4788-be36-4f53914b2037?panelSize=50&consoleSize=20&fontSize=16&autoscale=false&autorun=true
Die Weiteren Aufgaben zur Objektorientierung findet ihr hier OOP Aufgabe
Ohne es zu wissen habt ihr die ganze Zeit schon mit Klassen gearbeitet. In Python ist alles eine Klasse. Auch die Datentypen
| String |
|---|
| Liste |
|---|
Schauen wir uns die Listen nochmal genau an.
Listen werden angelegt mit [] aneglegt. In die eckigen Klassen können Elemente in die Liste eingefügt werden.
liste_leer = []
liste_primzahlen = [2,3,5,7,11]
liste_zutaten = ["Eier", "Mehl", "Zucker"]
Mit der Methode append(...) können neue Elemente hinzugefügt werden
liste_primzahlen.append(13)
liste_zutaten.append("Salz")
Mit der for-Schleife kann auf jedes Element nacheinander zugegriffen werden
for primzahl in liste_primzahlen:
print(primzahl)
for zutat in liste_zutaten:
print(zutat)
Die Funktion len([1,2,3]) gibt die Länge einer Liste zurück.
print(len([]))
print(len([1,2,3,4,5]))
print(len(range(10,20,2)))
Jedes Element einer Liste bekommt einen Index. Dieser beginnt bei 0. Für die Liste ["Eier", "Mehl", "Zucker"] bekommt Eier den Index 0, Mehl den Index 1 und Zucker den Index 2.
Mit liste[index] kann auf das Element mit dem index einer Liste zugegriffen werden.
liste_zutaten = ["Eier", "Mehl", "Zucker"]
print(liste_zutaten[0])
print(liste_zutaten[1])
print(liste_zutaten[2])
# Fehler!
print(liste_zutaten[3])
Man kann auch die range-Funktion nutzen, um sich die Indizes generieren zu lassen.
liste_zutaten = ["Eier", "Mehl", "Zucker"]
for i in range(len(liste_zutaten)):
print("Index", i , liste_zutaten[i])
Elemente der Liste können über den Index geändert werden.
liste_zutaten = ["Eier", "Mehl", "Zucker"]
liste_zutaten[0] = "Bio-Eier"
liste_zutaten[1] = "Bio-Mehl"
liste_zutaten[2] = "Salz"
print(liste_zutaten)
Aufgabe
a) Erstellen Sie eine Liste mit 5 Vornamen aus dem Kurs.
b) Geben Sie das Elemente an Index 1 aus.
c) Geben Sie den Elemente der Liste mit der for-Schleife aus.
d) Geben Sie die Länge der Liste aus.
e) Geben Sie das letzte Element aus.
f) Ändern Sie das Element an Index 2 zu "Gerda"
g) Tauschen Sie die Elemente an Index 0 und 1
Für schnelle: https://www.geeksforgeeks.org/python/python-list-slicing/