Jython

8. for-Struktur

In vielen Programmiersprachen sind for-Schleifen eine oft eingesetzte Alternative zu den while-Schleifen und werden insbesondere dann verwendet, wenn bei jedem Schleifendurchgang eine Schleifenvariable um den gleichen Wert (in Python ein ganzzahliger Wert) verändert wird.

Die einfachsten for-Schleifen, sind sogenannte Zählschleifen in der Form:

for i in range(n):
    Anweisung1 
    Anweisung2 
    ...

range(n) liefert die Zahlen 0, 1, 2, ...bis n-1, also insgesamt n Zahlen (Es handelt sich eigentlich im eine Liste mit den Zahlen [0, 1, .., n-1] ) . Der Startwert von i ist 0 und i wird nach jedem Schleifendurchlauf um 1 erhöht. Die Anweisungen im Schleifenblock werden also n mal wiederholt. Diese Schleife entspricht einer while-Schleife mit Startwert 0, der Schleifenbedingung i < n und der Wertänderung i = i +1.

Bemerkung: Falls im Schleifenkörper i nicht verwendet wird, kann in TigerJython an Stelle der for-Schleife eine repeat-Schleife verwendet werden, die keine Variablen benötigt und daher für Programmiereinsteiger einfacher verständlich ist.

Beispiel 1: Mit einer for-Schleife einen Linienschar zeichnen
Es werden 21 Linien von links nach rechts und 21 Linien von rechts nach lins gezeichnet. Die Variable i durchläuft dabei die Werte 0, 1, 2, .. 20 also ingesamt 21 Werte.

# Gp8a.py
from gpanel import *

makeGPanel(0, 20, 0, 20)

for i in range(21):
    line(0, 10, 20, i)
    line(20, 10, 0, i)
    delay(100)
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

line(0, 10, 20, i) Zeichnet eine Linie mit dem Anfangspunkt (0, 10) und Endpunkt (20, i).

 

Beipiel 2: for-Schleifen mit 1, 2, bzw. 3 Parameter verwenden

Die allgemeine Form einer for-Schleife verwendet range() mit drei Parametern:

for i in range(start, stop, step):
    Anweisung1
    Anweisung2
    ...

Der Startwert start muss zu Beginn nicht 0 sein und die Wertänderung step kann eine beliebige ganze Zahl (auch negativ) sein. Ist step positiv, so werden die Anweisungen im Schleifenblock werden wiederholt, so lange i kleiner als der stop-Wert ist. Anschaulich erkennt man den Unterschied zwischen den for-Schleifen mit 1, 2, bzw. 3 Parametern an folgenden Beispielen:

for i in range(n):

for i in range(start, end):

for i in range(start, end, step):

from gpanel import *

makeGPanel(-30, 30, -30, 30)

for i in range(60): 
    rectangle(i, i)
from gpanel import *

makeGPanel(-30, 30, -30, 30)

for i in range(20, 40): 
    rectangle(i, i)
from gpanel import *

makeGPanel(-30, 30, -30, 30)

for i in range(10, 40, 3): 
    rectangle(i, i)

Erklärungen zum Programmcode:

Anstelle einer for-Schleife kann man immer auch eine while-Schleife verwenden. Das Umgekehrte ist nicht der Fall, da für die Wertänderung in der for-Schleife nur ganze Zahlen erlaubt sind.

 

Beispiel 3: Verwendung von verschachtelten for-Schleifen
Um ein Schachbrett zu zeichnen, geht man alle Felder einer 8x8 Matrix mit einem Zeilenindex x und einem Spaltenindex y mit zwei ineinander verschachtelten for-Schleifen durch. Man beginnt bei y = 0 und geht mit festem Wert von y in der inneren Schleife alle x durch, dann setzt man y = 1, usw.

# Gp8c.py
from gpanel import *

makeGPanel(0, 8, 0, 8)
setColor("blue")

for y in range(8):
    for x in range(8):
        if (x + y) % 2 == 0:
            fillRectangle(x, y, x + 1, y + 1)
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

if (x + y) % 2 == 0 Überprüft,  ob die Summe des Zeilen- und Spaltenindex eine gerade Zahl ist. Wie man leicht sieht, muss in diesem Fall ein gefülltes Quadrat gezeichnet werden.

Die Modulo-Division a % b gibt bei der ganzzahligen Division von a durch b den Divisionsrest zurück. a % 2 gibt also 0 zurück, falls a gerade ist, und gibt 1 zurück, falls a ungerade ist.

 

Beispiel 4: Zeichnen eines Moiré-Musters
Ein Moiré entsteht, wenn sich Geradenscharen überlagern. Die nebenstehende Figur kann mit zwei verschachtelten for-Schleifen erzeugt werden.

# Cp8d.py

from gpanel import *

makeGPanel(0, 10, 0, 10)

for i in range(0, 11):
    for k in range (0, 11):
        line(i, 0, k, 10)
        delay(100)
    
for i in range(0, 11):
    for k in range (0, 11):
        line(0, i, 10, k)
        delay(100)
► In Zwischenablage kopieren
 

 


Aufgaben: Serie 8

1)


Zeichne mit einer for-Schleife 10 Quadrate.


 


2)


Experimentiere mit Linienscharen und erstelle einige schöne Grafiken.

 


3)


Gehe mit verschachtelten for-Schleifen alle Felder einer 8x8 Matrix durch und färbe sie gemäss nebenstehender Vorlage.