Besprechung der Hausaufgaben
Gemeinsam an Tafel
Wenn man ein Haus baut, welche Arbeiten müssen durchgeführt werden? Reihenfolge egal, denkt an die beteiligten Handwerker.
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
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 |
|
| mit Rückgabewert | Aufgabe 5 | Aufgaben 6 und 7 |
buchstabeZ, meinAnfangsBuchstabe | konvertiereFahrenheitInCelsius, laengeDiagonale, brief |
Statt sofort mit Aufgabe 2 zu beginnen, programmieren wir zusammen.
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.
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. dreieck100, um die Figur unten links zu zeichnen (mit möglichst wenig Code-Zeilen). 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 11-Eck).
Strings (= Zeichenketten = Text) werden in Python links und rechts durch Anführungszeichen gekennzeichnet. Beispielsweise ist “Hello World!” eine String.
Wir spielen mit dem folgenden Programm, bis wir die folgenden Fragen beantworten können:
print-Befehl verändern, so dass die Ausgabe Grüezi St. Gallen! lautet (also mit Leerschlag und Ausrufezeichen).s = "Grüezi" t = "St. Gallen" print(s + t)
Das Programm
x = input("Wie alt bist du?") print("Du bist" + x + "Jahre alt.")
ist fehlerhaft! Man kann einen String1) und eine Zahl in Python nicht addieren.
Um bei der Eingabe 16 die Ausgabe Du bist 16 Jahre alt. zu erhalten, ersetzt man am einfachsten die letzte Zeile durch
print(“Du bist” + str(x) + “Jahre alt.) und ändert noch eine Kleinigkeit. Die Funktion str wandelt die Zahlvariable x in einen String um (liefert also bei Eingabe der Zahl 16 den String “16”), den man dann zu den anderen Strings addieren kann.
Einzelarbeit, aber schnell besprechen, ca. 5 Minuten (Diese Aufgabe hat nichts mit Funktionen zu tun, jedoch wird das hier Gelernte in den folgenden Aufgaben verwendet.)
Strings (= Zeichenketten = Text) werden in Python links und rechts durch Anführungszeichen gekennzeichnet. Beispielsweise ist “Hello World!” eine String.
Spiele mit dem folgenden Programm, bis du die folgenden Fragen beantworten kannst:
print-Befehl verändern, so dass die Ausgabe Grüezi St. Gallen! lautet (also mit Leerschlag und Ausrufezeichen).\n?s = "Grüezi" t = "St. Gallen" print(s + t) print(3 * "Sieben!") print("XXX\nX X\nXXX")
Hinweis: n steht für new line, also Zeilenumbruch. In der Fachsprache nennt man \n einen “Escape character” (deutsch etwa: Fluchtzeichen, Escape-Zeichen).2)
Einzelarbeit, ca. 8 Minuten
Der folgende Code definiert eine Funktion buchstabeZ ohne Parameter, aber mit einem String als Rückgabewert.
Der Rückgabewert steht rechts des Schlüsselworts return.
# In der folgenden Zeile beginnt die Definition der Funktion def buchstabeZ(): s1 = "XXXXXX\n" s2 = " XX\n" s3 = " XX \n" s4 = " XX \n" s5 = " XX \n" s6 = "XX \n" s7 = "XXXXXX\n" # Die folgende Zeile bewirkt, dass die Funktion den String s1 + s2 + s3 + s4 + s5 + s6 berechnet und retourniert. return s1 + s2 + s3 + s4 + s5 + s6 + s7 # In der folgenden Zeile beginnt das Hauptprogramm b = buchstabeZ() print(buchstabeZ())
Ändere diesen Code in die Definition einer Funktion meinAnfangsBuchstabe, die den ersten Buchstaben deines Vornamens als “String mit Zeilenumbrüchen” retourniert. Passe das Hauptprogramm so an, dass dein Anfangsbuchstabe 3 Mal ausgegeben wird, jeweils mit einer Leerzeile dazwischen.
Das Programm
x = input("Wie alt bist du?") print("Du bist" + x + "Jahre alt.")
ist fehlerhaft! Man kann einen String3) und eine Zahl in Python nicht addieren.
Um bei der Eingabe 16 die Ausgabe Du bist 16 Jahre alt. zu erhalten, ersetzt man am einfachsten die letzte Zeile durch
print(“Du bist” + str(x) + “Jahre alt.) und ändert noch eine Kleinigkeit. Die Funktion str wandelt die Zahlvariable x in einen String um (liefert also bei Eingabe der Zahl 16 den String “16”), den man dann zu den anderen Strings addieren kann.
Einzelarbeit, ca. 10 Minuten
Zusätzliche mündliche Erklärung durch mich:
Der folgende Code definiert eine Funktion konvertiereFahrenheitInCelsius mit einem Parameter (der Temperatur in Grad Fahrenheit), die als Rückgabewert die entsprechende Temperatur in Grad Celsius liefert. Erkläre Schlüsselwort return! Zeige es im Einzelschrittverfahren!
# In der folgenden Zeile beginnt die Definition der Funktion def konvertiereFahrenheitInCelsius(f): c = (f - 32) / 1.8 return c # In der folgenden Zeile beginnt das Hauptprogramm x = input("Gib die Temperatur in Grad Fahrenheit ein:") y = konvertiereFahrenheitInCelsius(x) print(str(x) + " Grad Fahrenheit entspricht " + str(y) + " Grad Celsius.")
Kopiere den Python-Code unten in ein neues Programmierfenster und ergänze ihn um die Definition der Funktion laengeDiagonale, die als Parameter die Seitenlänge eines Quadrats entgegennimmt und die Länge der Diagonalen berechnet und zurückgibt. Ausserdem ist das Hauptprogramm so zu ergänzen, dass zum Beispiel bei Eingabe 4 die folgende Ausgabe erscheint:
Länge der Seite des Quadrats: 4 cm Länge der Diagonalen: 5.65685424949 cm
# Funktionsdefinition zu ergänzen s = input("Wie lang ist die Seite des Quadrats (in cm)?") # Ergänze hier den Code für die Ausgabe.
Hinweis: Die Funktion sqrt liefert die Quadratwurzel (dabei steht “sqrt” für englisch “square root”, also “Quadratwurzel). Beispielsweise liefert sqrt(2) die Zahl 1.414213….
Einzelarbeit, ca. 8 Minuten
Ergänze den folgenden Code um die Definition der Funktion brief mit einem String als Parameter und einem String als Rückgabewert, so dass die Ausgabe rechts entsteht.
# Funktionsdefinition zu ergänzen print(brief("Jessica")) print(brief("Mattia"))
Liebe(r) Jessica Liebe(r) Mattia
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:
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. ornament.wiederholeOrnament mit Parameter n: Sie soll n Mal die Funktion ornament aufrufen. (Dabei lernst du, dass eine Funktion eine andere aufrufen kann!)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).Abgabe bis spätestens Sonntagabend 23:59 Uhr vor der nächsten Doppellektion über den folgenden Link:
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()
import-Anweisungen – sie stellen Funktionen (aus sogenannten Bibliotheken) bereit, die andere Leute bereits definiert haben.4)def eingeleitet); man nennt Funktionen auch Teil- oder Unterprogramme; gibt es mehrere Funktionsdefinitionen, so werden sie durch mindestens eine Leerzeile getrennt.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.
Schreibt bitte auf die Post-it-Zettel:
Einzelarbeit, ca. 6 Minuten
Genauso kann man Funktionen mit mehreren Parametern definieren:
Ergänze den folgenden Code um die Definition der Funktion polygon mit vier Parametern n, dicke, farbe, s, so dass die Zeichnung rechts entsteht.5)
from gturtle import * def polygon(n, dicke, farbe, s): # Rest der Funktionsdefinition zu ergänzen makeTurtle() hideTurtle() polygon(7, 12, "green", 140) polygon(5, 10, "red", 120) polygon(3, 8, "blue", 100)
Einzelarbeit, ca. 8 Minuten
Schreibe eine Funktion hypotenuse, die die Länge der beiden Katheten eines rechtwinkligen Dreiecks vom Benutzer entgegennimmt und die Länge der Hypotenuse berechnet (mit Hilfe des Satzes des Pythagoras).
Die Ausgabe soll wieder gut lesbar sein und beispielsweise wie folgt aussehen.
Kathetenlängen: 3 und 4 Länge der Hypotenuse: 5
Hinweis: Die Funktion sqrt liefert die Quadratwurzel (dabei steht “sqrt” für englisch “square root”, also “Quadratwurzel). Beispielsweise liefert sqrt(2) die Zahl 1.414213….
Nutze die beiden “aufklappbaren” Programme, um Funktionen stGallen und/oder blume zu definieren. Verwende diese kreativ. Beispielsweise kannst du
s wie St. Gallen) oder die Blume (etwa per Taste f wie flower) gezeichnet wird.
Bitte einfach am Anfang des Programms oder der eingereichten Datei die Frage aufschreiben (mit oder ohne Hashtag # als Kommentareinleitungszeichen am Zeilenanfang).
\ und n gehören so eng zusammen, dass sie wie ein Zeichen aufgefasst werden.