Schleifen
Am Ende des ersten Teils dieser Folge 4 hatten wir schon kurz über Schleifen gesprochen und dabei auch schon eine erste while-Schleife kennen gelernt. Schauen wir uns jetzt einmal den Quelltext einer leicht veränderten Testklasse für unser Auto an.
public class Test
{
Auto otto;
public Test()
{
otto = new Auto(10000, 70, 7.5);
otto.anzeigen();
int strecke = 0;
while (strecke < 50)
{
otto.fahren(1);
otto.anzeigen();
strecke++;
}
}
}
Hier wird wieder ein neues Objekt der Klasse auto erzeugt, das schon 10.000 km gefahren ist, ein Tankvolumen von 70 Litern hat und 7,5 Liter Benzin auf 100 km verbraucht. Dann werden die Daten in der Konsole angezeigt. Eine lokale Variable strecke wird mit dem Wert 0 initialisiert.
Nun kommt ein while-Schleife. Allerdings hat diese while-Schleife eine völlig andere Schleifenbedingung als die erste while-Schleife aus Folge 4.1. Es wird nicht gefragt, ob noch genug Benzin vorhanden ist (Tank nicht leer), sondern es wird überprüft, ob die gefahrene Strecke immer noch kleiner ist als 50 km. Wenn das der Fall ist, fährt das Auto einen weiteren Kilometer: fahren(1). Dann werden wieder die Werte angezeigt, und am Ende - immer noch in der while-Schleife - wird die gefahrene Strecke um 1 km erhöht.
Dann ist die while-Schleife zu Ende, und das Programm springt wieder zum Kopf der while-Schleife, wo jetzt die Schleifenbedingung erneut überprüft wird, ob sie noch erfüllt ist.
In dem Lernbaustein finden Sie weitere Informationen zu while-Schleifen.
Aufgaben und Übungen
Aufgabe 4.2-1
Stellen Sie die obige while-Schleife mit Hilfe eines Flussdiagramms graphisch dar!
Aufgabe 4.2-2
Finden und erläutern Sie den Fehler in der folgenden while-Schleife:
summe = 0; x = 100; while (x > 120) { x = x + 5; summe = summe + x;}
Aufgabe 4.2-3
a) Berechnen Sie, wie oft die folgende while-Schleife durchlaufen wird:
x = 100; while (x <= 70) x = x + 3; System.out.println(x);
b) Geben Sie an, welcher Wert in der Konsole ausgegeben wird.
Die letzte Übung zeigt übrigens, dass man auf die geschweiften Klammern verzichten kann, wenn nur eine einzige Anweisung in der while-Schleife steht.
Übung 4.2-4
Schreiben Sie ein Programm, das mit Hilfe einer while-Schleife die Summe der Zahlen von 1 bis 1000 berechnet und dann in der Konsole ausgibt.
Aufgabe 4.2-5 (für Fortgeschrittene)
Betrachten Sie die folgende while-Schleife:
while (a != b) { if (a > b) a = a-b; else b = b-a; } erg = a
Geben Sie an,
a) welche Zahl diese while-Schleife berechnet, wenn a=35 und b = 15 ist,
b) was der Algorithmus überhaupt (allgemein) berechnet.
Übung 4.2-6 (für sehr Fortgeschrittene)
Der Wert der Kreiskonstante Pi ist bekanntlich 3,14159...
Es soll nun ein Quotient (Bruch) A/B berechnet werden, dessen Wert ungefähr dem Wert der Konstante Pi gleicht. Welchen Zähler und welchen Nenner muss man dafür einsetzen, damit der Quotient von dem "echten" Pi höchstens um 0,01 abweicht (nach oben oder nach unten)?
Ein erster Vorschlag wäre 10/3, damit kommt man auf den Wert 3,3333. Dieser Wert ist aber eindeutig zu groß. Also könnte man es mit 10/4 versuchen, die resultierenden 2,50 sind aber wieder zu klein für Pi.
Als Nächstes erhöhen wir den Zähler auf 11, mit 11/4 erhalten wir 2,75 - immer noch zu klein. Mit 12/4 erhalten wir 3, also immer noch zu klein, und mit 13/4 liefet 3,25 wieder einen zu großen Wert für Pi. Also erhöhen wir den Nenner auf 5. Mit 13/5 gibt es mit 2,6 einen zu kleinen Wert, mit 14/5 2,8 und mit 15/3 3,0, beides zu klein. Mit 16/5 erhalten wir 3,2, also einen zu großen Wert. Also erhöhen wir wieder den Nenner: 16/6 - der Wert ist mit 2,667 aber wieder zu klein.
Wenn Sie das Vorgehen dieses "Algorithmus" verstanden haben, sollten Sie einmal versuchen, eine while-Schleife zu programmieren, die dieses Vorgehen simuliert. Also immer wenn der erreichte Quotient zu groß ist, erhöhen Sie den Wert des Nenners um 1, und wenn der erreichte Wert zu klein ist, erhöhen Sie den Wert des Zählers um 1. Solange (Schleifenbedingung), bis der Unterschied zwischen 3,14159 und dem berechneten Wert kleiner ist als 0,01. Die Schleifenbedingung könnte also so aussehen:
while ((pi - quotient > 0.01) || (pi - quotient < -0.01))
Seitenanfang -
weiter mit Folge 4.3 - weitere Aufgaben zu Schleifen