Kapitel: Logik

Wiederholungen

Befehl: while, do-while, for

Im letzten Schritt (Bedingungen) hast du gelernt, wie dein Programm Entscheidungen trifft. Jetzt schauen wir uns den letzten Baustein an: Wie du Code mehrfach ausführen kannst, ohne ihn mehrfach hinzuschreiben.

Die while-Schleife

Eine while-Schleife führt einen Codeblock immer wieder aus, solange eine Bedingung true ist - das ist genau der gleiche Wahrheitswert, den du schon von if kennst.

int zaehler = 1;

while (zaehler <= 5)
{
    Console.WriteLine(zaehler);
    zaehler = zaehler + 1;
}
Die Ausgabe ist: 1, 2, 3, 4, 5 - jede Zahl in einer eigenen Zeile. Die Zeile zaehler = zaehler + 1; ist wichtig: ohne sie würde sich zaehler nie ändern und die Bedingung wäre für immer true - eine Endlosschleife!
Achte bei jeder Schleife darauf, dass sich die Bedingung irgendwann ändert. Sonst läuft dein Programm ewig weiter und hängt sich auf.

Praktisches Beispiel: Solange fragen, bis wir eine Antwort haben

Erinnerst du dich an das "Wie heisst du?"-Beispiel aus Lass mich etwas eingeben? Was passiert eigentlich, wenn jemand einfach nur Enter drückt, ohne einen Namen einzutippen? Mit einer while-Schleife kannst du so lange nachfragen, bis wirklich etwas eingegeben wurde:

string name = "";

while (name == "")
{
    Console.Write("Wie heisst du? ");
    name = Console.ReadLine();
}

Console.WriteLine("Hallo, " + name + "!");
Die Variable name startet als leerer Text (zwei Anführungszeichen ohne Inhalt dazwischen). Dadurch ist die Bedingung name == leerer Text beim ersten Mal true und die Schleife wird mindestens einmal ausgeführt. Sobald eine echte Eingabe kommt, ist name nicht mehr leer, die Bedingung wird false, und die Schleife endet von selbst.

Noch eleganter: do-while

Etwas stört an der Lösung von eben: Wir mussten name vorher extra mit einem leeren Text vorbelegen, nur damit die Bedingung beim ersten Mal überhaupt geprüft werden kann. Dafür gibt es eine zweite Variante der while-Schleife: do-while. Sie dreht die Reihenfolge um und prüft die Bedingung erst nach dem Durchlauf - der Block davor wird also immer mindestens einmal ausgeführt, ganz ohne Vorbelegung:

string name;

do
{
    Console.Write("Wie heisst du? ");
    name = Console.ReadLine();
}
while (name == "");

Console.WriteLine("Hallo, " + name + "!");
Das Ergebnis ist genau das Gleiche wie mit der while-Schleife oben - nur ohne den unschönen Trick mit dem leeren Text als Startwert. Dadurch eignet sich do-while immer dann besonders gut, wenn ein Codeblock sowieso mindestens einmal laufen muss, bevor man überhaupt prüfen kann, ob er wiederholt werden soll - zum Beispiel bei Eingabeabfragen.
Achte auf das Semikolon nach while(...) am Ende! Bei der normalen while-Schleife steht dort keins, bei do-while ist es Pflicht.

Die for-Schleife

Wenn du - wie im Zähler-Beispiel oben - von vornherein weisst, wie oft etwas wiederholt werden soll, ist eine for-Schleife oft die kürzere Schreibweise. Sie fasst drei Dinge in einer Zeile zusammen: Startwert, Bedingung und was nach jedem Durchlauf passieren soll.

for (int zaehler = 1; zaehler <= 5; zaehler++)
{
    Console.WriteLine(zaehler);
}
Das macht genau das Gleiche wie die while-Schleife weiter oben, nur kompakter: int zaehler = 1 (Startwert), zaehler <= 5 (Bedingung) und zaehler++ (nach jedem Durchlauf, kurz für zaehler = zaehler + 1) stehen alle direkt im Schleifenkopf.

Praktisches Beispiel: Das Einmaleins

Für eine Kombination aus Konsoleneingabe und for-Schleife lohnt sich ein kleines Einmaleins - wir fragen nach einer Zahl und geben dann die ersten zehn Vielfachen davon aus:

Console.Write("Für welche Zahl möchtest du das Einmaleins sehen? ");
int zahl = int.Parse(Console.ReadLine());

for (int i = 1; i <= 10; i++)
{
    Console.WriteLine(zahl + " x " + i + " = " + (zahl * i));
}
Bei einer Eingabe von 7 gibt dieses Programm zehn Zeilen aus, von 7 x 1 = 7 bis 7 x 10 = 70.

Kurz zusammengefasst: Mit while wiederholst du einen Codeblock, solange eine Bedingung true ist - besonders praktisch, wenn du vorher nicht weisst, wie oft das sein wird. Mit do-while machst du das Gleiche, prüfst die Bedingung aber erst nach dem ersten Durchlauf - praktisch bei Eingabeabfragen. Mit for hast du eine kompakte Schreibweise, wenn du Startwert, Bedingung und Schrittweite schon kennst. Achte immer darauf, dass die Bedingung irgendwann false wird - sonst entsteht eine Endlosschleife.