Zum Inhalt

Eigene Prozeduren

Bis jetzt haben wir nur bereits existierende Befehle wie forward() oder makeTurtle() verwendet. Als Nächstes möchten wir unsere eigenen Prozeduren schreiben.

Mit einer Prozedur können wir ein kleineres Teilprogramm (auch Unterprogramm genannt) schreiben, welches dann mehrmals wiederverwendet werden kann. Bei einer Schleife wiederholen wir ein Teilprogramm \(x\)-mal direkt nacheinander. Bei einer Prozedur können wir ein Teilprogramm mehrmals an beliebiger Stelle wiederholen.

Definition

Die Syntax für eine Prozedursdefinition besteht mindestens aus dem Schlüsselwort def, einem Namen, zwei runde Klammern, einem Doppelpunkt sowie den Inhalt vom Unterprogramm. Dieser muss wie bei den Verzweigungen oder Schleifen eingerückt sein (es ist ein Block).

def <nameDerProzedur>(<Parameter1>, <Parameter2>, ...):
    <Anweisung1>
    <Anweisung2>
    ...

Beispiel 1

In diesem Programm wird eine neue Prozedur mit dem Namen meineGrussProzedur definiert.

def meineGrussProzedur():
    print("* * * *)
    print("Hallo")
    print("* * * *)

Jedes mal wenn du nun irgendwo später im Programm meineGrussProzedur() schreibst, wird der oben definierte Inhalt ausgeführt.

Probiere dies einmal aus:

Erweitere das nachfolgende Programm, so dass der Befehl meineGrussProzedur() ausgeführt wird.

###(De-)Aktiviert den Code nach der Zeile # Tests (Groß-/Kleinschreibung wird nicht beachtet)
(Ctrl+I)
Ein- oder Ausstieg aus dem "Split-Screen"-Modus
(Alt+: ; Ctrl, um die Spalten zu vertauschen)
Ein- oder Ausstieg aus dem "Vollbildmodus"
(Esc)
Kürzen/nicht kürzen der Rückmeldungen im Terminal (Standardausgabe & Stacktrace / Starte das Programm erneut zum Anwenden)
Wenn aktiviert, wird der aus dem Terminal kopierte Text in eine Zeile umgewandelt, bevor er in die Zwischenablage kopiert wird.

Du solltest nach dem Aufruf folgende Ausgabe sehen:

* * * *
Hallo
* * * *

Beispiel 2

Wenn nun ein Problem (bzw. Aufgabe) aus mehreren ähnlichen oder gleiche Teilproblemen besteht, lohnt es sich dies einmal zu lösen und dann mehrmals anzuwenden. Wie bei diesem Beispiel.

Es wird hier gezeichnet...

###(De-)Aktiviert den Code nach der Zeile # Tests (Groß-/Kleinschreibung wird nicht beachtet)
(Ctrl+I)
Ein- oder Ausstieg aus dem "Split-Screen"-Modus
(Alt+: ; Ctrl, um die Spalten zu vertauschen)
Ein- oder Ausstieg aus dem "Vollbildmodus"
(Esc)
Kürzen/nicht kürzen der Rückmeldungen im Terminal (Standardausgabe & Stacktrace / Starte das Programm erneut zum Anwenden)
Wenn aktiviert, wird der aus dem Terminal kopierte Text in eine Zeile umgewandelt, bevor er in die Zwischenablage kopiert wird.

Aufgaben

Sechsecke

Question

Definiere eine Prozedur sechseck(), mit dem die Turtle ein Sechseck zeichnet. Verwende diese Prozedur, um die nebenstehende Figur zu erstellen.

Es wird hier gezeichnet...

###(De-)Aktiviert den Code nach der Zeile # Tests (Groß-/Kleinschreibung wird nicht beachtet)
(Ctrl+I)
Ein- oder Ausstieg aus dem "Split-Screen"-Modus
(Alt+: ; Ctrl, um die Spalten zu vertauschen)
Ein- oder Ausstieg aus dem "Vollbildmodus"
(Esc)
Kürzen/nicht kürzen der Rückmeldungen im Terminal (Standardausgabe & Stacktrace / Starte das Programm erneut zum Anwenden)
Wenn aktiviert, wird der aus dem Terminal kopierte Text in eine Zeile umgewandelt, bevor er in die Zwischenablage kopiert wird.

Lösung
from gturtle import *
makeTurtle()

pencolor("blue") # ändere die Stiftfarbe zu Blau
speed(11)

def sechseck():
    for i in range(6):
        forward(100)
        left(60)

for i in range(10):
    sechseck()
    right(36)

Quadrate

Question

Definiere eine Prozedur für ein Quadrat, das auf der Spitze steht und zeichne damit die nebenstehende Figur. Überlege dir zuerst, welches "Teilproblem" du mit der Prozedur lösen möchtest. Es gibt mehrere Möglichkeiten.

Es wird hier gezeichnet...

###(De-)Aktiviert den Code nach der Zeile # Tests (Groß-/Kleinschreibung wird nicht beachtet)
(Ctrl+I)
Ein- oder Ausstieg aus dem "Split-Screen"-Modus
(Alt+: ; Ctrl, um die Spalten zu vertauschen)
Ein- oder Ausstieg aus dem "Vollbildmodus"
(Esc)
Kürzen/nicht kürzen der Rückmeldungen im Terminal (Standardausgabe & Stacktrace / Starte das Programm erneut zum Anwenden)
Wenn aktiviert, wird der aus dem Terminal kopierte Text in eine Zeile umgewandelt, bevor er in die Zwischenablage kopiert wird.

.128013öeshq;98fTt2lv1760g3-ndbcpmCo(ari=)/wy:*PL,k45 u050x0c0l0F0H0n0d0V0z0n0F0d0d0I010l0H0A010406050d0W0B0B0F0G0M040Q0b0{0w0t050K0{0}0 110_0A04051f181i0K1f0_0x0H0o0)0+0-0/0e0H0t0e0n1w0e0l0@050!0y0n0c1r0,0.011v1x1z1x0l1F1H1D0l0G1g0l0e0)0D0%0A0F0w0/0m011J1t010j0$0c0w0F0B0c1D0d1%0w1-1L1:1H1?1^0@0a0V13150t0d0o0D0G0d0z1y0F17191|1g0K1Y2l1V1X1W1E0x1~0/1z0w1=0D0d1D1o1q0*1K2v0H2x0w0D2C1D0A0G0c1g1{1(2l2R0w2Q1|2u012J0G0~0n0@0V0p182U0^0`2X2E1.2!2$2(0m2+2k0_2U2Y2=0F2%040V0u2_2S2{2/1s1L2~300V0T342V361(2}2c2?310U3e2-2|2:393j2 2(0r3n3g1}3q0/3a2(0q3w2.3h3z2Z3s3b0i3E3p383A3J2(0h3M372F3I2#3t040p0s3T3G3O3W3k0p2*2j353F3y3(3B3Z2^3-3f3/3i3X300p333^3o3U2;3Q3Z3d403x3{3*3m473`3H3=0p3v4c3N3V4f3D4i423r3|0@0p3L4n3%4k440p3S4u3:4w4q040m3#4A493Y0m3,2,484e440m3@4M4d3;4P3 4S4j434D0m462,1j2O2l2C2o0x1X2t3H0z2K1_1g4+1h4)3/2T2k054;0Y2W4v1.0S0w0@0j0G0D0B3n0V4T4k55040t0l0W0G0l1H5b5d535f0H0B0A2c0l5n4Y1L0D0@0O3w4N3;0@0~0S0c0k5j5l0c3n5o1L0?040E0J5C5O3A0@0d0Z0P2z5N5x0/5Q0E5$4o0/5z040v5+521L0B0H4r0s4G4%5%015Q0R5w5,015@0@5{4}5}5Q5T475D3V0S0@0Y0j615=3A0j0@0f0W0F0x0G0F5v405V5~0@5S0N3w0V6B5c5}6e040j2c6i4B2;0@0H6J2Y0D0L6M0w6O4e0y0@6r165M6u686x5;6K5?5^044h5|62696z476C6?6D625f6H0G0L0 0x6(2Y5)703H64040U662S6v696A6@6B6v5f0G1A6t6.6j6w5R733(750h782V7a0@6a4M066?7f6X7i7o3V726#62754s7s516)5(7v5C6c6L047h1Q7D1.7F7k7M636+0T4b7Y717O6b7A045Y0l0P1=0C1#6I7G7l7X67620d1+04026n0D0l0g1G0W0c800W820g7V5P7*4X6_6m6o6q6s8c7N5R7w2`7,7.7:0w7=0n7@7(3H7`795}7}0@888a2O0x8E838l7m8o3.5}5f6n6p6r7j7{7_6x8M3_8O5X5Z7;7?0G8K8z7t8B7~8I0g0t2O1=8.8)8e8p8Z048Q8j8T8A6/8W3$7Z5f8r8$8v8(7^7Z8*7L2Y8C7 81831G0F0z0S8?997)048X417l8P8i8S8@8n3E0K4 2P4(9B0K4^2m4-182p9I0F1G9D4+0_9E0Z0#0%04.
Lösung
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from gturtle import *

makeTurtle()

setPos(-100, 0)

def quadrat():
    for i in range(6):
        forward(50)
        right(90)

    right(180)


right(45)

setPenColor("blue")
quadrat()
setPenColor("red")
quadrat()
setPenColor("green")
quadrat()
setPenColor("black")
quadrat()

Farbige Sterne

Question

Definiere einen Befehl stern() um einen Stern zu zeichnen.

Wenn du vor einer (Teil-)Zeichnung den Befehle begin_fill() aufrufst und nachher den Befehl end_fill(), dann wird deine Figure mit Farbe ausgefüllt. Die Füllfarbe kannst du mit fillcolor(FARBNAME) steuern.

Verwende deinen Befehl um drei blaue Sterne zu zeichnen.

Es wird hier gezeichnet...

###(De-)Aktiviert den Code nach der Zeile # Tests (Groß-/Kleinschreibung wird nicht beachtet)
(Ctrl+I)
Ein- oder Ausstieg aus dem "Split-Screen"-Modus
(Alt+: ; Ctrl, um die Spalten zu vertauschen)
Ein- oder Ausstieg aus dem "Vollbildmodus"
(Esc)
Kürzen/nicht kürzen der Rückmeldungen im Terminal (Standardausgabe & Stacktrace / Starte das Programm erneut zum Anwenden)
Wenn aktiviert, wird der aus dem Terminal kopierte Text in eine Zeile umgewandelt, bevor er in die Zwischenablage kopiert wird.

Lösung
from gturtle import *
makeTurtle()

color("#27408B")

def stern():
    begin_fill()
    for i in range(5):
        forward(90)
        right(720 / 5)
    end_fill()

stern()
right(120)
stern()
right(120)
stern()
right(120)

ht()

Olympische Dreiecke Version 2

Question

Zeichne nochmals die folgende Figur. Es sind fünf Dreiecke welche sich nicht berühren. Verwende dazu Schleifen! Mit den Befehlen penup() und pendown() kannst du steuern ob gezeichnet wird.

Verwende diesmal aber deine eigenen Befehle um zuerst die Teilprobleme einzeln zu lösen!

Es wird hier gezeichnet...

###(De-)Aktiviert den Code nach der Zeile # Tests (Groß-/Kleinschreibung wird nicht beachtet)
(Ctrl+I)
Ein- oder Ausstieg aus dem "Split-Screen"-Modus
(Alt+: ; Ctrl, um die Spalten zu vertauschen)
Ein- oder Ausstieg aus dem "Vollbildmodus"
(Esc)
Kürzen/nicht kürzen der Rückmeldungen im Terminal (Standardausgabe & Stacktrace / Starte das Programm erneut zum Anwenden)
Wenn aktiviert, wird der aus dem Terminal kopierte Text in eine Zeile umgewandelt, bevor er in die Zwischenablage kopiert wird.

Lösung
from gturtle import *
makeTurtle()

def dreieck(laenge, farbe):
    setPenColor(farbe)
    right(30)
    for i in range(3):
        forward(laenge)
        left(120)


    left(30)

def abstand(laenge):
    penUp()
    right(90)
    forward(laenge)
    left(90)
    penDown()


speed(10)
dreieck(50, "blue")
abstand(60)
dreieck(50, "black")
abstand(60)
dreieck(50, "red")

penUp()
forward(30)
left(90)
forward(30)
left(90)
penDown()
dreieck(50, "green")
abstand(60)
dreieck(50, "yellow")

hideTurtle()