Naredba višestrukog grananja

            Višestruko grananje je slučaj kada se bira izvršenje jedne od više mogućih naredbi (skupa naredbi – bloka) zavisno od ispunjenosti uslova.

            Višestruko grananje se može realizovati višestrukom primenom if naredbi kao što je prikazano na sledećem primeru:

            Primer: Napisati program koji određuje najveći od uneta tri broja x, y, z ne koristeći pomoćnu promenljivu.

static void Main(string[] args)

        {

            double x, z, y;

            Console.WriteLine("Unesi tri broja");

            x = double.Parse(Console.ReadLine());

            y = double.Parse(Console.ReadLine());

            z = double.Parse(Console.ReadLine());

            if (x > y)

            {

                if (x > z)

                {

                    Console.WriteLine("Najveci je: " + x);

                }

                else

                {

                    Console.WriteLine("Najveci je: " + z);

                }

            }

            else

            {

                if (y > z)

                {

                    Console.WriteLine("Najveci je: " + y);

                }

                else

                {

                    Console.WriteLine("Najveci je: " + z);

                }

            }

            Console.ReadKey();

         }

            Postoje situacije gde su višestruka grananja takva da se izbor jedne od više mogućih alternativa vrši na osnovu neke vrednosti (vrednosti promenljive ili izraza). Tu promenljivu smo ranije kada smo radili algoritme nazivali selektorska promenljiva.

Primer: Napisati program koji na osnovu unete vrednosti od 1 do 12 ispisuje naziv meseca u godini (npr. Januar, februar….)

            Ovaj problem je moguće rešiti višestrukom primenom if naredbi ali je mnogo elegantnije rešenje primenom switch naredbe čiji je opšti oblik sledeći:

switch ( izraz )

{

case vrednost1: B1; break;

case vrednost2: B2; break;

...

case vrednostN: BN; break;

default: B; break;

}

B1, B2,…, BN i B su jednostavne naredbe ili neke upravljačke strukture ili blokovi. Grafički prikaz switch naredbe je dat na sledećoj slici:

Zavisno od vrednosti izraza odnosno promenljive (vrednost1, … , vrednostN) izvršiće se neki od blokova Bi. Ako izraz ne uzima ni jednu od vrednosti vrednost1, … , vrednostN onda će se izvršiti blok B.

            U slučajevima kada ne treba izvršiti ni jednu naredbu ako izraz ne uzima ni jednu od vrednosti iz skupa vrednosti vrednost1 do vrednostN, tada se koristi switch naredba bez default.

switch ( izraz )

{

case vrednost1: B1; break;

case vrednost2: B2; break;

...

case vrednostN: BN; break;

}

Hajde da uradimo gore navedeni primer koji na osnovu unetog rednog broja meseca ispisuje naziv tog meseca.

            int i;

            Console.WriteLine("Unesi redni broj meseca");

            i = int.Parse(Console.ReadLine());

            switch (i)

            {

                case 1: Console.WriteLine("JANUAR"); break;

                case 2: Console.WriteLine("FEBRUAR"); break;

                case 3: Console.WriteLine("MART"); break;

                case 4: Console.WriteLine("APRIL"); break;

                case 5: Console.WriteLine("MAJ"); break;

                case 6: Console.WriteLine("JUN"); break;

                case 7: Console.WriteLine("JUL"); break;

                case 8: Console.WriteLine("AVGUST"); break;

                case 9: Console.WriteLine("SEPTEMBAR"); break;

                case 10: Console.WriteLine("OKTOBAR"); break;

                case 11: Console.WriteLine("NOVEMBAR"); break;

                case 12: Console.WriteLine("DECEMBAR"); break;

                default: Console.WriteLine("Pogresno unet redni broj"); break;

            }

            Console.ReadKey();

            Može se uočiti da broj case linija može biti veoma velik. U nekim slučajevima višestrukog grananja isi blok naredbi se treba izvršiti za više različitih vrednosti selektorske promenljive. U tom slučaju se mogu spajati case linije, što ćemo pokazati na sledećem primeru.

Primer:  Za uneti redni broj meseca ispisati koliko taj mesec ima dana pod pretpostavkom da godina nije prestupna.

 

     int i;

     Console.WriteLine("Unesi redni broj meseca");

     i = int.Parse(Console.ReadLine());

     switch (i)

     {

         case 1: case 3: case 5: case 7: case 8: case 10: case 12:

             Console.WriteLine("Broj dana je 31"); break;

         case 2:

             Console.WriteLine("Broj dana je 28"); break;

         case 4: case 6: case 9: case 11:              

             Console.WriteLine("Broj dana je 30"); break;

         default: Console.WriteLine("Pogresno unet redni broj meseca"); break;      

     }

     Console.ReadKey();