lehrkraefte:snr:informatik:glf23:python:funktionen

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lehrkraefte:snr:informatik:glf23:python:funktionen [2023/11/14 18:15] – [Aufgabe 2: Funktionen mit Rückgabewert selbst schreiben] Olaf Schnürerlehrkraefte:snr:informatik:glf23:python:funktionen [2024/12/02 12:57] (current) – [Aufgabe 1: Funktionen (mit Turtlegrafik)] Olaf Schnürer
Line 1: Line 1:
 +~~NOTOC~~
 +
 +====== Funktionen ======
 +
 +... oder Miniprogramme oder: Wie man grössere Programme übersichtlich gestaltet.
 +
 +===== Erklärungen =====
 +
 +<WRAP center round info>
 +<hidden Mit der Klasse schrittweise geschriebenes Programm (im Editor und an der Tafel):>
 +<code python funktionen-begruessung.py>
 +def begruessung():
 +    print("Hallo!")
 +    print("Ich bin eine Funktion.")
 +
 +def saluto(s):
 +    print("Buongiorno " + s + "!")
 +
 +def salutation(name, sprache):
 +    if sprache == 1:
 +        print("Bonjour " + name + " !")
 +    else:
 +        print("Buongiorno " + name + "!")
 +
 +begruessung()
 +
 +saluto("Pinocchio")
 +saluto("Papagena")
 +
 +salutation("Pinocchio", 2)
 +salutation("Jacques", 1)
 +</code>
 +
 +Zur Terminologie:
 +  * Die Variable ''s'' in der Definition der Funktion ''saluto'' ist ein sogenannter **Parameter**.
 +  * Beim Aufruf ''saluto("Pinocchio")'' dieser Funktion ist der String ''"Pinocchio"'' das **Argument** (der übergebene Wert).
 +</hidden>
 +<hidden Motivation in der 2pG>
 +Wiederholung: Dreieck zeichnen. 
 +
 +Will nun 5 Dreiecke an verschiedenen Positionen (und Startwinkeln) auf Bildschirm zeichnen.
 +Schülerin hatte Idee, einen Befehl ''dreieck'' zu bauen.
 +Dies am Computer programmiert (mit ''setposition''). Frage nach ''penup'', ''pendown'' kam auf.
 +Dann Befehl ''stift(farbe, dicke)'' programmiert (so habe gleich Parameter bzw. Argumente im Aufruf).
 +</hidden>
 +</WRAP>
 +
 +==== Aufgabe 1: Funktionen (mit Turtlegrafik) ====
 +
 +Erinnerung zur Turtle-Grafik: Das Grundgerüst eines Turtle-Programms sieht wie folgt aus.
 +
 +<code python>
 +from turtle import *
 +% Hier Programmcode
 +% einfügen.
 +exitonclick()
 +</code>
 +
 +<WRAP center round todo>
 +Öffne ein neues Python-Programm.
 +  * Schreibe eine Funktion ''dreieck''. Wenn man diese Funktion aufruft, soll die Turtle ein gleichseitiges Dreieck der Seitenlänge 100 zeichnen.
 +  * Teste deine Funktion, indem du die Funktion aufrufst. Hinweis: Klammern nicht vergessen beim Aufruf!
 +  * Schreibe eine Funktion ''triangolo'' mit einem Parameter ''a''. Wenn man diese Funktion aufruft, soll die Turtle ein gleichseitiges Dreieck der Seitenlänge ''a'' zeichnen.
 +  * Teste mit einem Funktionsaufruf, ob die Funktion ''triangolo'' das Gewünschte tut.
 +  * Schreibe eine Funktion ''vieleck'' mit **zwei** Parametern ''a'' und ''n''. Wenn man diese Funktion aufruft, soll die Turtle ein reguläres $n$-Eck der Seitenlänge ''a'' zeichnen.
 +  * Teste, ob die Funktion ''vieleck'' das Gewünschte tut.
 +  * Rufe nun deine drei Funktionen mehrfach hintereinander auf, eventuell mit Wechsel der Stiftdicke (z. B. ''pensize(10)'') oder Wechsel der Zeichenfarbe (z. B. ''pencolor("blue")'').
 +  * Bonus: Du kannst auch eine while-Schleife verwenden, um beispielsweise mehrere ineinanderliegende 6-Ecke verschiedener Grössen zu zeichnen. 
 +</WRAP>
 +===== Funktionen mit Rückgabewert (= return value) =====
 +
 +===== Erklärungen =====
 +
 +<WRAP center round info>
 +Mit dem Schlüsselwort ''return'' erreicht man, dass eine Funktion einen Wert retourniert. Beachte: Sobald in der Definition einer Funktion ein Return-Befehl erreicht wird, wird die Ausführung der Funktion beendet.
 +<code python funktionen-mit-rueckgabewert.py>
 +def wurzel(n):
 +    return n ** 0.5
 +
 +def betrag(x):
 +    if x >= 0: 
 +        return x
 +    else:
 +        return -x
 +
 +def ist_durch_drei_teilbar(n):
 +    return n % 3 == 0
 +
 +def arithmetisches_mittel(a, b):
 +    return (a + b) / 2
 +
 +print(wurzel(2))
 +print(wurzel(3))
 +
 +print(betrag(3))
 +print(betrag(-5))
 +
 +print(ist_durch_drei_teilbar(111))
 +print(ist_durch_drei_teilbar(112))
 +
 +print(arithmetisches_mittel(10, 100))
 +</code>
 +</WRAP>
 +
 +===== Aufgabe 2: Funktionen mit Rückgabewert selbst schreiben =====
 +
 +<WRAP center round todo>
 +Öffne ein neues Python-Programm (Name etwa ''aufgabe-funktionen-mit-rueckgabewert.py'').
 +<!--  * Schreibe eine Funktion ''hoch2'', die die zweite Potenz einer Zahl berechnet. Z. B. soll der Funktionsaufruf ''hoch2(9)'' die Zahl $9^{2}=81$ liefern.
 +  * Teste deine Funktion, etwa per ''print(hoch2(9))''.-->
 +  * Schreibe eine Funktion ''zwei_hoch'', die 2 in die gewünschte Potenz erhebt. Z. B. soll der Funktionsaufruf ''zwei_hoch(10)'' die Zahl $2^{10}=1024$ liefern.
 +  * Teste deine Funktion, etwa per ''print(zwei_hoch(10))''. Bonus: Gib mit einer Schleife die ersten 10 Zweierpotenzen $2^0, 2^1, \dots, 2^{10}$ aus.
 +  * Schreibe eine weitere Funktion ''geometrisches_mittel'', die das geometrische Mittel $\sqrt{a \cdot b}$ zweier nicht-negativer Zahlen berechnet. Z. B. soll der Funktionsaufruf ''geometrisches_mittel(4, 9)'' die Zahl $6$ liefern. 
 +  * Teste deine Funktion.
 +  * Schreibe eine weitere Funktion ''minimum'', die das Minimum (= die kleinere) zweier Zahlen berechnet. Z. B. soll der Funktionsaufruf ''minimum(-3, -5)'' die Zahl $-5$ liefern.
 +  * Teste deine Funktion.
 +</WRAP>
 +
 +===== Aufgabe 3: Programm-Leseverständnis =====
 +
 +<WRAP center round todo>
 +Lies die Definition der Funktion ''was_berechnet_diese Funktion'' und finde (möglichst ohne Computereinsatz) heraus, was sie berechnet!
 +
 +Einnerung: ''<nowiki>//</nowiki>'' und ''%'' berechnen Wert (= Ganzzahlquotient) und Rest der ganzzahligen Division.
 +
 +<code python>
 +def was_berechnet_diese_funktion(n):
 +    s = 0
 +    while n > 0:
 +        s = s + n % 10
 +        n = n // 10
 +    return s
 +</code>
 +</WRAP>
 +
 +====== Bonus-Aufgaben ======
 +
 +Wer mehr Lust auf Primzahlen als auf Turtle-Grafik hat, bearbeite zuerst Aufgabe 5.
 +===== Aufgabe 4: Tastaturgesteuerte Turtle - eine Art Zeichenprogramm =====
 +
 +<WRAP center round todo>
 +Lass das folgende Programm laufen und steuere die Turtle mit den vier Pfeiltasten und den Tasten "p" und "q".
 +Die Turtle sagt dir, dann, was du zu tun hast!
 +
 +Bonus: Erweitere das Programm selbständig: Etwa Farbwechsel, Ändern der Liniendicke, Anheben des Zeichenstifts etc. bei entsprechenden Tastendrücken.
 +
 +<code python tastaturgesteuerte-turtle.py>
 +from turtle import *
 +
 +title("Turtle-Zeichenprogamm: Verwende die Pfeiltasten, p, q und Escape")
 +showturtle()
 +
 +def vorwaerts():
 +    forward(50)
 +
 +def links():
 +    left(60)
 +
 +def rechts():
 +    write('Bitte Code ändern, so dass die Turtle um 60 Grad nach rechts abbiegt.')
 +
 +def rueckwaerts():
 +    backward(50)
 +
 +def quadrat():
 +    write('Bitte Code ändern, so dass ein Quadrat gezeichnet wird.')
 +
 +def polygon():
 +    n = int(textinput("Polygon", "Anzahl der Ecken: "))
 +    a = int(textinput("Polygon", "Länge der Seiten: "))
 +    write('Bitte Code ändern, so dass ein regelmässiges n-Eck der Seitenlänge a gezeichnet wird.')
 +
 +    # Nach den textinput-Befehlen muss man den "listener" wieder aktivieren.
 +    listen()
 +
 +onkey(vorwaerts, "Up")  
 +# Drücken der Nach-oben-Pfeiltaste führt 
 +# zum Aufruf der Funktion "vorwaerts"
 +# (Sobald das Programm im "listen"-Modus ist.) 
 +onkey(links, "Left")
 +onkey(rechts, "Right")
 +onkey(rueckwaerts, "Down")
 +onkey(quadrat, "q")
 +onkey(polygon, "p")
 +onkey(exit, "Escape")
 +
 +listen()   # Aktiviert den listener-Modus: 
 +           # Tastendrücke führen zum Ausführen
 +           # der entsprechenden Funktion. 
 +mainloop() # eine Art Endlosschleife, die auf Tastatureingaben wartet.
 +</code>
 +</WRAP>
 +
 +===== Aufgabe 5: Primzahlen erkennen und Primzahlliste ausgeben =====
 +
 +<WRAP center round todo>
 +(wie immer: neues Python-Programm öffnen)
 +
 +  * Schreibe eine Funktion ''ist_prim'' mit einem Parameter ''n'', die ''True'' oder ''False'' liefert abhängig davon, ob das Argument eine Primzahl ist. Z. B. soll ''ist_prim(5)'' den Wert ''True'' liefern.
 +  * Teste deine Funktion mit **allen** Zahlen zwischen 1 und 10. (Beachte: 1 ist keine Primzahl).
 +  * Nutze diese Funktion, um eine Liste aller Primzahlen bis 1000 auszugeben. 
 + 
 +Falls du die Primzahlen nebeneinander (statt untereinander) ausgeben möchtest: Verwende <code python>print(..., end=", ")</code> Dies sorgt dafür, dass nach der Ausgabe ein Kommazeichen und ein Leerzeichen folgt und **nicht** in eine neue Zeile gewechselt wird.
 +</WRAP>
 +
 +
 +==== Lösungsvorschlag ====
 +
 +<hidden Turtle-Programm mit den Funktionen ''dreieck'', ''triangolo'' und ''vieleck''>
 +<code python funktionen-turtle.py>
 +from turtle import *
 +
 +def dreieck():
 +    i = 0
 +    while i < 3:
 +        forward(100)
 +        left(120)
 +        i = i + 1
 +
 +def triangolo(a):
 +    i = 0
 +    while i < 3:
 +        forward(a)
 +        left(120)
 +        i = i + 1
 +
 +def vieleck(a, n):
 +    i = 0
 +    while i < n:
 +        forward(a)
 +        left(360/n)
 +        i = i + 1
 +
 +dreieck()
 +
 +triangolo(123)
 +triangolo(200)
 +
 +vieleck(77, 5)
 +vieleck(27, 11)
 +
 +exitonclick()
 +</code>
 +</hidden>
 +
 +
 +
 +===== W3Schools-Material zu Funktionen =====
 +
 +Erklärungen: https://www.w3schools.com/python/python_functions.asp.
 +
 +Übungen dazu: https://www.w3schools.com/python/exercise.asp?filename=exercise_functions1
 +
 +
 +===== Link zur Kursseite =====
 +
 +[[lehrkraefte:snr:informatik:glf23|Zur Kursseite]]
 +