Zählschleifen
Bei fast allen while-Schleifen der letzten Lektion sah es gleich aus: eine Zählvariable vorher setzen, im Kopf vergleichen, im Rumpf erhöhen. Weil dieses Muster so häufig ist, gibt es dafür eine eigene Schreibweise – die Zählschleife oder for-Schleife.
Dasselbe in kurz
for (Initialisierung; Bedingung; Veränderung) {
// Schleifenrumpf
}
Die drei Bestandteile jeder Schleife stehen jetzt alle im Kopf, getrennt durch Semikolons:
| Teil | im Beispiel | wann ausgeführt |
|---|---|---|
| Initialisierung | int j = 1 |
genau einmal, vor dem ersten Durchlauf |
| Bedingung | j <= 5 |
vor jedem Durchlauf |
| Veränderung | j++ |
nach jedem Durchlauf |
Die Zählvariable wird meistens direkt im Kopf deklariert. Dann existiert sie nur innerhalb der Schleife.
Wann for, wann while?
Faustregel:
- Weißt du vorher, wie oft wiederholt wird? →
for - Hängt das Ende von etwas ab, das sich erst während der Schleife herausstellt? →
while
Beide Schleifenarten können dasselbe. Die Wahl macht nur deinen Code lesbarer – aber das ist wichtig genug.
Entscheide für jede Situation, welche Schleifenart besser passt, und begründe kurz.
a) Alle Zahlen von 1 bis 100 ausgeben
b) So lange nach einem Passwort fragen, bis es stimmt
c) Die Buchstaben eines Wortes einzeln ausgeben
d) So lange verdoppeln, bis der Wert über eine Million steigt
Auflösung
a) for – die Anzahl steht fest.
b) while – wie oft gefragt wird, weiß man vorher nicht.
c) for – die Anzahl ergibt sich aus wort.length() und steht damit vor Beginn fest.
d) while – die Anzahl der Verdopplungen hängt vom Startwert ab und ist vorher nicht bekannt. (Man kann es mit for schreiben, aber es liest sich schlechter.)
Rückwärts und in Schritten
Sage voraus, was dieses Programm ausgibt. Achte genau auf den Kopf der Schleife.
Auflösung
3
6
9
Die Schleife läuft zehnmal, aber die Verzweigung im Rumpf lässt nur die durch 3 teilbaren Zahlen durch.
Über eine Zeichenkette laufen
Merke dir diesen Kopf – du wirst ihn hunderte Male schreiben:
for (int i = 0; i < wort.length(); i++)
Er beginnt bei 0 und läuft mit < bis kleiner als die Länge. Beides zusammen trifft genau die gültigen Positionen 0 bis length() - 1.
Schreibst du versehentlich <=, greifst du eine Stelle hinter das Ende – ein Laufzeitfehler. Dieser Fehler ist so verbreitet, dass er einen Namen hat: Zaunpfahlfehler (englisch off-by-one).
Aufgabe 1: Vokale zählen
Schreibe ein Programm, das ein Wort einliest und zählt, wie viele Vokale (a, e, i, o, u) darin vorkommen.
Erweiterung: Zähle auch, wie viele Konsonanten es sind.
Tipp 1: Ein Zeichen prüfen
Hol dir mit wort.charAt(i) das Zeichen an Position i und vergleiche es mit 'a', 'e', … – jeweils in einfachen Anführungszeichen, weil es ein char ist.
Tipp 2: Fünf Möglichkeiten in einer Bedingung
char z = wort.charAt(i);
if (z == 'a' || z == 'e' || z == 'i' || z == 'o' || z == 'u') {
Tipp 3: Groß- und Kleinschreibung
Wenn jemand „Informatik“ mit großem I eingibt, findet dein Test das große I nicht. Am einfachsten wandelst du das ganze Wort vorher um: wort = wort.toLowerCase();
Aufgabe 2: Treppe zeichnen
Zeichne mit dem Stift eine Treppe aus sechs Stufen.
a) Entwickle zuerst ein Flussdiagramm auf Papier.
b) Setze es mit einer Zählschleife um.
Tipp 1: Was ist eine Stufe?
Eine Stufe besteht aus zwei Strecken: einmal nach oben und einmal nach rechts. Danach steht der Stift an der nächsten Stufe.
Tipp 2: Der Rumpf
for (int i = 0; i < 6; i++) {
y = y + 40;
stift.setPosition(x, y);
x = x + 40;
stift.setPosition(x, y);
}
Aufgabe 3: Vieleck
Zeichne ein regelmäßiges Vieleck mit dem Stift. Die Eckenzahl soll in einer Variablen stehen, damit du zwischen Dreieck, Fünfeck und Zwölfeck wechseln kannst.
Du brauchst dafür etwas Trigonometrie: Die Ecken eines regelmäßigen n-Ecks mit Radius r um den Mittelpunkt liegen bei
für .
Tipp: Die Winkelfunktionen in Java
Math.cos(...) und Math.sin(...) erwarten den Winkel im Bogenmaß, nicht in Grad. Die Formel oben liefert genau das schon richtig.
Für die Positionen brauchst du int-Werte, also musst du das Ergebnis umwandeln – zum Beispiel mit (int) Math.round(...).