Kopfgesteuerte Schleifen
Fünf Münzen auf die Bühne zu setzen kostete dich fünf fast identische Blöcke. Eine Schleife wiederholt einen Block, solange eine Bedingung erfüllt ist – egal ob fünfmal oder fünftausendmal.
Der Ablauf als Flussdiagramm
flowchart TD
S([Start]) --> V[zaehler = 1]
V --> B{zaehler <= 5?}
B -- ja --> A[Ausgabe: zaehler]
A --> I[zaehler = zaehler + 1]
I --> B
B -- nein --> E([Ende])
Der Pfeil von zaehler = zaehler + 1 zurück zur Raute macht die Schleife aus. Die Bedingung wird vor jedem Durchlauf geprüft – daher der Name kopfgesteuert.
Die while-Schleife
while (Bedingung) {
// Schleifenrumpf
}
Jede Schleife braucht drei Dinge – vergiss eines, und sie funktioniert nicht:
- eine Initialisierung vor der Schleife (
int zaehler = 1;) - eine Bedingung im Kopf (
zaehler <= 5) - eine Veränderung im Rumpf, die die Bedingung irgendwann falsch macht (
zaehler = zaehler + 1;)
Endlosschleifen
Was passiert, wenn du im Programm oben die Zeile zaehler = zaehler + 1; löschst?
Sage es voraus, probiere es dann aus – und halte das Programm mit dem Stopp-Knopf in der Werkzeugleiste wieder an.
Auflösung
zaehler bleibt für immer 1, die Bedingung zaehler <= 5 bleibt für immer wahr: eine Endlosschleife. Das Programm läuft, bis du es abbrichst.
Endlosschleifen sind kein exotischer Sonderfall. Sie sind der häufigste Schleifenfehler überhaupt. Wenn dein Programm nicht mehr reagiert, ist fast immer die Veränderung im Rumpf vergessen worden oder sie zielt in die falsche Richtung.
Erst denken, dann Rechner
Sage für jedes der drei Programme voraus, was ausgegeben wird. Notiere deine Vorhersage. Führe sie erst danach aus.
Bei einem der drei musst du aufpassen.
Auflösung
--- A ---
0
1
2
--- B ---
10
8
--- C ---
1
3
9
27
81
Bei A ist die Falle die Startbelegung: Die Schleife beginnt bei 0 und läuft dreimal, aber die ausgegebenen Zahlen sind 0, 1, 2.
Bei B wird nach der Ausgabe von 8 der Wert 6 erreicht – und 6 ist nicht größer als 6. Deshalb erscheint 6 nicht mehr.
Bei C wächst der Zähler multiplikativ. Nach 81 wäre der nächste Wert 243, damit ist die Bedingung falsch.
Schleifen in der Grafik
Jetzt lösen wir das Münzproblem endgültig.
a) Ändere die Schrittweite von 80 auf 40. Wie viele Münzen liegen jetzt auf der Bühne?
b) Baue das Programm so um, dass die Münzen nicht waagerecht, sondern diagonal von unten links nach oben rechts liegen.
Tipp zu b)
Du brauchst eine zweite Variable für die y-Koordinate, die sich in jedem Durchlauf mitverändert. Oder du berechnest y aus x – bei einer Diagonalen ist das besonders einfach.
Aufgabe 1: Summe und Produkt
Schreibe ein Programm, das eine Zahl n einliest und
a) die Summe aller Zahlen von 1 bis n ausgibt,
b) die Fakultät von n ausgibt, also das Produkt aller Zahlen von 1 bis n.
Entwickle für a) zuerst ein Flussdiagramm auf Papier.
Tipp 1: Der Sammler
Du brauchst eine Variable, in der du das Zwischenergebnis sammelst. Bei der Summe startet sie bei 0, beim Produkt bei 1 – überlege dir, warum.
Tipp 2: Das Muster
int summe = 0;
int i = 1;
while (i <= n) {
summe = summe + i;
i++;
}
Dieses Muster heißt Akkumulator. Es begegnet dir in Kapitel 5 bei den Feldern wieder.
Aufgabe 2: Palindromtest
Jetzt kannst du den Palindromtest aus Kapitel 2 zu Ende bringen.
Schreibe ein Programm, das ein Wort einliest und ausgibt, ob es ein Palindrom ist – ob es sich also vorwärts wie rückwärts liest.
Teste mit otto, rentner, informatik und a.
Tipp 1: Zwei Zeiger
Du brauchst zwei Positionen: eine, die vorne beginnt und nach rechts wandert, und eine, die hinten beginnt und nach links wandert.
Tipp 2: Wann ist es kein Palindrom?
Sobald ein Paar nicht übereinstimmt, steht das Ergebnis fest. Merke dir das in einer boolean-Variablen, die du auf true setzt und nur im Fehlerfall auf false änderst.
Tipp 3: Wann hört die Schleife auf?
Wenn sich die beiden Positionen treffen oder überkreuzen, hast du alle Paare geprüft: while (links < rechts).
Zusatzaufgabe
Schreibe ein Programm, das prüft, ob eine eingelesene Zahl eine Primzahl ist.
Erste Fassung: Probiere alle Teiler von 2 bis n - 1 durch.
Zweite Fassung: Überlege, ab welchem Wert du aufhören kannst zu suchen. Wie viele Durchläufe sparst du damit bei n = 1000?
Diese Frage – wie viele Schritte braucht ein Verfahren? – nehmen wir in Kapitel 7 systematisch auf.