Wiederholungen in Java / im Applet

Wenn Befehlsfolgen mehrfach wiederholt werden sollen, sollte man das nicht mit copy & paste realisieren, sondern mit Schleifen.

Zählschleifen: for()

for(int variable = Anfangswert; variable < Endwert; variable++)
{
    Anweisungen
}

Eine Zählschleife setzt sich aus drei Schritten zusammen:

  1. int variable = Anfangswert: Weise variable den Anfangswert zu (oder anders ausgedrückt: setze variable auf den Anfangswert)
  2. variable < Endwert: Solange variable kleiner als der Endwert ist, wiederhole die Anweisungen
  3. variable++: Nach jedem Durchlauf wird variable um 1 erhöht. Anschließend wird Schritt 2 wiederholt.

Alternative Schleifenstruktur

int variable = Anfangswert;    //Schritt 1
while(variable < Endwert)      //Schritt 2
{
    Anweisungen
    variable++;                //Schritt 3
}

Grundsätzlich sollte man die Zählschleife for() immer dann einsetzen, wenn bekannt ist, wie häufig die Anweisungen wiederholt werden sollen, z.B. beim Zeichnen eines Quadrates.

Die while-Schleife wird am Besten dann eingesetzt, wenn man die Anzahl der Wiederholungen nicht für alle Fälle festlegen kann oder will, z.B. wenn man eine Quadratreihe vom linken bis zum rechten Rand des Zeichenfensters zeichnen will, die Zeichenfeldgröße aber nicht feststeht.

Allgemein sieht die Struktur einer while-Schleife so aus:

while(Bedingung erfüllt)
{
    Anweisungen
}

Endlosschleifen

Für „Bildschirmschoner“ wünscht man sich manchmal die Möglichkeit, eine dynamische Zeichnung (in der also durch das Einfügen von l.pause(zeit); ein sich langsam aufbauendes Bild erzeugt wird) immer wieder automatisch wiederholen zu lassen.

Eine (unschöne) Möglichkeit ist es, diese Wiederholung mit der while-Schleife zu realisieren:

while(true)
{
    Anweisungen
}

Diese Schleife hört nie auf, da die Bedingung immer erfüllt wird (Schlüsselwort true). Hier hört das Programm nie auf - das Applet lässt sich darum in der Regel nur durch das Schließen des Browsers beenden - wenn es ganz ungünstig kommt, kann man den Browser nur noch über den Task-Manager schließen.

Eine bessere, da kontrolliert zu beendende Möglichkeit ist der Befehl repaint();, mit dem in der Methode paint() bewirkt wird, dass alle Anweisungen der Methode wiederholt werden.

public void paint(Graphics g)
{
   Anweisungen
   repaint();
}

Beispiel mit bedingter Schleife

Aufgabe: Erstelle ein Programm (Lisa-Applet) mit den folgenden Eigenschaften

  • Zeichenfläche 500 x 500 Bildschirmpixel (also intern -500 … 500)
  • gezeichnet werden soll
    • ein gefüllter Kreis
      • Befehl: l.kreisflaeche(x, y, 42); der Punkt (x,y) ist die linke obere Ecke des umgebenden Quadrates
    • an zufälliger Position
      • Befehle: int x = (int) Math.random()*958-500; int y = (int) Math.random()*958 - 458;
    • der Kreis soll dann solange wachsen, bis der Rand der Zeichenfläche erreicht ist
      • erste Variante: der Kreis wächst aus der linken oberen Ecke nach rechts unten
      • zweite Variante: der Kreis wächst vom Mittelpunkt aus nach außen
    • anschließend soll der Kreis wieder schrumpfen, solange, bis der Radius nur noch den Wert 3 hat
    • das wachsen und schrumpfen soll sich wiederholen (z.B. 5 mal)
    • ein neuer Kreis entsteht und pulsiert wieder

Wachsen aus linker oberer Ecke

import java.applet.*;                                                                   
import java.awt.*;                                                                       
 
public class KreisPulseBsp extends Applet               
{
    Lisa l;  
    int x, y, radius;
 
    public void paint(Graphics g)                                                
    {  
        l=new Lisa(g,500);
 
        x = (int)(Math.random()*958-500);
        y = (int)(Math.random()*958-458);
 
        radius = 42;
        l.kreisflaeche(x, y, radius);      
 
        //wachsen von linker oberer Ecke aus
        //"solange x+radius <=500 und y-radius >=-500 gilt, zeichne den Kreis mit vergrößertem Radius
 
        while(x+radius <=500 && y-radius >=-500)
        {
            l.lisafarbe(5);
            l.rechteckflaeche(-500, 500, 1000, 1000);
            l.lisafarbe(1);
            l.kreisflaeche(x, y, radius++);
            l.pause(42);
 
        }
 
        //Hier fehlt das Schrumpfen. Übersetze dafür in Quelltext:
        //"solange der Radius größer als 3 ist, zeichne den Kreis mit verkleinertem Radius neu"
 
        repaint();
    } //Ende von paint                                                                                                 
 
}//Ende von class

Kreis wächst aus der Mitte

Tipp: Die Programmierarbeit vereinfacht sich, wenn jetzt die zufällig bestimmten Werte x und y als Koordinaten des Kreismittelpunkts verwendet werden. Die linke obere Ecke befindet sich dann im Punkt (x-Radius|y+Radius).

Die neue Schwierigkeit ist die Bestimmung des größtmöglichen Radius beim Wachsen. Dazu ist es hilfreich, eine neue Variable int max; zu deklarieren.

Diese Variable erhält zuerst den Abstand der x-Koordinate zum linken bzw. rechten Rand.

Beispiel: „Wenn max größer als der Abstand der y-Koordinate zum oberen Rand ist, ersetze den Wert von max.“

if( max > 500 - y) max = 500-y;

Tipp: Mit Math.abs(zahl); kann man den Betrag einer Zahl bestimmen.

Ergänzende Aufgabe

Alles fertig? Prima.

Jetzt kann das Programm noch verfeinert werden.

Wenn der Kreismittelpunkt links von der Mitte ist, soll der Kreis grün gezeichnet werden, sonst rot.

Oder:

Wenn der Kreismittelpunkt im oberen rechten Quadranten liegt, soll er rot gezeichnet werden, im unteren rechten blau, im unteren linken grün und im oberen linken gelb (die Farben sind natürlich frei zu wählen).

Für die Profis:

Je nach Lage im Quadranten wird ein gefüllter oder ungefüllter Kreis bzw. ein gefülltes oder ungefülltes Quadrat gezeichnet.

Und dann gibt es ja noch den Befehl l.dreieckflaeche(…) - hier muss man sich dann schon gut überlegen, wie das mit dem Wachsen gehen soll.

schule/if/lisa/schleifen.txt · Zuletzt geändert: 2018/05/29 23:54 von 127.0.0.1
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0