lehrkraefte:snr:informatik:bruehl-2022:funktionen

Funktionen

Besprechung der Hausaufgaben

  • Funktionen oder: Wie man grössere Programm übersichtlich gestaltet: modularer Entwurf, Baukastenprinzip.

Gemeinsam an Tafel

Wenn man ein Haus baut, welche Arbeiten müssen durchgeführt werden? Reihenfolge egal, denkt an die beteiligten Handwerker.

Was zeichnet “Gesellschaften” von Menschen oder Tieren aus, die besonders “erfolgreich” sind?

Was zeichnet “Gesellschaften” von Menschen oder Tieren aus, die besonders “erfolgreich” sind?

Arbeitsteilung, hoher Spezialisierungsgrad. Zum Beispiel gibt es laut Wikipedia: Arbeitsteilung aktuell in Deutschland etwa 24'000 Berufe! Die “Höhlenmenschen” hatten viel weniger “Berufe”.

Das Aufteilen einer grösseren Vorhabens in Teilvorhaben, die sogenannten Module, nennt man Modularisierung, auch modularen Entwurf oder Baukastenprinzip.

In der Informatik wird dies oft durch Funktionen bewerkstelligt. “Funktionen sind die Spezialisten beim Programmieren.”

Wir haben schon viele Funktionen kennengelernt und verwendet, z. B. print, input, forward, right, penUp, makeTurtle, setPenColor, random.

Funktionen werden aufgerufen (Funktionsaufruf), indem man den jeweiligen Funktionsnamen angibt und danach in runden Klammern geeignete Parameter (= Übergabewerte) angibt.

Die runden Klammern sind beim Funktionsaufreu stets hinzuschreiben, auch wenn keine Parameter übergeben werden.

Beispiele:

  • setPenColor(“red”) ist ein Aufruf der Funktion setPenColor mit “red” als Parameter.
  • penUp() ist ein Aufruf der Funktion penUp; diese Funktion nimmt keine Parameter entgegen.

Zum besseren Verständnis ist es sinnvoll, Funktionen in vier Arten einzuteilen, je nachdem, ob sie

  • Parameter (= Übergabewerte) benötigen oder nicht;
  • einen Rückgabewert zurückgeben oder nicht.

In der folgenden Tabelle ist für jeder dieser vier Arten ein Beispiel angegeben und darunter ein Aufruf der Funktion.

Funktionen ohne Parameter mit Parameter(n)
ohne Rückgabewert makeTurtle penWidth
makeTurtle() penWidth(10)
mit Rückgabewert random input
random() input(“Wie heisst du?”)

Grob gesagt kann man Aufrufe (und Definitionen, siehe unten) von Funktionen daran erkennen, dass nach ihnen ein Paar runder Klammern (mit oder ohne Parameter dazwischen) auftaucht!

Beachte: Sogenannte Schlüsselworte wie repeat, if, else, while etc. sind keine Funktionen. Sie werden verwendet, um den Ablauf von Python-Programmen zu steuern.

Die Zusatzinformation, die sie entgegennehmen (etwa die 13 in repeat 13: oder die Bedingung x == 2 in if x == 2:) wird bei gutem Programmierstil NICHT in runde Klammern eingeschlossen.

Also bitte nicht repeat(13): oder if(x==2): schreiben (auch wenn es keine Fehlermeldung gibt).

In den folgenden Aufgaben lernst du durch Beispiele, wie du selbst neue Funktionen definieren kannst.

Die folgende Tabelle stellt dar, welche Aufgabe sich mit welcher Art von Funktion beschäftigt und welche Funktionen darin definiert werden.

Funktionen ohne Parameter mit einem Parameter
ohne Rückgabewert Aufgabe 2 Aufgabe 3
quadrat100, dreieck100 quadrat, vieleck

Statt sofort mit Aufgabe 2 zu beginnen, programmieren wir zusammen.

Ungefähr das hier Versteckte.

Ungefähr das hier Versteckte.

Erst

forward(50)
right(150)
forward(50)
left(150)

im Hauptprogramm, dann als Funktion spitze (erst gar nicht aufrufen, schreibe # Definition der Funktion dazu), dann einmal aufrufen (schreibe # Aufruf der Funktion dazu), dann mehrfach aufrufen (repeat 7:) für Zick-zack-Linie/Treppe, dann nach Funktionsaufruf nach rechts drehen (erst Primzahlwinkel, etwa 61; dann 360/7).

Am Ende steht folgendes da:

Am Ende steht folgendes da:

from gturtle import *
 
def spitze():     # Definition der Funktion spitze
    forward(50)
    right(150)
    forward(50)
    left(150)     # Ende der Definition der Funktion spitze
 
makeTurtle()
 
repeat 7:
    spitze()       # Aufruf der Funktion spitze
    #right(61)
    right(360/7)

Einzelarbeit, ca. 10 Minuten

Der folgende Code definiert eine Funktion quadrat100 (die keine Parameter entgegennimmt).

Das Schlüsselwort def für englisch define leitet die Definition einer neuen Funktion ein, danach kommt der Funktionsname mit runden Klammern (hier ohne Parameter darin) und danach ein Doppelpunkt. Der eingerückte Code-Block beschreibt genau, was die Funktion macht.

from gturtle import *
 
# In der folgenden Zeile beginnt die Definition der Funktion
def quadrat100():
    repeat 4:
        forward(100)
        right(90)
 
# Hier ist die Definition der Funktion dreieck100 zu ergänzen.        
 
# In der folgenden Zeile beginnt das Hauptprogramm
makeTurtle()
 
# Ergänze den Code.
  • Öffne ein neues, leeres Programmfenster in Tigerjython und kopiere das obige Programm hinein.
  • Ergänze das Programm an der angegebenen Stelle um eine Funktion dreieck100, die ein gleichseitiges Dreieck der Seitenlänge 100 zeichnet; dabei soll die Turtle jeweils “nach links abbiegen” und am Ende im selben Zustand wie am Anfang sein.
  • Ergänze das Hauptprogramm und nutze die Funktion dreieck100, um die Figur unten links zu zeichnen (mit möglichst wenig Code-Zeilen).
  • Etwas schwieriger: Ändere das Hauptprogramm und nutze die beiden Funktionen quadrat100 und dreieck100, um die Figur unten rechts zu zeichnen.

Einzelarbeit, ca. 10 Minuten

Zusätzliche mündliche Erklärung durch mich: Der folgende Code definiert eine Funktion quadrat mit einem Parameter s, der die Seitenlänge des Quadrats angibt. Der Parameter s wird innerhalb der Funktionsdefinition wie eine Variable verwendet. Welchen Wert diese Variable hat, wird bei jedem Funktionsaufruf angegeben. Zeige es im Einzelschrittverfahren!

from gturtle import *
 
# In der folgenden Zeile beginnt die Definition der Funktion
def quadrat(s):
    repeat 4:
        forward(s)
        right(90)
 
# In der folgenden Zeile beginnt das Hauptprogramm
makeTurtle()
 
quadrat(100)           # Aufruf der Funktion mit 100 als Parameter/Übergabewert
 
#
#x = 100
#repeat 7:
#    quadrat(x)           # Aufruf der Funktion mit dem Wert von x als Parameter
#    x = x + 20

(Für das Folgende kannst du entweder ein neues Programm schreiben oder das obige Programm in eine neues Programmierfenster kopieren und modifizieren.)

Schreibe nun selbst eine Funktion vieleck, die einen Parameter n entgegennimmt und ein regelmässiges $n$-Eck der Seitenlänge 50 zeichnet; die Turtle soll am Ende im selben Zustand wie am Anfang sein. Nutze deine Funktion, um die folgende Figur zu zeichnen (ein Dreieck in einem Viereck in einem Fünfeck … undsoweiter … in einem 13-Eck).

Einzelarbeit, ca. 20 Minuten

Ziel ist, das linke Muster effizient zu zeichnen. Gewisse Teilstrukturen wiederholen sich: Das rote Ornament im Muster rechts kommt $8+5+8+5 = 26$ Mal vor, der grüne Pfad als “verbindende Eckbewegung” 4 Mal. Deshalb ist es sinnvoll, diese Teilstrukturen von Funktionen zeichnen zu lassen.

Schreibe wie folgt ein Programm dafür:

  1. Definiere eine Funktion ornament: Sie soll den roten Streckenzug im rechten Muster zeichnen (links oben beginnend, wobei wir annehmen, dass die Turtle aktuell nach rechts schaut; am Ende soll sie dieselbe Blickrichtung haben wie am Anfang). Hinweis: Die roten Teilstücke sind 60, 40 und 20 Pixel lang.
  2. Teste deine Funktion ornament.
  3. Definiere eine Funktion wiederholeOrnament mit Parameter n: Sie soll n Mal die Funktion ornament aufrufen. (Dabei lernst du, dass eine Funktion eine andere aufrufen kann!)
  4. Definiere eine Funktion eckBewegung: Sie soll den grünen Streckenzug zeichnen (rechts unten beginnend, wobei wir annehmen, dass die aktuelle Blickrichtung rechts ist; die Turtle soll dann am Ende nach oben schauen).
  5. Schreibe nun das Hauptprogramm und verwende darin diese Funktionen in geschickter Weise, so dass ein Muster wie rechts oben (aber alles in Schwarz) entsteht. (Wenn du es genauso gross zeichnen willst, musst du die Schildkröte anfangs in die linke untere Ecke des Fensters bewegen und in die richtige Richtung schauen lassen.)
  6. Setze schliesslich die Stiftdicke auf 10, um das linke Muster zu bekommen.

Wenn du Hilfe benötigst: Hier ist das Gerüst eines Python-Programms für eine mögliche Lösung.

Wenn du Hilfe benötigst: Hier ist das Gerüst eines Python-Programms für eine mögliche Lösung.

from gturtle import *    
 
def ornament():
    print("Bitte definiere mich!")
    # Zu ergänzen.
 
def wiederholeOrnament(n):
    print("Bitte definiere mich!")
    # Zu ergänzen.
 
def eckBewegung():
    print("Bitte definiere mich!")
    # Zu ergänzen.
 
makeTurtle()
hideTurtle()
 
# Bewege die Turtle nach links unten und lass sie nach rechts schauen.
penUp()
backward(180)
right(90)
backward(290)
penDown()
 
setPenColor("black")
penWidth(2)
 
# Hier sind die oben definierten Funktionen in geeigneter Weise aufzurufen, eventuell mit repeat 2.

Bonusaufgaben (bitte ausklappen)

Bonusaufgaben (bitte ausklappen)

Zeichne ähnliche Muster! Zur Inspiration:

  • Aufgabe 4 (Mäander) oder eine Variation deiner Wahl davon von ähnlicher Schwierigkeit

Abgabe bis spätestens Sonntagabend 23:59 Uhr vor der nächsten Doppellektion über den folgenden Link:

  • Wozu sind Funktionen gut?
  • Wie unterscheiden sich Funktionsaufruf und Funktionsdefinition?
  • Was ist ein Parameter?

Python ist relativ tolerant, wo man Funktionen definiert. Trotzdem ist die folgende Reihenfolge zu empfehlen:

# Import von Bibliotheken
from ... import ...
 
# Definitionen von Funktionen
def ...:
 
def ...:
 
# Beginn des Hauptprogramms, z. B. mit
makeTurtle()
  1. Zuerst import-Anweisungen – sie stellen Funktionen (aus sogenannten Bibliotheken) bereit, die andere Leute bereits definiert haben.1)
  2. Leerzeile
  3. Funktionsdefinitionen (jeweils mit def eingeleitet); man nennt Funktionen auch Teil- oder Unterprogramme; gibt es mehrere Funktionsdefinitionen, so werden sie durch mindestens eine Leerzeile getrennt.
  4. Leerzeile
  5. Hauptprogramm (erst hier steht so etwas wie makeTurtle())

Im Übrigen ist es guter Stil, Kommentare im Programm anzubringen (alles nach # wird vom Computer ignoriert). Beispielsweise ist es zu empfehlen, bei jeder Funktion dazuzuschreiben, was sie tut und wie sie von eventuellen Parametern abhängt. Auch Leerzeilen machen ein längeres Programm oft übersichtlicher.

Hier ist ein Beispiel eines gut strukturierten und kommentierten Programms (beachte, dass eine Funktion auch eine andere Funktion aufrufen kann):

Hier ist ein Beispiel eines gut strukturierten und kommentierten Programms (beachte, dass eine Funktion auch eine andere Funktion aufrufen kann):

# Header: Anweisungen zum Import von Funktionen aus Bibliotheken
from gturtle import *
from random import *
 
# Definitionen von Funktionen
 
# Die folgende Funktion setzt die Farbe der Schildkröte zufällig auf rot, grün oder blau.
def waehleZufallsFarbe():
    z = random()
    if z < 0.3333:
        setPenColor("red")
    elif z < 0.6666:
        setPenColor("blue")
    else:
        setPenColor("green")
 
# Die folgende Funktion zeichnet ein regelmässiges n-Eck. Die Farbe jeder Seite wird zufällig gewählt.
def vieleck(n):
    repeat n:
        waehleZufallsFarbe()
        forward(60)
        right(360/n)
 
# Beginn des Hauptprogramms
 
# Erzeuge die Turtle in Fenstermitte mit Blickrichtung nach vorne, mach sie unsichtbar und setze die Stiftdicke auf 4.
makeTurtle()
hideTurtle()
penWidth(4)
 
# Bewege die Turtle ohne zu zeichnen 280 Pixel zurück.
penUp()
backward(280)
penDown()
 
# Zeichne sukzessive eine 3-Eck, ein 6-Eck etc. bis zum 18-Eck. Dazwischen wird die Turtle unsichtbar etwas nach vorne bewegt.
m = 3
repeat 6:
    vieleck(m)
    m = m + 3
    penUp()
    forward(70)
    penDown()

Zusammenfassung und Feedback

Was hast du gelernt? Wozu ist es gut? Erst selbst überlegen!

Was hast du gelernt? Wozu ist es gut? Erst selbst überlegen!

  • Modularisierung / modularer Entwurf / Baukastenprinzip
  • Ich weiss, wie man Funktionen mit/ohne Parameter und mit/ohne Rückgabewert definiert.
  • Funktionen dienen der besseren Strukturierung von Programmen.
  • Sie sind besonders nützlich, wenn man gewisse Programmteile mehrfach verwenden möchte.
  • Teilweise: Ich weiss, wie man mit Strings rechnet (Addition zweier Strings, Multiplikation eines Strings mit einer Zahl) und was “\n” bedeutet. </hidden>

Schreibt bitte auf die Post-it-Zettel:

  • Was euch heute gefallen hat.
  • Statt aufzuschreiben, was euch nicht gefallen hat: Macht einen Verbesserungsvorschlag, was ich das nächste Mal besser machen soll.

Nutze die beiden “aufklappbaren” Programme, um Funktionen stGallen und/oder blume zu definieren. Verwende diese kreativ. Beispielsweise kannst du

  1. Bilder wie unten abgebildet zeichnen;
  2. das Zeichenprogramm aus dem Abschnitt über if-Selektion erweitern, so dass auf Tastendruck das St. Galler Wappen (etwa per Taste s wie St. Gallen) oder die Blume (etwa per Taste f wie flower) gezeichnet wird.

Hier ist der Code von Esteban versteckt, der das St. Galler Wappen zeichnet.

Hier ist der Code von Esteban versteckt, der das St. Galler Wappen zeichnet.

# Dank an Esteban für das Zeichnen des Wappens!
# Ich habe seinen Code etwas modifiziert, so dass das Erstellen der Funktion leichter geht.
 
from gturtle import *
makeTurtle()
hideTurtle()
 
# Speichere aktuelle Position und Richtung etc.
x = getX()
y = getY()
h = heading()
d = getPenWidth()
penFarbe = getPenColor()
fuellFarbe = getFillColor()
 
 
# Bewege zum Punkt links am Wappen, wo Krümmung beginnt
setPenColor("black")
penUp()
left(90)
repeat 90:
    forward(1)
    right(1)
penDown()
 
# Male Wappenumrandung.
setFillColor("white")
startPath()
penWidth(5)
right(180)
repeat 180:
    left(1)
    forward(1)
forward(100)
left(90)
forward(115)
left(90)
forward(100)
 
# Färbe Inneres des Wappens weisst.
fillPath()
 
# Gehe unsichtbar nach innen.
penWidth(2)
penUp()
forward(40)
left(90)
forward(55)
penDown()
 
# Zeichne Rutenbündel mit Beil
forward(5)
left(90)
forward(10)
right(90)
forward(12.5)
left(90)
forward(90)
left(90)
forward(12.5)
right(90)
forward(9.5)
right(45)
forward(5)
left(90)
forward(5)
right(45)
forward(9.5)
left(90)
forward(5)
left(90)
forward(9.5)
right(90)
forward(4)
right(45)
forward(14)
left(90)
 
# Klinge des Beils
repeat 9:
    left(8.2)
    forward(2.9)
left(93)
forward(14)
right(32)
forward(4)
right(90)
forward(9.5)
right(90)
forward(12.5)
left(90)
forward(90)
left(90)
forward(12.5)
right(90)
forward(10)
left(90)
forward(5)
penUp()
forward(5)
setFillColor(0, 143, 55)
fill()
 
# Setze Turtle auf gespeicherte Position und Richtung etc.
penUp()
moveTo(x,y)
setHeading(h)
penWidth(d)
setPenColor(penFarbe)
setFillColor(fuellFarbe)
penDown()

Hier ist der Code von Gioia versteckt, der eine Blume zeichnet.

Hier ist der Code von Gioia versteckt, der eine Blume zeichnet.

# Dank an Gioia!
# Ich habe ihren Code etwas modifiziert (aber nicht besonders elegant), so dass das Erstellen der Funktion leichter geht.
from gturtle import *
makeTurtle()
hideTurtle()
#speed(2000)
 
# Speichere aktuelle Position und Richtung etc.
x = getX()
y = getY()
h = heading()
d = getPenWidth()
penFarbe = getPenColor()
 
f = 0.4 # Verkleinerungsfaktor,
        # denn Gioias Blume war mir zu gross. 
        # Alle Streckenangaben in den Zeichenbefehlen werden mit diesem Faktor multipliziert.
        # Wer mag, kann auch diesen Faktor als Parameter an die Funktion übergeben.
 
# Ohne zu zeichnen vom "Fuss des Stängels" zur Blütenmitte gehen (das sind die Stängelzeichenbefehle rückwärts).
penUp()
right(180)
forward(-170 * f)
forward(-69 * f)
right(-90)
forward(-7 * f)
right(-90)
penDown()
 
# Blüte zeichnen.
setPenColor("violet")
penWidth(int(5 * f))
penUp()
forward(60 * f)
setPenColor("pink")
dot(80 * f)
right(120)
forward(60 * f)
penUp()
dot(80 * f)
right(70)
forward(70 * f)
dot(80 * f)
right(75)
penUp()
forward(70 * f)
dot(80 * f)
right(85)
penUp()
forward(70 * f)
dot(80 * f)
 
# Obige Befehle rückwärts, damit wieder in Blütenmitte.
forward(-70 * f)
right(-85)
forward(-70 * f)
right(-75)
forward(-70 * f)
right(-70)
forward(-60 * f)
right(-120)
forward(-60 * f)
 
# Zeichne Rest der Blüte und Stängel.
setPenColor("violet")
dot(60 * f)
right(90)
forward(7 * f)
right(90)
setPenColor("lightgreen")
penUp()
forward(69 * f)
penDown()
penWidth(int(15 * f))
forward(170 * f)
 
# Setze Turtle auf gespeicherte Position und Richtung etc.
penUp()
moveTo(x,y)
setHeading(h)
penWidth(d)
setPenColor(penFarbe)
penDown()

Bitte einfach am Anfang des Programms oder der eingereichten Datei die Frage aufschreiben (mit oder ohne Hashtag # als Kommentareinleitungszeichen am Zeilenanfang).

Link zur Fragebox

Aufgabe 2

Aufgabe 2

from gturtle import *
 
# In der folgenden Zeile beginnt die Definition der Funktion
def quadrat100():
    repeat 4:
        forward(100)
        right(90)
 
def dreieck100():
    repeat 3:
        forward(100)
        left(120)
 
# In der folgenden Zeile beginnt das Hauptprogramm
makeTurtle()
# hideTurtle()
 
# Erstes Muster
repeat 6:
    dreieck100()
    right(60)
 
# Bewege nach rechts
penUp() 
right(90)
forward(370)
left(90)
penDown()
 
# Zweites Muster
repeat 6:
    dreieck100()
    quadrat100()
    forward(100)
    left(360/6)

Aufgabe 3

Aufgabe 3

from gturtle import *
 
def vieleck(x):
    repeat x:
        forward(50)
        right(360/x)
 
makeTurtle()
# hideTurtle()
 
n = 3
repeat 11:
    vieleck(n)
    n = n + 1

Aufgabe 4, Lösung von Vanessa (nur showTurtle() auskommentiert)

Aufgabe 4, Lösung von Vanessa (nur showTurtle() auskommentiert)

from gturtle import*
 
def ornament():
    forward(60)
    right(90)
    forward(40)
    right(90)
    forward(20)
    right(90)
    forward(20)
    left(90)
    forward(20)
    left(90)
    forward(40)
    left(90)
    forward(60)
    left(90)
    forward(60)
    right(90)
 
 
def wiederholeOrnament(n):
    repeat n: 
        ornament()
 
def eckBewegung():
    left(90)
    forward(20)
    left(90)
    forward(60)
    right(90)
 
makeTurtle()
hideTurtle()
 
penUp()
backward(230)
right(90)
backward(310)
penDown()
setPenColor("black")
penWidth(10)
#showTurtle()
repeat 2:
    wiederholeOrnament(8)
    eckBewegung()
    wiederholeOrnament(6)
    eckBewegung()

Kreis aus St. Galler Wappen

Kreis aus St. Galler Wappen

# Dank an Esteban für das Zeichnen des Wappens!
 
from gturtle import *
 
def stGallen():  
 
    # Speichere aktuelle Position und Richtung
    x = getX()
    y = getY()
    h = heading()
    setPenColor("black")
 
    # Bewege zum Punkt links am Wappen, wo Krümmung beginnt
    penUp()
    left(90)
    repeat 90:
        forward(1)
        right(1)
    penDown()
 
    # Male Wappenumrandung.
    setFillColor("white")
    startPath()
    penWidth(5)
    right(180)
    repeat 180:
        left(1)
        forward(1)
    forward(100)
    left(90)
    forward(115)
    left(90)
    forward(100)
 
    # Färbe Inneres des Wappens weisst.
    fillPath()
 
    # Gehe unsichtbar nach innen.
    penWidth(2)
    penUp()
    forward(40)
    left(90)
    forward(55)
    penDown()
 
    # Zeichne Rutenbündel mit Beil
    forward(5)
    left(90)
    forward(10)
    right(90)
    forward(12.5)
    left(90)
    forward(90)
    left(90)
    forward(12.5)
    right(90)
    forward(9.5)
    right(45)
    forward(5)
    left(90)
    forward(5)
    right(45)
    forward(9.5)
    left(90)
    forward(5)
    left(90)
    forward(9.5)
    right(90)
    forward(4)
    right(45)
    forward(14)
    left(90)
 
    # Klinge des Beils
    repeat 9:
        left(8.2)
        forward(2.9)
    left(93)
    forward(14)
    right(32)
    forward(4)
    right(90)
    forward(9.5)
    right(90)
    forward(12.5)
    left(90)
    forward(90)
    left(90)
    forward(12.5)
    right(90)
    forward(10)
    left(90)
    forward(5)
    penUp()
    forward(5)
    setFillColor(0, 143, 55)
    fill()
 
    # Setze Turtle auf gespeicherte Position und Richtung
    moveTo(x,y)
    setHeading(h)
 
makeTurtle()
hideTurtle()
 
n = 21
enableRepaint(False)
 
penUp()
left(90)
forward(150)
right(90)
 
repeat 4 * n:
    stGallen()
    repaint()
    right(360/n)
    forward(40)
    delay(100)

Kreis aus Blumen

Kreis aus Blumen

from gturtle import *
 
def stGallen():  
    hideTurtle()
    x = getX()
    y = getY()
    h = heading()
    d = getPenWidth()
    penFarbe = getPenColor()
    fuellFarbe = getFillColor()
 
    setPenColor("black")
 
    penUp()
    left(90)
    repeat(90):
        forward(1)
        right(1)
    penDown()
 
    setFillColor("white")
    startPath()
    penWidth(5)
    right(180)
    repeat(180):
        left(1)
        forward(1)
    forward(100)
    left(90)
    forward(115)
    left(90)
    forward(100)
    fillPath()
 
    penWidth(2)
    penUp()
    forward(40)
    left(90)
    forward(55)
    penDown()
    forward(5)
    left(90)
    forward(10)
    right(90)
    forward(12.5)
    left(90)
    forward(90)
    left(90)
    forward(12.5)
    right(90)
    forward(9.5)
    right(45)
    forward(5)
    left(90)
    forward(5)
    right(45)
    forward(9.5)
    left(90)
    forward(5)
    left(90)
    forward(9.5)
    right(90)
    forward(4)
    right(45)
    forward(14)
    left(90)
    repeat(9):
        left(8.2)
        forward(2.9)
    left(93)
    forward(14)
    right(32)
    forward(4)
    right(90)
    forward(9.5)
    right(90)
    forward(12.5)
    left(90)
    forward(90)
    left(90)
    forward(12.5)
    right(90)
    forward(10)
    left(90)
    forward(5)
    penUp()
    forward(5)
    setFillColor(0, 143, 55)
    fill()
    moveTo(x,y)
    setPenColor(penFarbe)
    setFillColor(fuellFarbe)
    penWidth(d)
    setHeading(h)
    penDown()
 
def blume():
    hideTurtle()
 
    # Speichere aktuelle Position und Richtung etc.
    x = getX()
    y = getY()
    h = heading()
    d = getPenWidth()
    penFarbe = getPenColor()
 
    f = 0.4 # Verkleinerungsfaktor
    penUp()
    right(180)
    forward(-170 * f)
    forward(-69 * f)
    right(-90)
    forward(-7 * f)
    right(-90)
    penDown()
 
    setPenColor("violet")
    penWidth(int(5 * f))
    penUp()
    forward(60 * f)
    setPenColor("pink")
    dot(80 * f)
    right(120)
    forward(60 * f)
    penUp()
    dot(80 * f)
    right(70)
    forward(70 * f)
    dot(80 * f)
    right(75)
    penUp()
    forward(70 * f)
    dot(80 * f)
    right(85)
    penUp()
    forward(70 * f)
    dot(80 * f)
 
    forward(-70 * f)
    right(-85)
    forward(-70 * f)
    right(-75)
    forward(-70 * f)
    right(-70)
    forward(-60 * f)
    right(-120)
    forward(-60 * f)
 
    setPenColor("violet")
    dot(60 * f)
    right(90)
    forward(7 * f)
    right(90)
    setPenColor("lightgreen")
    penUp()
    forward(69 * f)
    penDown()
    penWidth(int(15 * f))
    forward(170 * f)
 
    # Setze Turtle auf gespeicherte Position und Richtung etc.
    penUp()
    moveTo(x,y)
    setHeading(h)
    penWidth(d)
    setPenColor(penFarbe)
    penDown()
 
makeTurtle()
hideTurtle()
 
penUp()
 
n = 9
enableRepaint(False)
 
penUp()
left(90)
forward(50)
right(90)
 
repeat n:
    forward(10)
    right(360/n)
    left((180 + 360/n)/2)
    penDown()
    blume()
    penUp()
    repaint()
    right((180 + 360/n)/2)

1)
Hier werden auch sogenannte Konstanten definiert, also Variablen, die ihren Startwert beibehalten.
  • lehrkraefte/snr/informatik/bruehl-2022/funktionen.txt
  • Last modified: 2022/04/02 13:23
  • by Olaf Schnürer