deutsch     english     français     Drucken

 

3.2 FOR - SCHLEIFEN

 

 

EINFÜHRUNG

 

Oft musst du während der Wiederholung mitzählen lassen. Dazu benötigst du in einem Wiederholblock eine Variable, die sich in jedem Schleifendurchgang um einen bestimmten Wert ändert. Statt einer while-Struktur kannst du dies einfacher mit einer for-Struktur erledigen. Dazu muss du zuerst die range()-Funktion verstehen. Im einfachsten Fall hat range() einen einzigen Parameter (auch Stop-Wert genannt) und liefert eine Folge (Liste) von natürlichen Zahlen, die mit 0 beginnt und bei der letzten Zahl vor dem Stop-Wert endet.

Du kannst dies an ein paar Beispielen selbst ausprobieren. Wenn du beispielsweise ein Programm mit der einzigen Anweisung
print range(10) ausführst, werden die Zahlen  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
in das Ausgabefenster geschrieben. Versuche es mit ein paar anderen Parametern. Wie du siehst, ist der Stop-Wert 10 nicht mehr in der Liste enthalten. Er gibt aber an, wie viele Listenelemente es hat.

PROGRAMMIERKONZEPTE: Iteration, For-Struktur, Verschachtelung von For-Schleifen

 

 

LINIENSCHAR

 

Du kannst mit dieser for-Struktur eine hübsche Linienschar mit 20 Linien zeichnen.

from gpanel import *

makeGPanel(0, 20, 0, 20)

for i in range(21):
    line(i, 0, 20, i)
Programmcode markieren (Ctrl+C copy, Ctrl+V paste)
 

 

 

MEMO

 

for i in range(n) durchläuft die Zahlen von 0 bis n-1, also insgesamt n Zahlen. Die Verdichtungsstellen der Linien bilden eine quadratische Bézierkurve.

 

 

RANGE() MIT ZWEI PARAMETERN

 

Die range-Funktion kann auch zwei Parameter haben. In diesem Fall ist der erste Parameter der Start-Wert der Liste und der zweite der Stop-Wert, der allerdings nicht mehr in der Liste enthalten ist.

Wenn du beispielsweise print range(2, 9) schreibst, werden die Zahlen [2, 3, 4, 5, 6, 7, 8] in das Ausgabefenster geschrieben. Versuche es mit ein paar anderen Parametern.

Mit dem folgenden Programm zeichnest du Linien in zwei Farben mit den Startpunkten auf der x-Achse bei den Koordinaten -20 bis 20. Der Endpunkt ist bei allen Linien der Punkt (0, 40).

 

 


from gpanel import *

makeGPanel(-20, 20, 0, 40)

for i in range(-20, 21):
    if i < 0:
        setColor("red")
    else:
        setColor("green")    
    line(i, 0, 0, 40)
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

Die Schleife for i in range(start, stop) mit ganzzahligem Start- und Stop-Wert beginnt bei i = start und endet bei i = stop - 1, wobei der Schleifenzähler i bei jedem Schleifendurchgang um 1 vergrössert wird. Dabei musst du start kleiner als stop wählen, sonst wird Schleife nie durchlaufen.

 

 

RANGE() MIT DREI PARAMETERN

 

Du kannst die range-Funktion sogar mit drei Parametern aufrufen. In diesem Fall ist der erste Parameter der Start-Wert der Liste und der zweite der Stop-Wert, der dritte die Wertveränderung von einem Element zum nächsten. Damit kannst du die Schrittweite, die bisher immer 1 war, der Situation anpassen.

Wenn du beispielsweise print range(2, 15, 3)
schreibst, werden die Zahlen [2, 5, 8, 11, 14]
in das Ausgabefenster geschrieben.

In der nebenstehenden Grafik zeichnest du mit gefüllten Rechtecken eine auf der Spitze stehende Pyramide. Das kleinste Rechteck hat die Breite 2, das grösste 40.


 


from gpanel import *

makeGPanel(0, 40, 0, 40)

setColor("red")
y = 1
for i in range(2, 41, 2):
    move(20, y)
    fillRectangle(i, 1.5)
    y = y + 2 
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

Die Schleife for i in range(start, stop, step) beginnt bei i = start und endet bei einem Wert, der kleiner ist als stop. i wird bei jedem Schleifendurchgang um step vergrössert. Für die Werte start, stop und step kannst du auch negativen Zahlen wählen.

Bei negativen step wird i bei jedem Durchlauf um step verkleinert; der letzte Wert ist grösser als stop.

 

 

VERSCHACHTELTE FOR-SCHLEIFEN (Moiré)

 

Eng übereinander gezeichnete Linien können einen optischen Effekt erzeugen, den man Moiré-Muster nennt. Du zeichnest in einem Quadrat von 11 Punkten des unteren Rands je eine Linie zu 11 Punkten des oberen Rands. Dann machst du das gleiche vom linken zum rechten Rand.

 

 

from gpanel import *

makeGPanel(0, 10, 0, 10)

for i in range(11):
    for k in range(11):
        line(i, 0, k, 10)
        delay(50)
for i in range(11):
    for k in range(11):
        line(0, i, 10, k)
        delay(50)
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

Das Programm ist nicht ganz leicht zu verstehen, aber wichtig. Am besten gehst du davon aus, dass die Schleifenvariable i der äusseren Schleife einen konstanten Wert hat (zuerst 0). Mit diesem Wert wird die innere Schleife durchlaufen, also für die Werte k = 0 bis einschliesslich 10. Danach wird i auf 1 gesetzt und die innere Schleife mit diesem Wert von i erneut durchlaufen usw.

Durch den Befehl delay(millisec) wartet das Programm zwischendurch diese Anzahl Millisekunden, so dass du beobachten kannst, wie das Muster entsteht.

 

 

AUFGABEN

 
1.

Eine noch schönere Grafik als im Beispiel 1 erhältst du, wenn du Farben verwendest. Zeichne auch eine zweite Linienschar mit einer anderen Farbe (Abbildung a).


(a) (b)

Die blaue Linienschar (Abbildung b) ist mit line(i, 0, 0, 20 - i) gezeichnet. Kannst du auch die violette programmieren?


2.


Zeichne eine Kreisschar.

   

Die farbige Kreischar kannst du mit folgendem Vorgehen zeichnen: Du zeichnest zuerst einen gefüllten Kreis mit dem Radius y, dann wählst du schwarze Farbe und zeichnest einen Kreis mit dem gleichen Radius:

   setColor("cyan")
   fillCircle(y)
   setColor("black")
   circle(y)

3.

Im Beispiel 3 haben wir eine Pyramide gezeichnet, die auf dem Kopf steht. Zeichne eine "richtige" Pyramide mit drei Farben. Dabei kannst du eine for-Schleife mit Rückwärtszählen verwenden.


4.


Zeichne ineinander geschachtelte gefüllte Quadrate. Wenn du die Füllfarbe mit jedem gezeichneten Quadrat etwas dunkler machst, ergibt sich ein schöner 3-D-Effekt.

Du kannst die Farben wie folgt bestimmen:

green = 255
setColor(makeColor(0, green, 0))
und für das nächste Quadrat
green = green - 10