A szelekciónak több ága is lehet. Ilyenkor a feltételek közül legfeljebb egy teljesülhet, vagyis ha az egyik feltétel teljesül, akkor a többit már nem kell vizsgálni sem. A többágú szelekció folyamatábrája:
Egymásba ágyazott if utasítások sorozatával tudjuk megvalósítani a fenti szerkezetet. Ha az első feltétel nem teljesül, akkor a második feltétel kiérétkelése következik. És így tovább. A végrehajtás legfeljebb egy igaz ágon fog futni. Az ábra szerint az Utasítás-4 akkor kerül végrehajtásra, ha egyik feltétel sem teljesült.
Az utolsó else ág elhagyható. Hogyan valósítjuk ezt meg C#-ban? Ehhez nézzünk egy egyszerű, klasszikus példát.
Feladat:
Olvassunk be egy nemnegatív egész számot, valakinek az életkorát, és kortól függően írjuk ki a megfelelő szöveget:
0 - 13 évig: gyerek
14 – 17 évig: fiatalkorú
18 – 23 évig: ifjú
24 – 59 évig: felnőtt
60 - : idős
Megoldás:
static void Main(string[] args)
{
int kor;
kor = Int32.Parse(Console.ReadLine());
if (kor < 14) Console.WriteLine("Gyerek");
else
if (kor < 18) Console.WriteLine("Fiatalkorú");
else
if (kor < 24) Console.WriteLine("Ifjú");
else
if (kor < 60) Console.WriteLine("Felnőtt");
else Console.WriteLine("Idős");
Console.ReadLine();
}
A többágú szelekció másik megoldása a switch utasítás.
switch (kifejezés)
{
case konstans1 kifejezés:
utasítás1
ugrás
case konstans2 kifejezés:
utasítás2
ugrás
case konstansn kifejezés:
utasításn
ugrás
[default:
utasítás
ugrás]
}
Kifejezés: egész típusú, vagy string kifejezés.
Ugrás: Kilép avezérlés a case szerkezetből. Ha elhagyjuk, akkor a belépési ponttól számítva a további case-eket is feldolgozza.
Default: Ha egyetlen case feltétel sem teljesül, akkor a default ág kerül végrehajtásra.
Egy egyszerű felhasználás:
static void Main(string[] args)
{
int k;
Console.Write("Kérem válasszon (1/2/3)");
k = Int32.Parse(Console.ReadLine());
switch (k)
{
case 1:
Console.WriteLine("1-et választotta");
break;
case 2:
Console.WriteLine("2-őt választotta");
break;
case 3:
Console.WriteLine("3-at választotta");
break;
default:
Console.WriteLine("nem választott megfelelő számot.");
break;
}
Console.ReadLine();
}
Ugyanez feladat megoldható konvertálás nélkül, stringek felhasználásával is:
static void Main(string[] args)
{
string k;
Console.Write("Kérem válasszon (1/2/3)");
k = Console.ReadLine();
switch (k)
{
case "1":
Console.WriteLine("1-et választotta");
break;
case "2":
Console.WriteLine("2-őt választotta");
break;
case "3":
Console.WriteLine("3-at választotta");
break;
default:
Console.WriteLine("nem választott megfelelő számot.");
break;
}
Console.ReadLine();
}
Feladat:
Olvassunk be egy hónap és egy nap sorszámát! Írjuk ki ha a beolvasott számok nem jó intervallumba esnek. A február legyen 28 napos.
Megoldás:
static void Main(string[] args)
{
int ho, nap;
Console.Write("Kérem a hónapot:");
ho = int.Parse(Console.ReadLine());
Console.Write("Kérem a napot:");
nap = int.Parse(Console.ReadLine());
if ((ho == 1 || ho == 3 || ho == 5 || ho == 7 || ho == 8 || ho == 10 || ho == 12)
&& (nap > 31 || nap < 1))
Console.WriteLine("A nap legfeljebb 31 lehet");
else
if ((ho == 4 || ho == 6 || ho == 9 || ho == 11) && (nap > 30 || nap < 1))
Console.WriteLine("A nap legfeljebb 30 lehet");
else
if ((ho == 2) && (nap > 28 || nap < 1))
Console.WriteLine("A nap legfeljebb 28 lehet");
else
if (ho < 1 || ho > 12) Console.WriteLine("A hónap csak 1 és 12 között lehet.");
else
Console.WriteLine("Rendben");
Console.ReadLine();
}
Nézzük a lehetséges futási eredményeket. Első, amikor minden rendben, második, amikor a hónap megfelelő, de a nap nem helyes, és a harmadik lehetőség amikor a hónap száma nem jó.
Első eset, amikor minden rendben
Második eset, amikor a nap 45, ez nem lehet!
Harmadik eset, amikor a hónap nem lehet 45.