Személyes eszközök
Keresés

 

A InfoWiki wikiből

Egymásba ágyazott if-ek

Nincs annak sem akadálya, hogy egy if belsejébe (akkor vagy különben ágba) egy másik if-t helyezzünk. Erre gyakran van szükség, ha nem két, hanem három, vagy több lehetőség is előadódhat:

Console.WriteLine("Kérek egy számot");
 int a = int.Parse(Console.ReadLine());
 if (a<0)
 {
    Console.WriteLine("A szám negatív");
 }
 else 
 {
   if (a==0) Console.WriteLine("A szám nulla.");
   else Console.WriteLine("A szám biztosan pozitív.");
 }

vegyük észre, hogy egy if utasítás (a vele párban álló else utasítással, és az általuk kezelt védett utasításblokkokkal együtt) egyetlen egységnek, egyetlen utasításnak számít. Ezért az előző példában a beágyazott if-t nem kellett volna blokkokba zárni:

Console.WriteLine("Kérek egy számot");
 int a = int.Parse(Console.ReadLine());
 if (a<0)
 {
    Console.WriteLine("A szám negatív");
 }
 else 
   if (a==0) Console.WriteLine("A szám nulla.");
   else Console.WriteLine("A szám biztosan pozitív.");

Vagy, más tördelésben:

Console.WriteLine("Kérek egy számot");
 int a = int.Parse(Console.ReadLine());
 if (a<0) Console.WriteLine("A szám negatív");
 else if (a==0) Console.WriteLine("A szám nulla.");
 else Console.WriteLine("A szám biztosan pozitív.");

Ezzel egyszerűen kezelhető a sok elágazási ág problémája is:

Console.WriteLine("Írd be az érdemjegyed:");
 int a = int.Parse(Console.ReadLine());
 if (a==1) Console.WriteLine("elégtelen");
 else if (a==2) Console.WriteLine("elégséges");
 else if (a==3) Console.WriteLine("közepes");
 else if (a==4) Console.WriteLine("jó");
 else if (a==5) Console.WriteLine("jeles");
 else Console.WriteLine("nana, viccelsz, ugye?!");

Ez a tördelés helyes, de lényegében sok szinten egymásba ágyazott if-eket rejt:

Console.WriteLine("Írd be az érdemjegyed:");
 int a = int.Parse(Console.ReadLine());
 if (a==1) Console.WriteLine("elégtelen");
 else 
 {
   if (a==2) Console.WriteLine("elégséges");
   else 
     {
       if (a==3) Console.WriteLine("közepes");
       else 
       {
          if (a==4) Console.WriteLine("jó");
          else 
          {
             if (a==5) Console.WriteLine("jeles");
             else Console.WriteLine("nana, viccelsz, ugye?!");
          }
       }
     }
 }


Csellengő else probléma

Gyakori eset, amikor két if követi egymást, pl az alábbi módon:

Console.WriteLine("Írj be egy számot:");
 int a = int.Parse(Console.ReadLine());
 if (a>=0)
    if (a%2==0) Console.WriteLine("ez páros szám");
 else Console.WriteLine("ez negatív szám");

A fenti esetben felmerül egy probléma, amelyet csellengő else problémának szoktunk nevezni. A kérdés ugyanis az, hogy a fenti esetben az else ág melyik if-hez tartozik!? Ugyanis a tördelés (és az konzol kiírás) azt sugallja, hogy ez az első if-hez tartozik, amely azt vizsgálja, hogy a szám kisebb-e mint nulla (negatív-e). De nem!

A csellengő else problémában szereplő esetekben az else mindíg a hozzá közelebb álló if-hez tartozik. A fenti kód a valódi működésének, értelmezésének megfelelő tördelésben a következőképpen fest:

Console.WriteLine("Írj be egy számot:");
 int a = int.Parse(Console.ReadLine());
 if (a>=0)
 {
    if (a%2==0) Console.WriteLine("ez páros szám");
    else Console.WriteLine("ez negatív szám");
 }

Amennyiben a korábbi működést szeretnénk elérni, úgy a következőképpen kell eljárni:

Console.WriteLine("Írj be egy számot:");
 int a = int.Parse(Console.ReadLine());
 if (a>=0)
 {
    if (a%2==0) Console.WriteLine("ez páros szám");
 }
 else Console.WriteLine("ez negatív szám");

Vegyük észre, hogy pozitív páratlan esetben (pl +3) a fenti program nem ír semmit ki a képernyőre. Persze helyesebb lenne ezt a következőképpen írni:

Console.WriteLine("Írj be egy számot:");
 int a = int.Parse(Console.ReadLine());
 if (a>=0)
 {
    if (a%2==0) Console.WriteLine("ez páros szám");
    else Console.WriteLine("ez páratlan");
 }
 else Console.WriteLine("ez negatív szám");


Hernyák Zoltán
A lap eredeti címe: „http://wiki.ektf.hu/wiki/Mp1/page240
Nézetek
nincs sb_54.146.154.243 cikk