Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.
IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

5. diel - Podmienky (vetvenia) v C# .NET

V predchádzajúcom cvičení, Riešené úlohy k 4. lekcii C# .NET, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

Aby sme si niečo naprogramovali, potrebujeme nejako reagovať na rôzne situácie. Môže to byť napríklad hodnota zadaná užívateľom, podľa ktorej budeme chcieť meniť ďalší beh programu. Hovoríme, že sa program konárov a na vetvenie používame podmienky. Tým sa budeme venovať celý dnešný C# tutoriál. Vytvoríme program na výpočet odmocniny a vylepšíme našu kalkulačku.

Podmienky

V C# sa podmienky píšu úplne rovnako ako vo všetkých C-like jazykoch, čo začiatočníkom samozrejme vysvetlíme. Pokročilejšie sa asi budú chvíľku nudiť :)

Podmienky zapisujeme pomocou kľúčového slova if, za ktorým nasleduje logický výraz. Ak je výraz pravdivý, vykoná sa nasledujúci príkaz. Pokiaľ nie, nasledujúci príkaz sa preskočí a pokračuje sa až pod ním.

V nasledujúcej ukážke použijeme znaky väčšie > a menšie <. Ak neviete, kde ich na slovenskej klávesnici nájsť, píšeme ich pomocou Pravého Alt a nasledujúcich klávesov:

Väčšie ako; menšia ako na slovenskej klávesnici - Základná konštrukcia jazyka C# .NET

Vyskúšajme si to:

if (15 > 5)
    Console.WriteLine("True");
Console.WriteLine("The program continues here...");
Console.ReadKey();

Výstup programu:

Konzolová aplikácia
True
The program continues here...

Pokiaľ podmienka platí (čo tu áno), vykoná sa príkaz vypisujúci do konzoly text pravda. V oboch prípadoch program pokračuje ďalej. Súčasťou výrazu samozrejme môže byť aj premenná:

Console.WriteLine("Enter a number");
int a = int.Parse(Console.ReadLine());
if (a > 5)
    Console.WriteLine("The number you entered is greater than 5!");
Console.WriteLine("Thanks for the input!");
Console.ReadKey();

Ukážme si teraz relačné operátory, ktoré môžeme vo výrazoch používať:

Operátor C-like zápis
Rovnosť ==
Je ostro väčšia >
Je ostro menší <
Je väčšia alebo rovná >=
Je menšia alebo rovná <=
Nerovnosť !=
Všeobecná negácia !

Rovnosť zapisujeme dvoma == preto, aby sa to neplietlo s bežným priradením do premennej, ktoré sa robí len jedným =. Pokiaľ chceme nejaký výraz znegovať, napíšeme ho do zátvorky a pred neho výkričník. Keď budeme chcieť vykonať viac ako len jeden príkaz, musíme príkazy vložiť do bloku zo zložených zátvoriek:

Console.WriteLine("Enter some number and I'll calculate a square root:");
int a = int.Parse(Console.ReadLine());
if (a > 0)
{
    Console.WriteLine("The number you entered is greater than 0, so I can calculate it!");
    double root = Math.Sqrt(a);
    Console.WriteLine("The square root of " + a + " is " + root);
}
Console.WriteLine("Thanks for the input");
Console.ReadKey();
Konzolová aplikácia
Enter some number and I'll calculate a square root:
144
The number you entered is greater than 0, so I can calculate it!
The square root of 144 is 12
Thanks for the input

Program načíta od užívateľa číslo, a ak je väčšie ako 0, vypočíta z neho druhú odmocninu. Okrem iného sme použili triedu Math, ktorá na sebe obsahuje množstvo užitočných matematických metód. Na konci tejto kapitoly si ju bližšie predstavíme. Sqrt() vracia druhú odmocninu ako double. Bolo by pekné, keby nám program vyhuboval v prípade, že zadáme záporné číslo. S doterajšími znalosťami by sme napísali niečo ako:

Console.WriteLine("Enter a number and I'll get its square root:");
int a = int.Parse(Console.ReadLine());
if (a > 0)
{
    Console.WriteLine("The number you entered is greater than 0, so I can calculate it!");
    double root = Math.Sqrt(a);
    Console.WriteLine("The square root of " + a + " is " + root);
}
if (a <= 0)
    Console.WriteLine("I can't calculate the square root of a negative number!");
Console.WriteLine("Thanks for the input");
Console.ReadKey();

Všimnime si, že musíme pokryť aj prípad, keď sa a == 0, nielen keď je menší. Kód však môžeme výrazne zjednodušiť pomocou kľúčového slova else, ktoré vykoná nasledujúci príkaz alebo blok príkazov v prípade, že sa podmienka nevykoná:

