6. Loops

 

 

Richtig spannend wird das Programmieren erst, wenn Programmteile mehrmals durchlaufen werden. Solche Programmteile werden Schlaufen oder eben Loops genannt. Vielleicht wäre das Bild einer Spirale noch besser: Meist wird nämlich ein Programmteil nicht genau gleich, sondern jedesmal in einer etwas abgeänderten Form durchlaufen.


For Loop

Es gibt drei Arten, in Java Schlaufen zu programmieren: For, While und Do - while. Beginnen wir mit der For - Schlaufe und beginnen wir mit einem Beispiel:

  • Erzeugen Sie ein neues Projekt namens LoopTest mit dem Template "Basic Java Application"und erstellen Sie wieder die paint() Methode ganz am Schluss von LoopTestFrame (vor der letzten schliessenden geschweiften Klammer).
  • Die Methode soll folgende Anweisung enthalten:

    for (int i = 0; i <= 9; i++)
       g.drawString("Nummer "+i,20,100+20*i);

  • Übersetzen (<F7>) und testen (<F5>) Sie!

Erklärung:

  1. Die For - Anweisung besteht aus drei Teilen: Dem Namen for, der runden Klammer mit der "Schleifenmechanik" und dem Schlaufeninhalt.
  2. Die Runde Klammer besteht wieder aus drei Teilen, die durch ; getrennt sind.
  3. Der erste Teil sagt, wie die Schlaufe beginnt: Hier "Beginne mit einem Wert von 0 für die Variable i".
  4. Der zweite Teil ist die Abbruchbedingung. Hier: Die Schlaufe wird ausgeführt, solange i kleiner oder gleich 9 ist.
  5. Der dritte Teil gibt die Veränderung von einem Schlaufendurchgang zum nächsten an. Eigentlich sollte hier stehen i = i + 1. Da es sehr häufig vorkommt, dass ein Variablenwert um 1 erhöht wird, gibt es diese abgekürzte Schreibweise i++ (C++ lässt grüssen!).
  6. Der Schlaufeninhalt besteht in unserem Fall aus einer einzigen Anweisung, nämlich dem Aufruf der Methode drawString(). Würde die Schlaufe aus mehreren Anweisungen bestehen, müssten diese in einer geschweiften Klammer zusammengefasst werden.
  7. Sie sehen, dass in der Schlaufe die "Laufvariable" i verwendet werden kann. Sie soll hier aber nicht verändert werden, sonst gibt es ein Durcheinander!
  8. Beachten Sie auch einen Trick beim Text (= String), welcher herausgeschrieben wird: Strings können "addiert" werden. Das bedeutet, dass sie einfach aneinandergehängt werden (= concatenation). Java wandelt hier die Zahl i (int!) in einen String um. Später folgt mehr zu Strings.

Aufgaben:

  1. Wie wär's mit Quadratzahlen? Zwei Kolonnen: In der ersten steht die Zahl, in der zweiten ihr Quadrat.
    Tips:
    - Quadrieren nie durch Potenz, sondern als Multiplikation, das geht schneller!
    - Der erste Wert (Parameter) in drawString() muss ein String sein - auch der leere ist einer!
  2. Schöner wäre wohl eine Zeichnung, Quadratzahlen ergeben doch eine Parabel:



    Tips:
    - In drawLine() brauchen Sie jeweils den "neuen" und den "alten" Wert von i, also z.B. i und i+1!
    - Achten Sie darauf, dass Sie gut skalieren, i also mit einem günstigen Wert multiplizieren!
    - Sie können auch die Grösse des Fensters verändern. Finden Sie heraus wo? Bei mir ist's 200 mal 200.

 
While Loop

For Loops werden verwenden, wenn man von Anfang an weiss, wie oft die Schlaufe durchlaufen wird, While Loops im andern Fall. Nehmen wir als Beispiel Zufallszahlen: Wir zählen wie oft wir würfeln müssen, bis wir eine 6 gewürfelt haben:

  • Zum dritten Mal erzeugen Sie ein neues Projekt, diesmal mit Namen RandomTest und erstellen die paint() Methode.
  • In die paint() Methode kommt die Anweisung

    g.drawString("Zufallszahl = "+Math.random(),10,100);

  • Übersetzen und laufen lassen, mehrmals laufen lassen!

Math ist eine sogenannte Klasse und sie enthält die Methode random(). Random liefert eine zufällige Zahl zwischen 0 und 1 (wie Sie sicher festgestellt haben) vom Typ double. Wir wollten aber Zahlen zwischen 1 und 6.

  • Also multiplizieren Sie mit 6!

Das gibt aber immer noch Zahlen mit Kommastellen (double!). Wir wandeln Datentypen um, indem wir den gewünschten Typ in Klammer davor schreiben. Und wir müssen noch 1 dazuzählen, denn ein Würfel hat ja keine Seite ohne ein einziges Auge! Bei mit sieht das dann so aus:

(int)(Math.random()*6+1)

  • Testen Sie wieder!

Das hatte noch nichts mir einer Schlaufe zu tun.Wir wollen würfeln, bis wir eine 6 haben und uns merken, wie oft wir gewürfelt haben, mit do-while:

public void paint(Graphics g) {
  int zahl;
  int i = 0;

  do {
    zahl = (int)(Math.random()*6+1);
    i++;
  } while (zahl < 6);

  g.drawString("Beim "+i+". Wurf eine 6!",10,100);
}

  • Lassen Sie das Programm in dieser Form laufen, mehrmals.

Ich habe die do-while Schlaufe verwendet: Das was zwischen do und while steht wird solange ausgeführt, als die Bedingung in der Klammer nach while erfüllt ist. Diese Form hat den Vorteil, dass die Schlaufe mindestens einmal ausgeführt wird, weil erst am Ende geschaut wird, ob zu wiederholen ist. Bei der While Schlaufe wird im Unterschied dazu am Anfang geprüft, ob die Schlaufe noch ausgeführt werden soll und das bedeutet, dass sie eventuell nie ausgeführt wird!

Do-while sieht so aus:

do { Schlaufeninhalt } while ( Bedingung);

While sieht so aus:

while ( Bedingung ) { Schlaufeninhalt }

Was müsste in unserem Fall vorgekehrt werden, wenn man while anstatt do-while verwenden möchte?

Richtig: Der Variablen zahl müsste vor der Schlaufe ein Wert kleiner 6 zugewiesen werden, z.B. so wie bei i.

  • Schreiben Sie die Methode so um, dass eine while Schlaufe verwendet wird..

Aufgabe:

  • Verpacken Sie den while Loop in eine for Schlaufe so, dass z.B. 10 mal getestet wird wie oft zu würfeln ist und lassen Sie sich den Durchschnitt anzeigen. Betreiben Sie etwas Statistik: Ist es wirklich so, dass der Durchschnitt sich umso besser der 6 annähert je mehr Versuche Sie machen?

Ihr Programm hat eine Schlaufe in einer Schlaufe: Die Loops sind verschachtelt. Das ist eine sehr häufige Form. Oft sind auch zwei for Schlaufen oder zwei while Schlaufen ineinander verschachtelt. Merken Sie sich gut, wie Sie die Aufgabe gelöst haben, sie werden das noch oft brauchen!