Computer sind gut darin, dasselbe sehr oft zu tun, ohne sich zu langweilen. Statt eine Anweisung hundertmal hinzuschreiben, schreiben Sie eine Schleife: einen Block, der wiederholt wird, bis eine Bedingung nicht mehr gilt.

while: solange etwas gilt

C#
// countdown.cs
int zahl = 5;
while (zahl > 0)
{
    Console.WriteLine(zahl);
    zahl = zahl - 1;
}
Console.WriteLine("Start!");
5
4
3
2
1
Start!

Vor jedem Durchlauf prüft while die Bedingung. Ist sie wahr, läuft der Block, danach wird wieder geprüft. Ist sie falsch, geht es hinter dem Block weiter. Im Block wird zahl jedes Mal um eins kleiner, bis die Bedingung zahl > 0 nicht mehr gilt.

Für „um eins kleiner“ und ähnliche Rechnungen gibt es Kurzformen, die Sie oft sehen werden:

Kurzform ausgeschrieben
zahl--; zahl = zahl - 1;
zahl++; zahl = zahl + 1;
summe += 5; summe = summe + 5;

Wenn eine Schleife nicht aufhört

Löschen Sie in countdown.cs testweise die Zeile zahl = zahl - 1; und starten Sie das Programm. Jetzt bleibt zahl immer 5, die Bedingung immer wahr, und das Programm schreibt endlos 5 untereinander. Das ist eine Endlosschleife. Kein Grund zur Sorge: Drücken Sie im Terminal Strg+C. Das bricht jedes laufende Programm ab, unter Windows, macOS und Linux. Setzen Sie die Zeile danach wieder ein.

Fragen Sie sich bei jeder Schleife: Was im Block sorgt dafür, dass die Bedingung irgendwann falsch wird?

for: zählen

Sehr oft zählt eine Schleife einfach von einer Zahl bis zu einer anderen. Dafür ist for gemacht:

C#
// einmaleins.cs
for (int i = 1; i <= 10; i++)
{
    Console.WriteLine($"{i} x 7 = {i * 7}");
}
1 x 7 = 7
2 x 7 = 14
3 x 7 = 21
4 x 7 = 28
5 x 7 = 35
6 x 7 = 42
7 x 7 = 49
8 x 7 = 56
9 x 7 = 63
10 x 7 = 70

Die Klammer hinter for hat drei Teile, getrennt durch Semikolons:

  1. int i = 1 läuft einmal am Anfang und legt den Zähler an.
  2. i <= 10 wird vor jedem Durchlauf geprüft, wie bei while.
  3. i++ läuft nach jedem Durchlauf und zählt weiter.

Der Name i ist für Zähler üblich. Sie dürfen ihn aber auch reihe oder nummer nennen.

Werte sammeln

Eine Schleife kann Ergebnisse über alle Durchläufe hinweg sammeln. Dafür legen Sie eine Variable vor der Schleife an und ändern sie in jedem Durchlauf:

C#
// summe.cs
int summe = 0;
for (int i = 1; i <= 100; i++)
{
    summe += i;
}
Console.WriteLine($"Die Summe von 1 bis 100 ist {summe}.");
Die Summe von 1 bis 100 ist 5050.

Läge int summe = 0; im Block, finge die Summe bei jedem Durchlauf wieder bei 0 an, und nach dem Block gäbe es sie gar nicht mehr. Der Compiler würde die letzte Zeile ablehnen. Eine Variable gilt nur in dem Block, in dem sie angelegt wurde.

Eingaben, bis jemand aufhört

Oft weiß ein Programm vorher nicht, wie viele Eingaben kommen. Dann läuft eine Schleife „für immer“, also mit while (true), und wird von innen mit break verlassen, sobald eine bestimmte Eingabe kommt, hier eine leere Zeile:

C#
// zahlen-addieren.cs
int summe = 0;
int anzahl = 0;
Console.WriteLine("Geben Sie ganze Zahlen ein. Eine leere Zeile beendet die Eingabe.");
while (true)
{
    Console.Write("Zahl: ");
    string eingabe = Console.ReadLine() ?? "";
    if (eingabe == "")
    {
        break;
    }

    if (int.TryParse(eingabe, out int zahl))
    {
        summe += zahl;
        anzahl++;
    }
    else
    {
        Console.WriteLine("Das war keine ganze Zahl, ich lasse sie aus.");
    }
}
Console.WriteLine($"{anzahl} Zahlen, Summe {summe}.");
Geben Sie ganze Zahlen ein. Eine leere Zeile beendet die Eingabe.
Zahl: 12
Zahl: 30
Zahl: zwei
Das war keine ganze Zahl, ich lasse sie aus.
Zahl: 8
Zahl:
3 Zahlen, Summe 50.

