fel
le

Többirányú elágazás

Az if elágazás esetén a kulcs szerepkört egy logikai kifejezés tölti be. A logikai kifejezés két lehetséges értékkel bírhat - igaz vagy hamis. Ennek segítségével két elágazási irányban folytatódhat tovább a program végrehajtása.

Érdekes, de a két elágazási irány a programok tervezése során sokkal gyakrabban elegendő, mint első pillantásra látszik. A három irányú elágazást leggyakrabban például két darab összekapcsolt kétirányú elágazással oldjuk meg:

if (a==0)
{
 // az 'a' változó értéke 0
}
else if (a>0)
{
 // az 'a' változó értéke pozitív
}
else
{
 // az 'a' változó értéke negatív
}
 

Hasonlóan megoldható tetszőleges elágazási mennyiség kezelése is. Tegyük fel, hogy a történelem érdemjegyünknek megfelelően szeretnénk 5 elágazási ágat létrehozni. Két megoldás is lehetséges:

if (jegy==1) ... ;   // az 'erdemjegy' változó értéke 1
if (jegy==2) ... ;   // az 'erdemjegy' változó értéke 2
if (jegy==3) ... ;   // az 'erdemjegy' változó értéke 3
if (jegy==4) ... ;   // az 'erdemjegy' változó értéke 4
if (jegy==5) ... ;   // az 'erdemjegy' változó értéke 5
 

A második megoldás hatékonyabb:

if (jegy==1) ... ;        // az 'erdemjegy' változó értéke 1
else if (jegy==2) ... ;   // az 'erdemjegy' változó értéke 2
else if (jegy==3) ... ;   // az 'erdemjegy' változó értéke 3
else if (jegy==4) ... ;   // az 'erdemjegy' változó értéke 4
else if (jegy==5) ... ;   // az 'erdemjegy' változó értéke 5
 

A hatékonyság az else-k használatával érhető el. Az első változatban bármennyi is az a változó értéke - minden esetben mind az öt if feltétel kiértékelődik. Ez nyilván időbe kerül, processzoridőbe. A futtató rendszer ugyanis nem képes optimalizálni, nem képes detektálni, hogy az öt elágazási lehetőség egymást kizárja. Számára minden if feltétel külön-külön kiértékelendő.

A második megoldásnál minden maradék ág else ág, tehát ha valamelyik feltétel teljesül, a többi feltétel már nem értékelődik ki. A fenti második megoldás ezen szempontból jobban hangsúlyos változata az alábbi:

if (jegy==1) ... ;        // az 'erdemjegy' változó értéke 1
else
{
        if (jegy==2) ... ;   // az 'erdemjegy' változó értéke 2
        else
        {
           if (jegy==3) ... ;   // az 'erdemjegy' változó értéke 3
           else
           {
             if (jegy==4) ... ;   // az 'erdemjegy' változó értéke 4
             else
             {
                if (jegy==5) ... ;   // az 'erdemjegy' változó értéke 5
             }
           }
        }
}
 

A megoldás

Ugyanakkor a több irányú elágazás megoldására saját nyelvi konstrukció van - switch a neve. Ez angolul kapcsolót jelent, mely több irányba is elfordítható. A szintaktikára egy példa:

switch(jegy)
 {
    case 1:
        // az érdemjegy értéke 1
        // ide jönnek az utasítások
        // akármennyi
        // egészen a break-ig
        Console.WriteLine("ez biza egyes");
        Console.WriteLine("megbuktál");
        break;
    case 2:
        // az érdemjegy értéke 2
        Console.WriteLine("sikeres");
        Console.WriteLine("de gyengécske");
        break;
    case 3:
        // az érdemjegy értéke 3
        break;
    case 4:
        // az érdemjegy értéke 4
        break;
    case 5:
        // az érdemjegy értéke 5
        break;
 }
 

A switch után zárójelben meg kell adni az elágazás alapját jelentő kifejezést (mely legegyszerűbb esetben egyetlen változó). A kifejezés (vagy változó) típusa egész szám (int) vagy szöveg (string) kell legyen!

1. ábra: A switch utasítás felépítése

A switch saját blokkal rendelkezik, melynek kezdetét és végét a szokásos kapcsos zárójelpár jelzi. Ezen blokk összességében több programutasítást is tartalmaz, mely utasítássorozatba belépési pontokat definiálhatunk a case segítségével. A case angol szó, magyar jelentése eset.

2. ábra: A switch utasítássorozata és a belépési pontok

Az esetek az utasítássorozat belépési pontjai, tehát nem önálló programblokkok. Ezért is nem tartozik hozzájuk önálló kapcsos zárójeles blokk. Amennyiben mégis azt szeretnénk, hogy valamely esethez tartozó utasítássorozat végrehajtása után már egyéb switch belsejében szereplő utasítás ne hajtódjon végre, úgy ezt kérhetjük a break segítségével. A break hatására a switch hátralévő utasításai nem hajtódnak végre, hanem ugrunk a switch mögötti (rákövetkező) utasításra.

3. ábra: A switch utasítássorozata és a break

Amennyiben valamely belépési ponthoz tartozó utasítássorozatot nem zárunk le break segítségével, úgy a kilépési utasítás hiányában a vezérlés folytatódhat a következő belépési ponthoz tartozó utasítások végrehajtásával. Ez lehet szándékos, amennyiben eseteket kívánunk összevonni:

switch(jegy)
 {
    case 1:
        Console.WriteLine("ez biza egyes");
        Console.WriteLine("megbuktál");
        break;
    case 2:
        Console.WriteLine("Elégséges");
    case 3:
        Console.WriteLine("Elégséges vagy közepes");
    case 4:
        Console.WriteLine("Elégséges,közepes vagy jó");
    case 5:
        Console.WriteLine("Nem buktál meg. Grat!");
        break;
 }
 

Lezárás

Mivel az esetek összevonása elég ritka, a break hiánya leggyakrabban hibás működés jele. Ugyanakkor jegyezzük meg, hogy nem csak a break alkalmas erre a célra. Az alábbi utasítások mindegyike megfelelő lehet:

  • break,
  • continue,
  • return,
  • throw.

Hernyák Zoltán
2013-01-24 10:44:50