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 vetví 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:

Klikni pre editáciu
  • if (15 > 5)
        Console.WriteLine("True");
    Console.WriteLine("The program continues here...");
    Console.ReadKey();
    
    • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

    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 True. V oboch prípadoch program pokračuje ďalej. Súčasťou výrazu samozrejme môže byť aj premenná:

    Klikni pre editáciu
    • 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();
      
      • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

      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:

      Klikni pre editáciu
      • 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();
        
        • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

        Výstup programu:

        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. Metóda 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:

        Klikni pre editáciu
        • 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);
          }
          if (a <= 0)
              Console.WriteLine("I can't calculate the square root of a negative number!");
          Console.WriteLine("Thanks for the input");
          Console.ReadKey();
          
          • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

          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á:

          Klikni pre editáciu
          • 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);
            }
            else
                Console.WriteLine("I can't calculate the square root of a negative number!");
            Console.WriteLine("Thanks for the input");
            Console.ReadKey();
            
            • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

            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:

            Klikni pre editáciu
            • 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();
              
              • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

              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:

              Klikni pre editáciu
              • 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();
                
                • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                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:

                Klikni pre editáciu
                • 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();
                  
                  • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

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

                  Klikni pre editáciu
                  • 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();
                    
                    • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                    Konštrukcia 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:

                    Klikni pre editáciu
                    • 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();
                      
                      • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                      Výstup programu:

                      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:

                      Klikni pre editáciu
                      • 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();
                        
                        • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                        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).

                        Konštrukcia 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.)

                        Na slovenskej klávesnici píšeme podčiarknutie _ pomocou Shift a nasledujúce klávesy:

                        Podčiarknutie - Základná konštrukcia jazyka C# .NET

                        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é 8x (99.39 kB)
                        Aplikácia je vrátane zdrojových kódov v jazyku C#

                         

                        Ako sa ti páči článok?
                        Pred uložením hodnotenia, popíš prosím autorovi, čo je zleZnakov 0 z 50-500
                        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:
                        22 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