Console.WriteLine("Enter some number and I'll calculate a square root:");
int a = int.Parse(Console.ReadLine());
if (a > 0)
{
    Console.WriteLine("The number you entered is greater than 0, so I can calculate it!");
    double o = Math.Sqrt(a);
    Console.WriteLine("The square root of " + a + " is " + o);
}
else
    Console.WriteLine("I can't calculate the square root of a negative number!");
Console.WriteLine("Thanks for the input");
Console.ReadKey();

Kód je oveľa prehľadnejší a nemusíme vymýšľať opačnú podmienku, čo by v prípade zloženej podmienky mohlo byť niekedy aj veľmi ťažké. V prípade viacerých príkazov by bol za else opäť blok { }.

Kľúčové slovo else sa tiež využíva v prípade, keď potrebujeme v príkaze manipulovať s premennou z podmienky a nemôžeme sa teda na ňu pýtať potom znova. Program si sám pamätá, že sa podmienka nesplnila, a prejde do vetvy else. Ukážme si to na príklade: Majme číslo a, kde bude hodnota 0 alebo 1 a po nás sa bude chcieť, aby sme hodnotu prehodili (ak tam je 0, dosadíme tam 1, ak 1, dosadíme 0). Naivne by sme mohli kód napísať takto:

int a = 0; // the variable is initialized with a value of 0

if (a == 0) // if the value is 0, we change its value to 1
    a = 1;
if (a == 1) // if the value is 1, we change its value to 0
    a = 0;

Console.WriteLine(a);
Console.ReadKey();

Nefunguje to, že? Poďme si prejsť, čo bude program robiť. Na začiatku máme v a nulu, prvá podmienka sa určite splní a dosadí do a jedničku. No ale razom sa splní aj tá druhá. Čo s tým? Keď podmienky otočíme, budeme mať ten istý problém s jednotkou. Ako z toho von? Áno, použijeme else.

int a = 0; // the variable is initialized with a value of 0

if (a == 0) // if the value is 0, we change its value to 1
    a = 1;
else // if the value is 1, we change its value to 0
    a = 0;

Console.WriteLine(a);
Console.ReadKey();

Podmienky je možné skladať, a to pomocou dvoch základných logických operátorov:

Operátor C-like zápis
A zároveň &&
Alebo ||

Na slovenskej klávesnici ich píšeme pomocou Pravého Alt a klávesov W a C, mnemotechnickú pomôcku si k tomu určite domyslíte :) :

Operátory and a or - Základná konštrukcia jazyka C# .NET

Uveďme si príklad:

Console.WriteLine("Enter a number between 10-20:");
int a = int.Parse(Console.ReadLine());
if ((a >= 10) && (a <= 20))
    Console.WriteLine("The condition has been met.");
else
    Console.WriteLine("You did it wrong.");
Console.ReadKey();

S tým si zatiaľ vystačíme, operátorov je možné samozrejme pomocou zátvoriek kombinovať.

Console.WriteLine("Enter a number between 10-20 or 30-40:");
int a = int.Parse(Console.ReadLine());
if (((a >= 10) && (a <= 20)) || ((a >=30) && (a <= 40)))
    Console.WriteLine("The condition has been met.");
else
    Console.WriteLine("You did it wrong.");
Console.ReadKey();

switch

