TigerJython4Kids
HomeTurtlegrafikRobotikDatenbanken
while&for

10. WHILE & FOR

 

 

DU LERNST HIER...

 

wie du die Wiederholstrukturen mit den Keywords while und for verwendest. Es handelt sich um die wichtigsten Programmstrukturen überhaupt.

 

 

MUSTERBEISPIEL ZUR WHILE-SCHLEIFE

 

Die weitaus am häufigsten eingesetzte Wiederholstruktur  kann umgangssprachlich so formuliert werden: "Solange die folgende Bedingung erfüllt ist, führe den nachfolgenden Programmblock aus..." Die Wiederholschleife beginnt mit dem Keyword while und einer Bedingung, gefolgt von einem Doppelpunkt. Der nachfolgende Programmblock muss eingerückt werden.

from gturtle import *

makeTurtle()
hideTurtle()
setPos(-300, -200)

a = 1
while a < 100:
    forward(8)
    right(a)
    a = 1.01 * a
    
► In Zwischenablage kopieren
 

 

 

MERKE DIR...

 

Die Bedingung a < 100 nennt man auch Laufbedingung, da sie wahr sein muss, damit der Block durchlaufen wird. Die übliche Art, die Schleife zu verlassen, besteht darin, im Schleifenkörper dafür zu sorgen, dass die Laufbedingung falsch wird. Hier erhöhst du a bei jedem Durchgang um den Faktor 1.01 und brichst ab, wenn a nicht mehr kleiner als 100 ist.

 

 

ZUM SELBST LÖSEN


  1.

Bisher hast du für eine bestimmte Zahl von Wiederholungen die repeat-Schleife verwendet. Neu kannst du auch eine while-Schleife mit einem Schleifenzähler i verwenden.

from gturtle import *

makeTurtle()

i = 0
while i < 4:
    forward(100)
    right(90)
    i = i + 1 

Die nebenstehende Figur entsteht, indem du mit einer while-Schleife 90 mal mit rightCircle(100) einen Kreis zeichnest und die Turtle um 4 Grad nach links drehst. Schreibe das Programm und spiele etwas mit dem Drehwinkel.

 

  2.

Die Turtle soll mit normaler Geschwindigkeit wiederhollt 100 Schritte vorwärts gehen und 122 Grad links drehen. Nach 30 Sekunden soll sie sich zur Ruhe setzen.

Anleitung: Mit time.time() liefert dir das System die aktuelle Uhrzeit (in Sekunden seit 1.1.1970). Dazu musst du mit import time das entsprechende Modul importieren. Willst du ein Zeitintervall bestimmen, so musst du die Anfangszeit in einer Variablen startTime speichern und die Differenz time.time() - startTime bilden.

 

 

 

MUSTERBEISPIEL ZUR FOR-SCHLEIFE

  Oft bist in der Situation, dass du eine Wiederholschleife eine bestimmte Anzahl mal durchlaufen musst und dabei eine ganzzahlige Variable brauchst, die bei jedem Durchgang um eins grösser wird. Du kannst dies zwar mit einer repeat- oder while-Schleife machen, es gibt aber noch eine elegantere Möglichkeit mit einer for-Schleife, wo der Schleifenzähler automatisch verändert wird.

Willst du die n  Zahlen i von 0 bis n-1 durchlaufen, so schreibst du dazu:

for i in range(n):
      (Schleifenkörper)

Mit der Funktion line(x1, y1, x2, y2) zeichnet die Turtle eine Linie vom Punkt (x1, y1) zum Punkt (x2, y2). Nachfolgend zeichnest du damit eine hübsche Linienschar mit 20 Linien.

 


from gturtle import *

def line(x1, y1, x2, y2):
    setPos(x1, y1)
    moveTo(x2, y2)
    
makeTurtle()
hideTurtle()

for i in range(21):
    line(10 * i, 0, 200, 10 * i)
► In Zwischenablage kopieren

 

 

MERKE DIR...

  Beachte, dass mit for i in range(21): alle 21 Zahlen 0, 1, 2,..20 durchlaufen werden. Der Parameter n in range(n) gibt also nicht etwa den Endwert an. Vergiss auch den Doppelpunkt nicht.

 

 

ZUM SELBST LÖSEN


  3.

Die nebenstehende Figur erzeugst du, indem du 20 Kreise mit openDot(d) zeichnest und die Turtle bei jedem Schleifendurchgang um 5 Schritte vorwärts laufen lässt. Verwende dazu eine for-Schleife.

 

  4.

Zeichne die nebenstehende Figur.

 

 

 

ZUSATZSTOFF: INEINANDER GESCHACHTELTE FOR-SCHLEIFEN

 

Schleifen können auch ineinander geschachtelt sein. Willst du beispielsweise ein Gitter (eine Tabelle oder Matrix) mit 8 horizontalen und 8 vertikalen Zellen durchlaufen, so kannst du dies mit einem Zeilenindex i und einem Spaltenindex k tun, die beide von 0 bis 7 laufen.

 

Mit

for i in range(8):
    for k in range(8):
        print i, k
► In Zwischenablage kopieren

durchläufst du bei festem i in der inneren Schleife mit k die Zeile und nimmst dir dann die nächste Zeile i vor.


Als lustige Übung zeichnest du mit diesem Verfahren ein Schachbrett. Du siehst leicht ein, dass du immer dann ein gefülltes Quadrat zeichnen musst, wenn die Summe des Zeilen- und Spaltenindex eine gerade Zahl ist.

 

from gturtle import *

def field(x, y):
    setPos(x, y)
    startPath()
    repeat 4:
        forward(30)
        left(90)
    fillPath()    

makeTurtle()
hideTurtle()
for i in range(8):
    for k in range(8):
        if (i + k) % 2 == 0:
            field(30 * i, 30 * k) 
► In Zwischenablage kopieren

 

   

 

10-1
Didaktischer Hinweis:

Die for-Struktur sollte eigentlich erst nach der Kenntnis von Containertypen (Listen, usw.) eingeführt werden. Sie ist aber von so grosser Verbreitung, dass sie hier - zwar etwas pragmatisch und unvollständig - behandelt  wird.

10-2
Didaktischer Hinweis:

Es wird bewusst keine Aufgabe mit einem Schleifenzähler gewählt, da solche Aufgaben besser mit einer for-Struktur gelöst werden. While-Schleifen sind dann interessant, wenn die Anzahl Durchläufe nicht zum vornherein feststeht oder wenn das Schleifeninkrement ein Float ist.

10-3
Fachlicher Hinweis:

Da repeat in Python2.7 und Python 3.x nicht zu den Keywords gehört, ist mit einer dieser Versionen sowieso eine while- oder for-Schleife nötig.

10-4
Didaktischer Hinweis:

Früher war es üblich, die while-Struktur mit einem Flussdiagramm oder einem Struktogramm zu veranschaulichen. Langjährige Schulerfahrungen zeigen, dass dies zu keiner Verbesserung des algorithmischen Denkens führt, da der Code selbst aussagekräftiger ist. In der Profiwelt sind solche Diagramme verpönt und gelten als rückständig.

Es ist deshalb umstritten, ob Pseudocode oder Ablaufschemas bzw. "Informatik ohne Computer"  für den Programmierunterricht förderlich sind.

10-5
Didaktischer Hinweis:

Aus methodischen Gründen wird hier die genaue Funktionsweise der for-Schleife nicht erklärt, da sie ein Verständnis für Containerstrukturen (Listen, usw.) voraussetzt. Zudem ist die range()-Funktion kompliziert, da sie 1, 2 oder 3 Parameter haben kann und sich trickreich verhält.

Das "Verschweigen von Komplexität" ist ein in der Ausbildung erlaubtes methodisches Verfahren, so lange dabei nicht fachlich falsche Aussagen gemacht werden.

10-6
Didaktischer Hinweis:

Der Linienbefehl entspricht nicht der richtungsorientierten Turtlegrafik und ist darum  in der Turtlebibliothek nicht enthalten. Hier wird aber bewusst eine Verbindung zur Koordinatengrafik gemacht.

10-7
Fachliche Hinweise:

In der Informatik beginnt eine Aufzählung mittels eines Index immer mit 0, d.h. das erste Element hat den Index 0, das zweite den Index 1, usw. Dies ist vor allem historisch bedingt, da man rechnerintern den Index auch als Adressoffsetauffassen kann, mit dem man auf ein Element eines Arrays (indirekt) zugreift. Dieser Unterschied zum täglichen Leben, wo man üblicherweise bei einer Zählung mit 1 beginnt,  führt immer wieder zu Programmierfehlern.
Man merke sich:  n-Elemente haben (fast) immer den Index 0 bis n-1.