Větvení

Řídicí struktury

SSŠVT


Větvení

K čemu se provádění programu "větví"?

Často se v programování dostaneme do situace, kdy potřebujeme, aby se část kódu (některé příkazy) vykonala pouze za určitého stavu (při splnění nějaké podmínky), a za jiného stavu, aby se tato část kódu vynechala, anebo se dokonce provedla jiná jeho část (která se zase neprovede při splnění té podmínky).

K tomu účelu máme řídicí strukturu větvení.

V C# máme dva šikovné příkazy, které realizují větvení.


Příkaz if

Nejběžnější je příkaz if. Syntaxe je:

if (podmínka)
    příkaz-při-splnění
else
    příkaz-při-nesplnění
        

Do podmínky dáme výraz, který se vyhodnotí jako true nebo false a program se dále vykonává tak, že pokud je podmínka splněna (výsledkem je true), provede se příkaz-při-splnění (a neprovede se příkaz-při-nesplnění), zatímco pokud podmínka splněna není (výsledkem je false), provede se příkaz-při-nesplnění (a neprovede se příkaz-při-splnění).

Ať už je podmínka splněna, nebo ne, po provedení výše popsaného se pokračuje následujícím příkazem za touto konstrukcí if-else.

Větev else může chybět, čili příkaz if může vypadat i takto:

if (podmínka)
    příkaz-při-splnění
        

Při nesplnění podmínky se v tomto případě prostě celá větev if přeskočí a pokračuje se příkazem následujícím za touto konstrukcí.

V částech příkaz-při-splnění i příkaz-při-nesplnění může být buď jediný příkaz, anebo více příkazů uzavřených do bloku. Doporučuje se ale kvůli čistotě kódu a vyvarování se chyb při jeho úpravách i jediný příkaz uzavřít do bloku (do složených závorek).

Příklad úplného příkazu if včetně else větve:

if (a == b)
{
    Console.WriteLine($"Čísla {a} a {b} jsou stejná.");
}
else
{
    Console.WriteLine($"Čísla {a} a {b} se liší.");
}
        

Příklad neúplného příkazu if (bez else):

if (DateTime.Now.Month == 6 && DateTime.Now.Day == 2)
{
    Console.WriteLine("Dnes mám narozeniny!");
}
        

Konstrukce if-else se dají řetězit, pokud potřebujeme provádění programu rozvětvit do více než dvou směrů. Např. pokud je hodnota proměnné záporná, provede se něco, pokud je nula, provede se něco jiného, pokud je kladná, provede se ještě úplně něco jiného.

if (result < 0)
{
    // Záporná hodnota.
    StartHeating();
}
else if (result == 0)
{
    // Nula.
    StopHeating();
}
else
{
    // Zde již nezbývá nic jiného, než že hodnota je kladná.
    NotifySecurity();
}
        

Příkaz switch

Další příkaz C#, který se dá použít pro větvení, je switch. Tento příkaz se hodí v situacích, kdy se rozhodujeme podle jednoduché hodnoty (např. podle proměnné typu celé číslo), ale pro každou hodnotu té proměnné se má provést něco jiného. Čili v programu máme mnohocestné větvení, které je s příkazem switch jednodušší a přehlednější než zřetězená sada příkazů if.

Syntaxe příkazu switch vypadá takto:

switch (výraz)
{
    case první-hodnota:
        příkazy-pro-první
        break;

    case druhá-hodnota:
        příkazy-pro-druhou
        break;

    case třetí-hodnota:
        příkazy-pro-třetí
        break;

    // ...

    default:
        příkazy-pro-jiné-hodnoty
        break;
}
        

Příkaz switch ovlivní provádění programu takto:

  1. Nejprve se vyhodnotí výraz v závorkách v hlavičce příkazu switch. Výsledek výrazu musí být hodnota stejného datového typu, jako jsou první-hodnota, druhá-hodnota, třetí-hodnota atd.
  2. Pokud je výsledek výrazu roven první-hodnotě, provedou se příkazy-pro-první.
  3. Pokud je výsledek roven druhé-hodnotě, provedou se příkazy-pro-druhou.
  4. Pokud je výsledek roven třetí-hodnotě, provedou se příkazy-pro-třetí.
  5. A tak dále.
  6. Pokud je uvedena nepovinná část default a výsledek výrazu není roven žádné z předešlých hodnot u klíčových slov case, provedou se příkazy-pro-jiné-hodnoty.

Příkaz switch můžeme použít např. pro mapování sady hodnot na jinou sadu hodnot (např. mapování čísel na barvy) – viz následující code snippet.

ConsoleColor color;
switch (enteredValue)
{
    case 1:
        color = ConsoleColor.Red;
        break;

    case 2:
        color = ConsoleColor.Green;
        break;

    case 3:
        color = ConsoleColor.Blue;
        break;

    default:
        color = ConsoleColor.Black;
        break;
}