Konštrukcia switch je prevzatá z jazyka C (ako väčšina gramatiky C#). Umožňuje nám (relatívne) zjednodušiť zápis viacerých podmienok pod sebou. Spomeňme si na našu kalkulačku v prvých lekciách, ktorá načítala 2 čísla a vypočítala všetky 4 operácie. Teraz si ale budeme chcieť zvoliť, ktorú operáciu chceme. Bez konštrukcie switch by sme napísali kód podobný tomuto:

Console.WriteLine("Welcome to our calculator");
Console.WriteLine("Enter the first number:");
double a = double.Parse(Console.ReadLine());
Console.WriteLine("Enter the second number:");
double b = double.Parse(Console.ReadLine());
Console.WriteLine("Choose one of the following operations:");
Console.WriteLine("1 - addition");
Console.WriteLine("2 - subtraction");
Console.WriteLine("3 - multiplication");
Console.WriteLine("4 - division");
int option = int.Parse(Console.ReadLine());
double result = 0;
if (option == 1)
    result = a + b;
else
if (option == 2)
    result = a - b;
else
if (option == 3)
    result = a * b;
else
if (option == 4)
    result = a / b;
if ((option > 0) && (option < 5))
    Console.WriteLine("Result: {0}", result);
else
    Console.WriteLine("Invalid option");
Console.WriteLine("Thank you for using our calculator. Press any key to end the program.");
Console.ReadKey();
Konzolová aplikácia
Welcome to our calculator
Enter the first number:
3,14
Enter the second number:
2,72
Choose one of the following operations:
1 - addition
2 - subtraction
3 - multiplication
4 - division
2
Result: 0,42
Thank you for using our calculator. Press any key to end the program.

Všimnime si, že sme premennú result deklarovali na začiatku, pretože len tak do nej potom môžeme priraďovať. Keby sme ju deklarovali pri každom priradení, C# by kód neskompiloval a vyhodil by chybu redeklarácie premennej. Premenná môže byť deklarovaná (založená v pamäti) vždy len raz. Bohužiaľ C# nie je schopný poznať, či je do premennej result naozaj priradená nejaká hodnota. Ozve sa pri výpise na konzole, kde sa mu nepáči, že môže vypisovať premennú, ktorá nemá priradenú hodnotu. Z tohto dôvodu na začiatku dosadíme do result nulu.

Ďalšia vychytávka je kontrola správnosti voľby. Program by v tomto prípade fungoval rovnako aj bez else, ale načo sa ďalej pýtať, keď už máme výsledok.

Teraz si skúsime napísať ten istý kód pomocou konštrukcie switch:

Console.WriteLine("Welcome to our calculator");
Console.WriteLine("Enter the first number:");
double a = double.Parse(Console.ReadLine());
Console.WriteLine("Enter the second number:");
double b = double.Parse(Console.ReadLine());
Console.WriteLine("Choose one of the following operations:");
Console.WriteLine("1 - addition");
Console.WriteLine("2 - subtraction");
Console.WriteLine("3 - multiplication");
Console.WriteLine("4 - division");
int option = int.Parse(Console.ReadLine());
double result = 0;
switch (option)
{
    case 1:
        result = a + b;
    break;
    case 2:
        result = a - b;
    break;
    case 3:
        result = a * b;
    break;
    case 4:
        result = a / b;
    break;
}
if ((option > 0) && (option < 5))
    Console.WriteLine("Result: {0}", result);
else
    Console.WriteLine("Invalid option");
Console.WriteLine("Thank you for using our calculator. Press any key to end the program");
Console.ReadKey();

Vidíme, že kód je trochu prehľadnejší. Ak by sme potrebovali v nejakej vetve konštrukcie switch spustiť viac príkazov, prekvapivo ich nebudeme písať do {} bloku, ale rovno pod seba. Blok {} nám tu nahrádza príkaz break, ktorý spôsobí vyskočenie z celej konštrukcie switch. switch môže namiesto case x: obsahovať ešte možnosť default:, ktorá sa vykoná v prípade, že nebude platiť žiadny case. Je len na nás, či budeme switch používať, všeobecne sa oplatí len pri väčšom množstve príkazov a vždy ide nahradiť sekvenciou if a else. Nezabúdajme na príkaz break. Samozrejme je možné použiť switch aj pre hodnoty stringovej premennej.

Pretože je posledný kód dlhší, je ho potrebné zľava správne odsadzovať tabulátormi, aby boli ľahko vidieť jednotlivé vetvy kódu. Zo začiatku pre vás môže byť udržiavanie odsadenia problém, preto pre vás máme vychytávku - autoformat. Klávesová skratka Ctrl + E D naformátuje otvorený dokument vo Visual Studiu do dokonalej podoby. K tejto funkcii sa môžete dostať aj cez menu Edit -> Advanced -> Format Document (funkcia Format Selection potom sformátuje len vybranú časť kódu).

Switch na riadku

Autori C# za posledné roky vychrlili množstvo novej syntaxe. Určite sa jej teraz nenechajme zmiasť, ale pre úplnosť si ukážme, ako sa dá zápis konštrukcie switch ešte zjednodušiť.

Osobne by som odporúčal túto syntax skôr nepoužívať, pretože je pomerne neštandardná, ale môžete na ňu naraziť v cudzích zdrojových kódoch.

Predstavme si, že máme program na vyjadrenie teploty slovami a máme rôzne hodnoty a rozsahy, podľa ktorých chceme povedať, ako vonku je. Od C# 9 môžeme takýto switch napísať oveľa úspornejšie:

int temperature = 12;
string temperatureInWords = temperature switch
{
    < -5 => "It's freezing.",
    0 or 100 => "Freezing or Boiling",
    >= -5 and <= 5 => "Cold",
    > 5 and < 15 => "Cool",
    >= 15 and <= 25 => "Warm",
    > 25 => "Hot"
};

Do novej premennej temperatureInWords ukladáme a z temperature čítame. Môžeme využiť porovnávacie znamienka (>, <, <=, >=) a tiež slová and (a zároveň) a or (alebo). Default by sme nahradili nasledovne pomocou podčiarkovníka _:

_ => Console.WriteLine("Invalid value");

(U tohto ukážkového príkladu konštrukcia switch by sa default samozrejme nikdy nespustil.)

V nasledujúcom cvičení, Riešené úlohy k 5. lekcii C# .NET, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 4x (94.96 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
Riešené úlohy k 4. lekcii C# .NET
Všetky články v sekcii
Základná konštrukcia jazyka C# .NET
Preskočiť článok
(neodporúčame)
Riešené úlohy k 5. lekcii C# .NET
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
9 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity