==== Aufgaben NC – Gemischte Aufgaben zu Funktionen ====
Die folgenden Aufgaben behandeln Funktionen mit und ohne Argumente oder Rückgabewerte.
=== NC1 – Hexagons are the Bestagons ===
- Schreibe eine Funktion ''hexagon()'', die deine Turtle ein Sechseck zeichnen lässt.
- Verwende anschliessend diese Funktion in einer while-Schleife, um sechs Sechsecke zu zeichnen, sodass in der Mitte ein siebtes entsteht (Siehe Bild).
{{:gf_informatik:programmieren_iv_gra:pasted:20250419-100942.png?300}}
Wenn du das geschafft hast, darfst du folgendes Video schauen: [[https://youtu.be/thOifuHs6eY?si=yKl7z6uLPcnUuNi6|Hexagons are the Bestagons]].
=== NC2 – Random Dots ===
{{:gf_informatik:programmieren_iv_gra:pasted:20250514-084206.png?500}}
- Schreibe eine Funktion ''punkte(min, max, farben)'' gemäss folgenden Anforderungen:
- Die Argumente ''min'' und ''max'' geben an, wie viele Punkte mindestens und höchstens gezeichnet werden.
- Das Argument ''farben'' ist eine **Liste** mit Farbnamen.
- Die Funktion zeichnet eine zufällige Anzahl Punkte (20 px) im gewünschten Bereich.
- Für jedem Punkt wird eine zufällige Farbe aus der Farbliste gewählt.
- Die Position jedes Punktes wird ebenfalls zufällig bestimmt: Die x-Position im Bereich -250 bis 250, die y-Position im Bereich -100 bis 100.
- **Die Funktion gibt zurück, wie viele Punkte sie gezeichnet hat.**
- Schreibe ein Programm, das die Funktion ''punkte'' verwendet:
- Erstelle eine Liste mit vier bis sieben Farben.
- Rufe die Funktion auf (mit beliebigen Werten für min und max sowie mit der Farbliste) und gib eine Meldung in folgender Form aus: "Es wurden 14 Punkte gezeichnet".
=== NC3 – Text rückwärts ===
**Texte** werden in python als **Strings** (engl. "Schnur" oder "Kette") bezeichnet. Ein Text besteht aus mehreren Buchstaben und ist damit eine Aneinanderreihung von Buchstaben – sozusagen eine //Kette// von Buchstaben.
**Strings** haben gewisse Ähnlichkeit mit **Listen**: Auch in Listen sind mehrere Elemente aneinander gehängt. Hier vergleichen wir Listen mit Strings anhand einiger Befehle/Operationen:
Befehle mit Listen:
my_list = [] # Leere Liste erstellen
numbers = [3,9,27] # Liste mit Inhalt erstellen
numbers.append(81) # Der Liste ein Element anfügen
n = numbers[2] # Bestimmtes Element in Liste wählen
print(n) # Gibt 27 aus
Befehle mit Strings:
my_text = "" # Leeren Text erstellen
name = "Immanuel" # Text mit Inhalt erstellen
name = name + " Kant" # Dem Text einen Text anfügen
b = name[5] # Bestimmten Buchstaben im Text wählen
print(b) # Gibt 'u' aus
Die Funktion ''len()'' funktioniert sowohl für Listen als auch für Strings.
Schreibe eine Funktion ''text\_reverse(text)'', die einen Text rückwärts zurückgibt:
* Zum Beispiel soll der Aufruf ''text\_reverse("Roti Rösli im Garte")'' den Text "etraG mi ilsöR itoR" zurückgeben.
* **Verwende eine While-Schleife**, um durch den String (den Text) zu gehen.
* Hinweis: Python böte mit der [[https://www.w3schools.com/python/gloss_python_string_slice.asp|String-Slicing-Syntax]] eine sehr kurze Lösung für diese Aufgabe. Wir verzichten hier aber auf String Slicing und bleiben vorerst bei der guten alten while-Schleife.
* Teste deine Funktion.
=== NC4 – Abstände ersetzen ===
Schreibe eine Funktion ''replace\_spaces(text, char)''. Die Funktion ersetzt alle Abstände (spaces) in ''text'' durch das Zeichen ''char'' und gibt den neuen Text zurück. Zum Beispiel gibt der Aufruf ''replace\_spaces("Roti Rösli im Garte", '-')'' den Text "Roti-Rösli-im-Garte" zurück. Teste deine Funktion.
* Hinweis: Mit eckigen Klammern können wir zwar einen Buchstaben aus einem String //auslesen//. Anders als bei Listen können wir die eckigen Klammern aber nicht nutzen, um einen bestimmten Buchstaben eines Strings zu verändern.
=== NC5 – Crimson & Clover (Optional) ===
Crimson & Clover ist der Titel [[https://youtu.be/-wXJ1WN3GR4?si=ngF7kK59Rw1MqoYx|dieses Liedes]] von Tommy James and the Shondells.
{{:gf_informatik:programmieren_iv_gra:pasted:20250508-195423.png?300}} {{:gf_informatik:programmieren_iv_gra:pasted:20250508-195521.png?210}}
== Schritt 1 – Herzblatt ==
Schreibe eine Funktion ''herzblatt(seite, farbe)'', die ein farbiges Herzblatt gemäss der Zeichnung rechts malt:
* Das Argument ''seite'' bestimmt die Seitenlänge des Quadrats im Herzblatt.
* Das Argument ''farbe'' bestimmt die Farbe des Herzblatts.
* Verwende die Turtle-Funktionen ''setFillColor(color)'', ''startPath()'' und ''fillPath()''.
* Teste die Funktion.
{{:gf_informatik:programmieren_iv_gra:pasted:20250508-100926.png?150}}
{{:gf_informatik:programmieren_iv_gra:pasted:20250509-060712.png?150}}
== Schritt 2 – Kleeblätter ==
Schreibe eine weitere Funktionen ''kleeblatt3(radius)'', die ein grünes, dreiblättriges Kleeblatt malt.
* Verwende die eben erstellte Funktion herzblatt.
* Das Argument ''radius'' bestimmt den (inneren) Radius, du kannst es einfach an die Funktion ''herzblatt'' weitergeben.
* Teste die Funktion.
Wiederhole Schritt 2 für eine Funktion ''kleeblatt4(radius)'', die ein dunkelgrünes, vierblättriges Kleeblatt malt.
{{:gf_informatik:programmieren_iv_gra:pasted:20250508-200449.png?150}}
{{:gf_informatik:programmieren_iv_gra:pasted:20250509-060512.png?150}}
== Schritt 3 – Crimson & Clover ==
Schreibe ein Programm, das die Kleeblatt-Funktionen verwendet und eine zufällige Wiese aus ingesamt 30 Purpur-Punkten und Kleeblättern malt, ähnlich dem Bild rechts:
* Jede siebte Figur ist ein vierblättriges Kleeblatt.
* Jede dritte Figur ist dreiblättriges Kleeblatt.
* Alle anderen Figuren sind Purpur-Punkte.
* Die Grösse jedes Kleeblatts oder Punktes wird jeweils zufällig bestimmt.
* Beachte die Hinweise in Aufgabe NA4.
{{:gf_informatik:programmieren_iv_gra:pasted:20250509-060413.png?300}}
== Zusatzaufgabe (Optional) ==
Verbessere deine Herzblatt-Funktion: ''herzblatt2(seite, farbe1, farbe2)'' soll ein //zweifarbiges// Herzblatt zeichnen. Wie im nebenstehenden Bild.
* Um ein Herz auf diese Weise zu zeichnen, benötigst du die Funktion ''sqrt()'', die die Quadratwurzel (square root) aus einer Zahl ermittelt. Hierzu musst du das Modul ''math'' importieren:
import math
print(math.sqrt(4))
{{:gf_informatik:programmieren_iv_gra:pasted:20250509-101538.png?250}}
=== NC6 – Wörter rückwärts (Challenge) ===
Schreibe eine Funktion ''words\_reverse(text)'', die die Wortfolge eines Textes umdreht und den neuen Text zurückgibt. Zum Beispiel soll der Aufruf words\_reverse("Roti Rösli im Garte") den Text "Garte im Rösli Roti" zurückgeben.
== Schritt 1 ==
Schreibe zuerst eine Funktion ''word\_list(text)'', die jedes einzelne Wort in ''text'' in einer Liste auflistet und diese Liste zurückgibt. Teste die Funktion.
== Schritt 2 ==
Schreibe nun die Funktion ''words\_reverse(text)'' mithilfe der Funktion ''word\_list(text)''. Teste die Funktion.
==== Lösungen ====
++++Lösungen zu Aufgaben NC:|
=== NC1 ===
from gturtle import*
karl = Turtle()
def hexagon():
side_count = 0
while side_count < 6:
karl.forward(50)
karl.right(60)
side_count = side_count + 1
hex_count = 0
while hex_count < 6:
hexagon()
karl.forward(50)
karl.left(60)
hex_count = hex_count + 1
=== NC2 ===
import random
from gturtle import *
flori = Turtle()
def punkte(min, max, colors):
i = 0
anz = random.randint(min, max)
while i < anz:
xpos = random.randint(-250,250)
ypos = random.randint(-100,100)
flori.setPenColor(colors[random.randint(0,len(colors)-1)])
flori.setPos(xpos, ypos)
flori.dot(20)
i = i + 1
return i
farben = ["red", "blue", "green", "orange"]
anz_punkte = punkte(5, 40, farben)
print(f"Es wurden {anz_punkte} Punkte gezeichnet.")
=== NC3 ===
Variante mit While-Schleife:
def text_reverse(text):
new_text = ""
i = len(text)-1
while i >= 0:
new_text = new_text + text[i]
i = i-1
return new_text
print(text_reverse("Roti Rösli im Garte"))
Kurze Variante mit Slice-Syntax (optional):
def text_reverse(text):
return text[::-1]
print(text_reverse("Roti Rösli im Garte"))
=== NC4 ===
def replace_spaces(text, char):
i = 0
new_text = ""
while i < len(text):
if text[i] == ' ':
new_text = new_text + char
else:
new_text = new_text + text[i]
i = i + 1
return new_text
print(replace_spaces("Roti Rösli im Garte", '-'))
=== NC5 ===
import random
from gturtle import *
tommy = Turtle()
tommy.hideTurtle()
tommy.clear("goldenrod")
def herzblatt(seite, farbe):
tommy.setFillColor(farbe)
tommy.startPath()
tommy.forward(seite)
tommy.rightArc(seite/2,180)
tommy.left(90)
tommy.rightArc(seite/2,180)
tommy.forward(seite)
tommy.fillPath()
tommy.right(90)
def kleeblatt3(radius):
i = 0
while i < 3:
herzblatt(radius, "green")
tommy.right(120)
i = i + 1
def kleeblatt4(radius):
i = 0
while i < 4:
herzblatt(radius, "darkgreen")
tommy.right(90)
i = i + 1
i = 1
while i < 30:
xpos = random.randint(-250,250)
ypos = random.randint(-100, 100)
size = random.randint(20,30)
tommy.setPos(xpos, ypos)
if i % 7 == 0:
kleeblatt4(size)
elif i % 3 == 0:
kleeblatt3(size)
else:
tommy.setPenColor("crimson")
tommy.dot(size)
i = i + 1
=== NC5 Zusatzaufgabe===
import random
import math
from gturtle import *
tommy = Turtle()
tommy.hideTurtle()
tommy.clear("lightpink")
def herzblatt2(seite, farbe1, farbe2):
tommy.setFillColor(farbe1)
tommy.startPath()
tommy.forward(seite)
tommy.rightArc(seite/2,180)
tommy.right(45)
tommy.forward(seite*math.sqrt(2))
tommy.fillPath()
tommy.setFillColor(farbe2)
tommy.startPath()
tommy.left(135)
tommy.forward(seite)
tommy.leftArc(seite/2,180)
tommy.left(45)
tommy.forward(seite*math.sqrt(2))
tommy.fillPath()
def kleeblatt3(radius):
i = 0
while i < 3:
herzblatt2(radius, "forestgreen", "green")
tommy.right(15)
i = i + 1
def kleeblatt4(radius):
i = 0
while i < 4:
herzblatt2(radius, "darkgreen", "007200")
tommy.right(45)
i = i + 1
i = 1
while i < 30:
xpos = random.randint(-250,250)
ypos = random.randint(-100, 100)
size = random.randint(20,30)
tommy.setPos(xpos, ypos)
if i % 7 == 0:
kleeblatt4(size)
elif i % 3 == 0:
kleeblatt3(size)
else:
tommy.setPenColor("crimson")
tommy.dot(size)
i = i + 1
=== NC6 ===
def word_list(text):
words = []
word = ""
i = 0
while i < len(text):
if text[i] == ' ': # Leerzeichen
words.append(word)
word = ""
else:
word = word + text[i]
i = i + 1
words.append(word)
return words
def words_reverse(text):
words = word_list(text)
new_text = ""
i = len(words) - 1
while i >= 0:
new_text = new_text + words[i] + " "
i = i - 1
return new_text
print(words_reverse("Roti Rösli im Garte"))
++++