Home > Informatik > Einführung in die OOP > 3. Schleifen > 3.2 While-Schleifen

3.2 While-Schleifen, Teil 2

Weitere Beispiele

Das erste Beispiel für while-Schleifen war eine sogenannte Zählschleife. Wir haben von 1 bis 10 gezählt und dabei eine Berechnung mit den Zahlen von 1 bis 10 durchgeführt. Solche Aufgaben werden an sich von for-Schleifen besser erledigt. Aber dazu später. Wir schauen uns jetzt mal eine while-Schleife an, die ebenfalls zählt, aber nicht ganz so auffällig wie der erste Schleife.

int month = 12;

while (month > 0)
{
   System.out.println(month);
   month--;
}

In der Vorbereitung der Schleife wird die int-Variable month auf den Wert 12 gesetzt. In der Schleifenbedingung wird gefragt, ob month noch größer ist als 0. Wenn das der Fall ist, wird month ausgegeben und dann dekrementiert (also um 1 erniedrigt).

Wir wollen einmal in die Fachliteratur und im Internet schauen, was es sonst noch so an einfachen Beispiel für while-Schleifen gibt.

Übung 3.2 #1

1. Warum führt dieser Quelltext zu einer Endlosschleife?

    public void quadratzahlen()
    // Quadratzahlen der Zahlen 1 bis 20 ausgeben
    {
       int zahl = 1;
       while (zahl <= 20)
          System.out.println(zahl*zahl);
    }

2. Korrigieren Sie den Quelltext so, dass er die Quadratzahlen der Zahlen 1 bis 20 ausgibt.

3. Verändern Sie den Quelltext so, dass er die Quadratzahlen der Zahlen 30 bis 10 absteigend ausgibt, also mit 900 beginnt und mit 100 aufhört.

4. Wie 3, aber es sollen nur die Quadratzahlen von geraden Zahlen (40 bis 2) ausgegeben werden.

Die folgenden Aufgaben gibt es auch auf einem PDF-Arbeitsblatt zum Download.

Übung 3.2 #2

Schreiben Sie eine Methode, die alle Potenzen von 2 ausgibt, die kleiner als 1000 sind, also:

1, 2, 4, 8, ..., 512

Aufgabe 3.2 #3

Analysieren Sie folgenden Quelltext.

1. Was wird hier allgemein ausgegeben ?

2. Wie funktioniert der Algorithmus ?

    public void keineAhnung(int zahl)
    {
       int var1 = 0;
       int var2 = zahl;
       
       while (zahl > 0)
       {
          int irgendwas = zahl % 10;
          var1 += irgendwas;
          zahl = zahl / 10;
       }
       
       System.out.printf("Ergebnis von %6d ist %4d%n",var2,var1);
    }  

3. Warum muss der Parameter zahl in var2 gespeichert werden?

Übung 3.2 #4

Schreiben Sie eine Methode

public int fakultaet(int zahl)

die die Fakultät einer ganzen Zahl (1, 2, 3, ..., 10) berechnet. Bei Zahlen, die nicht in dem Intervall [1, 10] liegen, soll der Wert -1 zurückgegeben werden.

Übung 3.2 #5

1. Schreiben Sie eine Methode

public int kleinsterTeiler(int zahl)

die den kleinsten Teiler größer 1 dieser Zahl bestimmt. Beispiel zahl = 15, kleinster Teiler = 3. Zahl =35, kleinster Teiler = 5. Zahl 13, kleinster Teiler = 13.

Kleine Hilfe: Die folgende Methode leistet das Gewünschte, benutzt aber noch keine while-Schleife:

  public int kleinsterTeiler(int zahl)
    {
       if (zahl %  2 == 0) return  2;
       if (zahl %  3 == 0) return  3;
       if (zahl %  4 == 0) return  4;
       if (zahl %  5 == 0) return  5;
       if (zahl %  6 == 0) return  6;
       if (zahl %  7 == 0) return  7;
       if (zahl %  8 == 0) return  8;
       if (zahl %  9 == 0) return  9;
       if (zahl % 10 == 0) return 10;
       return 1;
    }

Jetzt sollte es nicht mehr allzu schwer sein!

2. Schreiben Sie eine Test-Methode

