×
produktlogotitle

Seite: bbe_belle
Diese Seite wurde aktualisiert am 13.10.2021

LOGIN
Benutzer:
Passwort:
 
   if1.net-schulbuch.de

 

 

Wir wollen jetzt mit der Turtle das folgende Bild erzeugen:

In dem Bild erkennt man vier identische Quadrate (Seitenlänge 10 Einheiten), die nebeneinander mit einem Zwischenraum von ebenfalls 10 Einheiten liegen. Hätten wir jetzt eine Funktion quadrat (), die ein Quadrat mit der Seitenlänge 10 erzeugt, so könnten wir diese Funktion vier-mal nutzen:

quadrat()
quadrat()
quadrat()
quadrat()

Ein erster Versuch:

def quadrat():
    for i in range(4):
        turtle.forward(10)
        turtle.left(90)

quadrat()
quadrat()
quadrat()
quadrat()

Leider sieht man nur ein Quadrat! Wieso?

Die Funktion zeicnet tatsächlich ein Quadrat der gewünschten Größe. Doch nach dem Zeichenvorgang befindet sich die Turtle erneut am Startpunkt, so dass alle 4 Quadrate an derselben Position stehen.

Wie kann das Problem gelöst werden?

Aufgabe

Hier sind zwei mögliche Lösungsvorschläge.

Implementiere beide Möglichkeiten! Und vielleicht hast du noch weitere Ideen zur Lösung.

  1. Die Funktion quadrat () bewegt, nachdem das Quadrat erstellt wurde, die Turtle zum Startpunkt des folgenden Quadrates.
  2. Es gibt eine weitere Funktion zumNaechstenStart(), die die Turtle zum Startpunkt des nächsten Quadrates bewegt.

Beachte jeweils auch, dass nur die Quadrate, nicht die Bewegungen der Turtle in den Zwischenräumen sichtbar sind.

zu a)

import turtle

def quadrat():

    turtle.pd()
    for _ in range(4):
        turtle.forward(10)
        turtle.left(90)
    turtle.pu()
    turtle.forward(20)

turtle.ht()
for _ in range(4):
    quadrat()

 

zu b)

import turtle

def quadrat():
    for _ in range(4):
    turtle.forward(10)
    turtle.left(90)

def zumNaechstenStart():
    turtle.pu()
    turtle.forward(20)
    turtle.pd()

turtle.ht()
for _ in range(4):
    quadrat()
    zumNaechstenStart()

 

Quadrate haben natürlich nicht immer eine Seitenlänge von 10 Einheiten, wie in dem obigen Beispiel. Die Funktion, die in der Lage ist, ein Quadrat zu erzeugen, sollte also flexibel sein, indem man die Seitenlänge (in Pixeln) angeben kann.

Solch eine flexible Funktion kennen wir ja bereitsaus einem anderen Zusammenhang. Die Funktion randint () lieferte nicht immer eine Würfelzahl zwischen 1 und 6. Der Bereich für die Zufallszahl konnte mit Angaben in der Klammer bestimmt werden:

  • randint(1, 6) simuliert einen Standard-Würfel; der Aufruf erzeugt eine der Zahlen 1, 2, ..., 6
  • randint(0, 1) erzeugte eine 0 oder eine 1, so dass man damit z.B. einen Münzwurf simulieren kann.
  • randint(1, 100) liefert eine Zufallszahl aus dem Bereich [1, ..., 100]

Solche zusätzlichen Angaben, sog. Parameter, beeinflussen also das Verhalten der Funktion. Ein Quadrat mit einer Seitenlänge von 20 Einheiten wollen wir also erzeugen mit dem Aufruf quadrat(20), ein Quadrat mit Seitenlänge 42 jedoch mittels quadrat(42).

Der zugehörige Python-Code, der diese Funktion erzeugt:

import turtle

def quadrat(seitenlaenge):
    for _ in range (4):
    turtle.forward(seitenlaenge)
    turtle.left(90)

 

Formale und aktuelle Parameter

In einer Funktionsdefinition einer Funktion mit Parameter wird ein Platzhalter für den Parameter angegeben, der im Rumpf der Definition benutzt werden kann. Dieser Platzhalter heisst formaler Parameter.

Beim Aufruf der Funktion wird ein aktueller Parameter angegeben.

In der obigen Funktion ist also seitenlaenge im Kopf der Funktionsdefinition der formale Parameter dieser Funktion. 

Innerhalb der Definition, also im Rumpf der Funktionsdefinition, benutzt man diesen formalen Parameter so, als ob es eine bekannte Variable ist.

Ruft man in einem Programm diese Funktion auf, muss man den formalen Parameter durch die Angabe eines konkreten Wertes oder einer bereits mit einem Wert belegten Variablen ersetzen. Im Beispiel könnte das also erfolgen durch

quadrat(42)

oder auch

breite = 42
quadrat(breite)

 

Aufgabe
  1. Schreibe eine Funktion gleichseitigesDreieck(), das - wie der Name dir sicherlich verrät - ein gleichseitiges Dreieck mit einer per Parameter wählbaren Seitenlänge erstellt.
  2. Benutze dann diese Funktion zusammen mit der oben definierten Quadrat-Funktion, um das nebenstehende Bild zu erzeugen

Bedenke, dass eine Figur wie das Dreieck oder das Quadrat in zwei Richtungen umlaufen werden kann. 

 

 

Funktionen können auch mehr als einen Parameter haben, wie an der Zufallsfunktion zu erkennen ist. Ein eigenes Beispiel demontriert es.

Ein Quadrat und ein gleichseitige Dreieck sind Beispiele eines sog. regelmäßigen n-Ecks. Alle Kanten sind gleich lang und alle Innenwinkel gleich groß.

Hier sieht man ein regelmäßiges 7-Eck und ein regelmäßiges 10-Eck:

Die Python-Funktion für solch ein regelmäßiges n-Eck ist eine Funktion mit zwei Parametern. Der erste Parameter gibt an, wie viele Kanten (oder auch Ecken) die Figur besitzt, und der zweite Parameter ist verantwortlich für die Kantenlänge:

def regelmaessigesN_Eck(anzahlEcken, laenge):
    winkel = 360 / anzahlEcken
    for _ in range(anzahlEcken):
        turtle.forward (laenge)
        turtle.left (winkel)

Probiere doch einmal aus, ob du ein regelmäßiges 200-Eck erstellen kannst. Was stellst du fest?

Ein regelmäßiges n-Eck mit sehr vielen Ecken ist fast ein Kreis. Dann darf man natürlich die Kantenlänge nicht zu groß wählen, da die Figur dann ebenfalls sehr groß wird.

Erstellt man z.B. ein regelmäßiges 200-Eck mit einer Kantenlänge von 100 Einheiten, wird der Umfang der Figur 20000 Einheiten betragen. Diese Figur wird dann sicherlich nicht mehr auf deinem Monitor sichtbar sein!

Wenn wir jetzt (mathematisch sicherlich nicht korrekt) ein 200-Eck als Kreis betrachten, stellt sich die Frage, wie man die Kantenlänge dieses 200-Ecks wählen muss, wenn man den Radius vorgibt. Dazu die folgenden Überlegungen:

  1. Ein Kreis mit Radius `r` hat einen Umfang von `U=2 π r`
  2. Ein 200-Eck mit Kantenlänge `k` hat einen Umfang von `200 k`.
  3. Dann ist also `2 π r = 200 k` und somit `k = (2 π r) / 200 = (π r) / 100`.

Will man also einen Kreis (also ein 200-Eck) mit Radius `r` erstellen, muss man ersatzweise ein 200-Eck mit Kantenlänge `(π r) / 100` zeichnen.

Python stellt die in der Bibliothek math die Konstante `π` in Form von math.pi zur Verfügung. Dazu musst du in deinem Programm diese Bibliothek allerdings importieren. Du kannst jedoch auch stattdessen den ungefähren Wert 3.1415 benutzen.

Probiere einmal aus, ob du Unterschiede feststellen kannst.

Der zugehörige Code:

import turtle
import math

def regelmaessigesN_Eck(anzahlEcken, laenge):
    winkel = 360 / anzahlEcken
    for _ in range(anzahlEcken):
        turtle.forward (laenge)
        turtle.left (winkel)

def kreis(radius):
    kantenlaenge = (math.pi * radius) / 100
    regelmaessigesN_Eck(200, kantenlaenge)

 

 

Bisher waren die Funktionen so gestaltet, dass sie eine Aktion auslösten, die auf dem Monitor sichtbar wurde.

Jedoch kommt es sehr oft vor, dass eine Funktion einen Wert berechnet oder erzeugt, der nicht sofort auf dem Monitor angezeigt werden soll, sondern von anderen Programmteilen weiterverarbeitet werden soll. Das soll an einigen Beispielen erläutert werden.

Betreiben wir ein wenig Geometrie! Dort haben wir z.B. erfahren, wie man den Flächeninhalt von Rechtecken berechnen kann. Das könnte man mit der folgenden Funktion erledigen:

def flaeche(a,b):
    area = a * b
    print (area)

Das ist zwar korrekt, doch soll die Funktion den Wert eigentlich nicht anzeigen. Denn

  • Ein anderes Programmteil soll z.B. entscheiden, wie die Ausgabe gestaltet wird. Vielleicht erscheint die Ausgabe in der Form Fläche = 12 oder schöner:Das Rechteck mit den Maßen 3cm und 4cm hat einen Flächeninhalt von 12 cm2.

  • Mit dem Wert, der sich ergibt, arbeitet das aufrufende Programm weiter. Vielleicht soll der berechnete Wert zu einem anderen Wert addiert werden.

Wir werden also die Funktion ändern, so dass keine Ausgabe erscheint, sondern dser berechnete Wert zurückgegeben (ausgeliefert) wird:

def flaeche(a,b):
    area = a * b
    return area

 

Jetzt kann man die Ausgabe nach eigenen Wünschen gestalten:

breite = int(input("Breite des Rechtecks:"))
hoehe = int(input("Höehe des Rechtecks:"))

print ("Das Rechteck mit den Maßen",
        breite, "cm und", hoehe,
        "cm hat einen Flächeninhalt von",
        flaeche(breite,hoehe), "Qudratcentimeter")

 

Das Schlüsselwort return

return ist in Python ein reserviertes Schlüsselwort. Innerhalb einer Funktionsdefinition bewirkt es, dass an dieser Stelle die Abarbeitung der Funktion sofort beendet wird und der Wert des Ausdrucks, der hinter diesem Schlüsselwort steht, als Rückgabewert benutzt wird.

Diesen Rückgabewert kann das aufrufende Programm dann benutzen.

 

vorhergehender Absatz -1

Aufgabe

Ds nebenstehende Bild soll erzeugt und der zugehörige Flächeninhalt angezeigt werden.

Dazu wird das folgende Programm geschrieben:

breite = 100
radius = breite/2

quadrat(breite)

turtle.pu()
turtle.left(90)
turtle.forward(breite)
turtle.right(90)
turtle.forward(radius)
turtle.pd()

kreis(radius)

print ("Die Figur hat einen Flächeninhalt von",
        flaecheQuadrat(breite) + flaecheKreis(radius), "Qudratcentimeter")

Vervollständige das Programm, indem du die fehlenden Funktionen definierst.

 

 

 

 

Impressum
© 2023  Net-Schulbuch.de
10.00  0.0598  8.1.28