Bis jetzt laufen Ihre Programme immer denselben Weg von oben nach unten. Ein Programm wird erst dann nützlich, wenn es auf Werte reagiert: Ist die Eingabe eine Zahl? Ist es draußen kalt? Hat jemand „ja“ getippt? Dafür gibt es Bedingungen und Verzweigungen.

Vergleiche ergeben wahr oder falsch

Ein Vergleich liefert einen Wert vom Typ bool: true (wahr) oder false (falsch).

Zeichen Bedeutung
== ist gleich
!= ist ungleich
< und > ist kleiner als, ist größer als
<= und >= ist kleiner oder gleich, ist größer oder gleich
C#
// vergleiche.cs
int grad = 23;
Console.WriteLine(grad > 20);
Console.WriteLine(grad == 23);
Console.WriteLine(grad != 23);
Console.WriteLine(grad <= 10);
string farbe = "rot";
Console.WriteLine(farbe == "rot");
Console.WriteLine(farbe == "Rot");
True
True
False
False
True
False

Auf dem Bildschirm schreibt C# True und False groß, im Code schreiben Sie true und false klein. Und noch einmal, weil es so oft verwechselt wird: Ein einzelnes = legt einen Wert in eine Variable, das doppelte == vergleicht. Die letzte Zeile zeigt außerdem, dass beim Vergleich von Texten Groß- und Kleinschreibung zählt.

if und else

Mit if führt ein Programm einen Block nur aus, wenn eine Bedingung wahr ist. Der Block mit else läuft, wenn sie falsch ist:

C#
// jacke.cs
Console.Write("Wie viel Grad sind es draußen? ");
int grad = int.Parse(Console.ReadLine() ?? "");
if (grad < 12)
{
    Console.WriteLine("Nehmen Sie eine Jacke mit.");
}
else
{
    Console.WriteLine("Ein Pullover reicht.");
}
Console.WriteLine("Schönen Tag!");
Wie viel Grad sind es draußen? 8
Nehmen Sie eine Jacke mit.
Schönen Tag!

Die Bedingung steht in runden Klammern, die Anweisungen in geschweiften Klammern { }. So eine Klammer mit allem darin heißt Block. Die letzte Zeile steht nach beiden Blöcken und läuft deshalb immer. Die Einrückung um vier Leerzeichen ist für die Menschen, die den Code lesen. Der Compiler braucht sie nicht, aber Sie: Sie zeigt auf einen Blick, was wozu gehört.

Mehr als zwei Wege

Mit else if prüfen Sie nacheinander mehrere Bedingungen. Die erste, die zutrifft, gewinnt. Trifft keine zu, läuft der else-Block:

C#
// ampel.cs
Console.Write("Welche Farbe zeigt die Ampel? ");
string farbe = (Console.ReadLine() ?? "").Trim().ToLower();
if (farbe == "rot")
{
    Console.WriteLine("Stehen bleiben.");
}
else if (farbe == "gelb")
{
    Console.WriteLine("Achtung, gleich wechselt sie.");
}
else if (farbe == "grün")
{
    Console.WriteLine("Sie dürfen gehen.");
}
else
{
    Console.WriteLine($"Die Farbe \"{farbe}\" kenne ich nicht.");
}
Welche Farbe zeigt die Ampel? Gelb
Achtung, gleich wechselt sie.

Die zweite Zeile enthält zwei Helfer für Texte. Trim() entfernt Leerzeichen am Anfang und am Ende, ToLower() macht alle Buchstaben klein. So passt die Eingabe „ Gelb “ trotzdem zu „gelb“. Menschen tippen nicht immer so, wie ein Programm es erwartet. Ein gutes Programm rechnet damit.

Bedingungen verknüpfen

Manchmal hängt eine Entscheidung von mehreren Dingen ab. Dafür gibt es drei Verknüpfungen:

  • && heißt „und“. Das Ganze ist wahr, wenn beide Seiten wahr sind.
  • || heißt „oder“. Das Ganze ist wahr, wenn mindestens eine Seite wahr ist.
  • ! heißt „nicht“. Es macht aus wahr falsch und aus falsch wahr.