public void testeKleinsterTeiler()

die mithilfe einer while-Schleife die Methode kleinsterTeiler() für die Zahlen von 2 bis 150 testet.

3. Kopieren Sie die Methode testeKleinsterTeiler() und modifizieren Sie diese so, dass nur noch die Primzahlen im Intervall [2,150] ausgegeben werden.

4. Es wäre schön, wenn Ihre Ausgabe zu Punkt 3 so aussehen könnte:

Die Zahl      1 ist die   1.te Primzahl
Die Zahl      2 ist die   2.te Primzahl
Die Zahl      3 ist die   3.te Primzahl
Die Zahl      5 ist die   4.te Primzahl
Die Zahl      7 ist die   5.te Primzahl
Die Zahl     11 ist die   6.te Primzahl
Die Zahl     13 ist die   7.te Primzahl
Die Zahl     17 ist die   8.te Primzahl

und so weiter...

Übung 3.2 #6

Schreiben Sie eine Methode

public void funktionstabelle(double xStart, double xEnde, double sw)

welche die x- und y-Werte einer Funktion y = f(x) tabellarisch ausgibt. Dabei bestimmen xStart und xEnde den Anfang und das Ende des Definitionsbereichs der Funktion, und sw gibt die Schrittweite an, mit der der x-Wert inkrementiert werden soll.

Die Funktion f(x) selbst implementieren Sie dann als eigene Methode, zum Beispiel

private double funktion(double x)
{
   return 2*x*x - 3*x +3;
}

In der Methode funktionstabelle() können Sie dann auf diese private-Methode folgendermaßen zugreifen:

y = funktion(x)

wobei y eine double-Variable und x die Laufvariable der while-Schleife ist.

Für die oben als Beispiel gezeigte quadratische Funktion könnte die Funktionstabelle für xStart = -3, xEnde = 3, sw = 0.5 so aussehen:

 -3,00 →  30,00 
 -2,50 →  23,00 
 -2,00 →  17,00 
 -1,50 →  12,00 
 -1,00 →   8,00 
 -0,50 →   5,00 
  0,00 →   3,00 
  0,50 →   2,00 
  1,00 →   2,00 
  1,50 →   3,00 
  2,00 →   5,00 
  2,50 →   8,00 
  3,00 →  12,00 

Übung 3.2 #7

Modifizieren Sie die Methode aus der letzten Übung so, dass sie am Ende der Funktionstabelle ausgibt, wo das (lokale) Minimum der Funktion liegt.

Bei dem Beispiel aus Übung 3.2 #6 würde diese Methode das lokale Minimum bei x = 0,5 finden (zumindest bei der Schrittweite sw = 0.5).

Wollte man das Minimum genauer lokalisieren, müsste man jetzt den Definitionsbereich kleiner machen (zum Beispiel 0 bis 1.5) und die Schrittweise ebenfalls verringern.

Hier eine Beispielausgabe für die gleiche Funktion wie in Übung 3.2 #6 und xStart = 0, xEnde = 1.5, sw = 0.2:

  0,00 →   3,00 
  0,20 →   2,48 
  0,40 →   2,12 
  0,60 →   1,92 
  0,80 →   1,88 
  1,00 →   2,00 
  1,20 →   2,28 
  1,40 →   2,72 
Minimum gefunden bei x = 0.8

Übung 3.2 #7 Ergänzung für Experten

Wenn das Minimum lokalisiert wurde, wird der Definitionsbereich verengt (xmin-sw bis xmin+sw) und die Schrittweite verringert (sw = sw/10) und das Minimum erneut gesucht. Modifiziert eure Methode so, dass sie das automatisch macht.

Das Verfahren kann auch noch einmal wiederholt werden, um das Minimum noch genauer zu lokalisieren.

Superexperten bauen diese drei Suchvorgänge in einer äußere while-Schleife ein, um die Redundanzen in dem Quelltext zu vermeiden.

Die äußere while-Schleife läuft drei oder viermal ab. Bei jedem Schleifendurchgang wird der Suchbereich weiter eingegrenzt und die Schrittweite systematisch verringert. Dann erfolgt im inneren Schleifendurchgang die eigentliche Suche nach dem Minimum.

Seitenanfang
Weiter mit for-Schleifen ...