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 |
// 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:
// 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:
// 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.
// 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:
// 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:
// 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
// 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
// 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
// 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 einboolist. - Sie bauen mit
if,else ifundelseProgramme, die verschiedene Wege gehen. - Sie verknüpfen Bedingungen mit
&&,||und!und setzen Klammern, wo es nötig ist. - Sie lesen Zahlen mit
int.TryParseein und reagieren auf falsche Eingaben. - Sie drücken feste Fälle mit einem
switch-Ausdruck aus. - Sie testen an den Grenzen.
Weiterlesen
- Branches and loops: Bedingungen und Schleifen in Microsofts Tutorial-Reihe.
- Add decision logic to your code in C#: ein Modul mit Übungen
zu
if,else ifundelse. - Evaluate Boolean expressions to make decisions in C#: mehr über Bedingungen und ihre Verknüpfung.