C#
// kino.cs
int alter = 14;
bool inBegleitung = true;
bool hatKarte = true;
if (hatKarte && (alter >= 16 || inBegleitung))
{
    Console.WriteLine("Viel Spaß im Film!");
}
else
{
    Console.WriteLine("Leider nicht.");
}
if (!hatKarte)
{
    Console.WriteLine("Die Kasse ist links.");
}
Viel Spaß im Film!

In Worten: Wer eine Karte hat und entweder mindestens 16 ist oder in Begleitung kommt, darf hinein. Die Klammern um den Oder-Teil sind wichtig, denn ohne sie würde C# && zuerst ausrechnen. Setzen Sie im Zweifel lieber eine Klammer zu viel. Ändern Sie die drei Werte oben und sagen Sie vorher, was herauskommt.

Eingaben prüfen mit int.TryParse

In der letzten Lektion ist Ihr Programm abgestürzt, als statt einer Zahl ein Wort kam. int.TryParse versucht die Umwandlung, ohne abzustürzen. Es liefert true, wenn es geklappt hat, und legt die Zahl dann in die Variable hinter out:

C#
// sicher-einlesen.cs
Console.Write("Wie alt sind Sie? ");
string eingabe = Console.ReadLine() ?? "";
if (int.TryParse(eingabe, out int alter))
{
    Console.WriteLine($"Nächstes Jahr sind Sie {alter + 1}.");
}
else
{
    Console.WriteLine($"\"{eingabe}\" ist keine ganze Zahl. Bitte mit Ziffern, zum Beispiel 36.");
}
Wie alt sind Sie? sechsunddreißig
"sechsunddreißig" ist keine ganze Zahl. Bitte mit Ziffern, zum Beispiel 36.

out int alter heißt: „Lege hier eine neue Variable alter an, und TryParse legt das Ergebnis hinein.“ Benutzen Sie alter nur im if-Block, denn nur dort wissen Sie, dass die Umwandlung geklappt hat. Ab jetzt lesen alle Programme in diesem Kurs Zahlen auf diese Weise.

Viele feste Fälle: switch

Wenn ein Wert viele feste Möglichkeiten hat, wird eine lange Kette aus else if unübersichtlich. Für solche Fälle gibt es den switch-Ausdruck:

C#
// wochentag.cs
int tag = 3;
string name = tag switch
{
    1 => "Montag",
    2 => "Dienstag",
    3 => "Mittwoch",
    4 => "Donnerstag",
    5 => "Freitag",
    6 => "Samstag",
    7 => "Sonntag",
    _ => "kein Wochentag",
};
Console.WriteLine($"Tag {tag} ist ein {name}.");
Tag 3 ist ein Mittwoch.

Jede Zeile heißt: „Ist der Wert links, dann ist das Ergebnis rechts.“ Der Unterstrich _ fängt alles ab, was oben nicht steht, wie else. Vergessen Sie ihn, warnt der Compiler, dass nicht alle Fälle abgedeckt sind.

Übung 1

Schreiben Sie gerade.cs. Das Programm fragt nach einer ganzen Zahl und sagt, ob sie gerade oder ungerade ist. Ist die Eingabe keine Zahl, sagt es das freundlich. Tipp: Eine Zahl ist gerade, wenn beim Teilen durch 2 kein Rest bleibt.

Lösung 1

C#
// gerade.cs
Console.Write("Eine ganze Zahl, bitte: ");
string eingabe = Console.ReadLine() ?? "";
if (int.TryParse(eingabe, out int zahl))
{
    if (zahl % 2 == 0)
    {
        Console.WriteLine($"{zahl} ist gerade.");
    }
    else
    {
        Console.WriteLine($"{zahl} ist ungerade.");
    }
}
else
{
    Console.WriteLine("Das war leider keine ganze Zahl.");
}
Eine ganze Zahl, bitte: 17
17 ist ungerade.

Hier steckt ein if in einem anderen. Das ist erlaubt und häufig. Die Einrückung zeigt, dass die Frage nach gerade oder ungerade nur gestellt wird, wenn überhaupt eine Zahl kam. Probieren Sie auch negative Zahlen und die 0.

Übung 2

Schreiben Sie eintritt.cs. Das Programm fragt nach dem Alter und nennt die passende Karte:

  • unter 6 Jahren: „Freier Eintritt“,
  • von 6 bis 17: „Kinderkarte“,
  • ab 65: „Seniorenkarte“,
  • sonst: „Erwachsenenkarte“.

Ein Alter unter 0 oder eine Eingabe, die keine Zahl ist, soll eine Meldung ergeben.

Lösung 2

C#
// eintritt.cs
Console.Write("Wie alt sind Sie? ");
string eingabe = Console.ReadLine() ?? "";
if (!int.TryParse(eingabe, out int alter) || alter < 0)
{
    Console.WriteLine("Bitte ein Alter als ganze Zahl ab 0 eingeben.");
}
else if (alter < 6)
{
    Console.WriteLine("Freier Eintritt");
}
else if (alter <= 17)
{
    Console.WriteLine("Kinderkarte");
}
else if (alter >= 65)
{
    Console.WriteLine("Seniorenkarte");
}
else
{
    Console.WriteLine("Erwachsenenkarte");
}

Die Reihenfolge der Bedingungen zählt. Bei alter <= 17 steht nicht alter >= 6 && alter <= 17, weil die Kette hier nur ankommt, wenn alter < 6 schon falsch war. Die erste Zeile zeigt außerdem, wie ! und || zusammenarbeiten: Die Meldung erscheint, wenn die Umwandlung nicht geklappt hat oder das Alter negativ ist. Weil || von links nach rechts prüft und aufhört, sobald eine Seite wahr ist, wird alter < 0 nur geprüft, wenn wirklich eine Zahl in alter steht.

Testen Sie die Grenzen: 5, 6, 17, 18, 64, 65. An den Grenzen stecken die meisten Fehler.

Übung 3

Schreiben Sie schaltjahr.cs. Es fragt nach einer Jahreszahl und sagt, ob das ein Schaltjahr ist. Die Regel des gregorianischen Kalenders: Ein Jahr ist ein Schaltjahr, wenn es durch 4 teilbar ist, aber nicht durch 100. Durch 400 teilbare Jahre sind trotzdem Schaltjahre. Prüfen Sie Ihr Programm mit 1900 (kein Schaltjahr), 2000 (Schaltjahr), 2024 (Schaltjahr) und 2025 (keines).

Lösung 3

C#
// schaltjahr.cs
Console.Write("Welches Jahr? ");
string eingabe = Console.ReadLine() ?? "";
if (int.TryParse(eingabe, out int jahr))
{
    bool schaltjahr = (jahr % 4 == 0 && jahr % 100 != 0) || jahr % 400 == 0;
    if (schaltjahr)
    {
        Console.WriteLine($"{jahr} ist ein Schaltjahr.");
    }
    else
    {
        Console.WriteLine($"{jahr} ist kein Schaltjahr.");
    }
}
else
{
    Console.WriteLine("Das war keine Jahreszahl.");
}
Welches Jahr? 1900
1900 ist kein Schaltjahr.

Die Bedingung wird hier zuerst in einer bool-Variablen mit sprechendem Namen abgelegt. Das macht das if darunter leicht lesbar und ist ein guter Trick für jede längere Bedingung.

Was Sie jetzt können

  • Sie vergleichen Werte mit ==, !=, <, >, <= und >= und wissen, dass das Ergebnis ein bool ist.
  • Sie bauen mit if, else if und else Programme, die verschiedene Wege gehen.
  • Sie verknüpfen Bedingungen mit &&, || und ! und setzen Klammern, wo es nötig ist.
  • Sie lesen Zahlen mit int.TryParse ein und reagieren auf falsche Eingaben.
  • Sie drücken feste Fälle mit einem switch-Ausdruck aus.
  • Sie testen an den Grenzen.

Weiterlesen