break beendet die Schleife sofort, das Programm macht hinter ihr weiter. Weil Console.ReadLine() ?? "" am Ende der Eingabe einen leeren Text liefert, endet die Schleife auch dann sauber, wenn gar keine Eingabe mehr kommt.

Übung 1

Schreiben Sie zehn-bis-null.cs. Es soll mit einer for-Schleife die Zahlen 10, 8, 6, 4, 2, 0 ausgeben, jede in einer eigenen Zeile. Tipp: Der dritte Teil der Klammer darf auch anders zählen als i++.

Lösung 1

C#
// zehn-bis-null.cs
for (int i = 10; i >= 0; i -= 2)
{
    Console.WriteLine(i);
}
10
8
6
4
2
0

Der Zähler beginnt bei 10, wird nach jedem Durchlauf um 2 kleiner (i -= 2), und die Schleife läuft, solange er mindestens 0 ist. Hätten Sie i > 0 geschrieben, fehlte die 0 am Ende. Auch hier lohnt der Blick auf die Grenze.

Übung 2

Schreiben Sie das Spiel zahlenraten.cs. Das Programm kennt eine geheime Zahl zwischen 1 und 100, für den Anfang die 42. Sie raten. Nach jedem Versuch sagt das Programm „zu klein“, „zu groß“ oder „richtig“. Am Ende nennt es die Zahl Ihrer Versuche. Eine leere Eingabe beendet das Spiel vorzeitig. Eine Eingabe, die keine Zahl ist, zählt nicht als Versuch.

Lösung 2

C#
// zahlenraten.cs
int geheim = 42;
int versuche = 0;
Console.WriteLine("Ich denke mir eine Zahl zwischen 1 und 100.");
while (true)
{
    Console.Write("Ihr Tipp: ");
    string eingabe = Console.ReadLine() ?? "";
    if (eingabe == "")
    {
        Console.WriteLine($"Schade. Die Zahl war {geheim}.");
        break;
    }

    if (!int.TryParse(eingabe, out int tipp))
    {
        Console.WriteLine("Bitte eine ganze Zahl.");
        continue;
    }

    versuche++;
    if (tipp < geheim)
    {
        Console.WriteLine("Zu klein.");
    }
    else if (tipp > geheim)
    {
        Console.WriteLine("Zu groß.");
    }
    else
    {
        Console.WriteLine($"Richtig! Anzahl Ihrer Versuche: {versuche}");
        break;
    }
}
Ich denke mir eine Zahl zwischen 1 und 100.
Ihr Tipp: 50
Zu groß.
Ihr Tipp: 25
Zu klein.
Ihr Tipp: 37
Zu klein.
Ihr Tipp: 43
Zu groß.
Ihr Tipp: 42
Richtig! Anzahl Ihrer Versuche: 5

Neu ist hier continue: Es springt sofort zum nächsten Durchlauf, ohne den Rest des Blocks auszuführen. So zählt eine falsche Eingabe nicht als Versuch.

Mit einer festen 42 ist das Spiel nur einmal spannend. Ersetzen Sie die Zeile int geheim = 42; durch int geheim = Random.Shared.Next(1, 101);. Dann denkt sich das Programm bei jedem Start eine neue Zahl von 1 bis 100 aus. Die obere Grenze 101 zählt dabei nicht mehr mit.

Wer klug rät, halbiert den Bereich mit jedem Tipp, wie im Beispiel oben. Damit genügen nie mehr als sieben Versuche.

Übung 3

Schreiben Sie treppe.cs, das diese Treppe aus Sternen ausgibt:

*
**
***
****
*****

Tipp: Sie brauchen zwei Schleifen, eine für die Zeilen und darin eine für die Sterne einer Zeile. Console.Write("*") schreibt einen Stern, ohne die Zeile zu beenden.

Lösung 3

C#
// treppe.cs
for (int zeile = 1; zeile <= 5; zeile++)
{
    for (int stern = 1; stern <= zeile; stern++)
    {
        Console.Write("*");
    }
    Console.WriteLine();
}

Die äußere Schleife zählt die Zeilen. Die innere schreibt in jeder Zeile so viele Sterne, wie die Zeile Nummer hat: In Zeile 1 einen, in Zeile 5 fünf. Danach beendet Console.WriteLine() die Zeile. Ändern Sie die 5 in eine 10 und sehen Sie zu, wie die Treppe wächst.

Was Sie jetzt können

  • Sie wiederholen Anweisungen mit while, solange eine Bedingung gilt.
  • Sie zählen mit for und wählen Anfang, Ende und Schrittweite selbst.
  • Sie verlassen eine Schleife mit break, überspringen einen Durchlauf mit continue und beenden ein hängendes Programm mit Strg+C.
  • Sie sammeln Werte in einer Variablen, die vor der Schleife angelegt ist.
  • Sie schachteln Schleifen ineinander.

Weiterlesen