fel
le

Elágazás

A programok végrehajtása utasításról utasításra történik - a szekvencia szabálynak megfelelően. Ettől két módon térhetünk csak el - ebből az egyik az elágazások vezérlési szerkezetek segítségével, a másik a ciklusok vezérlési szerkezetekkel.

Az elágazás vezérlési szerkezetnek a C# nyelven három formája van:

  • egyszerű (egyirányú) feltételes elágazás
  • összetett (kétirányú) feltételes elágazás
  • többirányú feltételes elágazás

Minden elágazási szerkezet közös abban, hogy valamilyen feltétel teljesülése esetén (pl. egy változó adott értéket tartalmaz) végrehajt egy ez esetre tartogatott utasításblokkot, mely egyszerű esetben egyetlen utasítást, gyakrabban azonban több utasítást (utasítássorozat) tartalmaz. A feltétel azt írja le mely esetben kell ezt az utasításblokkot végrehajtani - ily módon védelmezi ezen utasításblokkot.

Ez a védelmezés akkor is fontos lehet, ha az utasításblokk végrehajtása csak adott körülmények között biztonságos. Pl. az utasításblokk egy x változó nézetgyökét számolja ki - mely csak akkor nem vezet hibára, ha az x aktuális értéke nemnegatív. Ezért az utasításblokk végrehajthatóságát ehhez a feltételhez kötjük.

Egyszerű elágazás

Az elágazások legegyszerűbb formáját az if kulcsszóval kell képezni. Az általános alakja:

1. ábra: Egyszerű elágazás általános alakja

Az elágazás létrehozásának kulcsszava if, amely létező angol szó, és magyar jelentése ha. Az if után gömbölyű zárójelek között áll a feltétel, mely logikai kifejezés kell legyen - vagyis kiértékelésének eredménye vagy igaz vagy hamis kell legyen. A gömbölyű zárójelek után áll a feltételhez tartozó utasítás vagy utasításblokk.

Egyes (pascal) alapú nyelveknél az if után nem kell a feltételt gömbölyű zárójelek közé rakni - de cserébe a feltételt és az utasítást a then (akkor) kulcsszóval kell elválasztani egymástól. A C alapú nyelvekben a then kulcsszó nincs használatban, de az egyértelműség miatt a feltételt és az utasításblokkot el kell választani egymástól. A C alapú nyelveken ezt úgy értjük el, hogy a feltételt gömbölyű zárójelekbe helyezzük.

int a = int.Parse( Console.ReadLine() );
if (a==0) Console.WriteLine("Ez éppen nulla");
Console.WriteLine("itt a vége.");
 

Ebben a kis programrészben a bekért értéket megvizsgáljuk. Amennyiben az a nulla érték, úgy ezt egy kiírással jelezzük. Másképpen fogalmazva az Ez éppen nulla. kiírás csak akkor jelenik meg, ha a beírt szám ténylegesen a nulla.

2. ábra: Egyszerű elágazás végrehajtásának menete

Az elágazás egyetlen utasításnak fogható fel - mely bár több részből áll, de illeszkedik a szekvencia szabályhoz. Vagyis az elágazás előtti utasítások végrehajtása után következik az if végrehajtása, majd történjen bármi az if végrehajtása közben - utána folytatódik a program a rákövetkező utasítások végrehajtásával.

Az if először kiszámítja a kifejezés értékét. Amennyiben az true (igen), úgy végrehajtódik az if-hez tartozó utasításblokk. Amennyiben a kifejezés értéke false (nem), úgy az utasításblokk nem hajtódik végre - de a program ettől nem állhat le. Ez a kifejezés értéke csak az if belső végrehajtását befolyásolja - a program futását nem.

Amennyiben az if-hez nem egyetlen utasítás, hanem több utasítás tartozik, úgy azt blokkba kell foglalni. Az utasításblokkokat a kapcsos zárójelek határolják - így ezeket kell használnunk.

Console.Write("Kérek egy pozitív számot:");
int a = int.Parse( Console.ReadLine() );
if (a==0)
{
   Console.WriteLine("Ez éppen nulla");
   Console.WriteLine("Azt kértem, pozitív legyen!");
}
Console.WriteLine("itt a vége.");
 

Egyes programnyelveken (pascal) a programblokkokat a begin és end szavak határolják. A C alapú nyelveken a kapcsos zárójelekkel érjük el ugyanezt. Ugyanakkor a pascal alapú nyelveken a kapcsos zárójelek a kommentek létrehozására szolgál - míg a C alapú nyelveken a kommentekhez a /* és */ határolójeleket használjuk.

A kapcsos zárójelekkel egyetlen utasítást is körbe lehet zárni. Nincs olyan szabály, hogy az utasításblokk legalább két utasítást tartalmaz. Sőt, az utasításblokk üres is lehet (nulla darab utasítás). E módon szintaktikailag helyesek az alábbi változatok mindegyike:

if (a==0) { }
 
if (a==0)
{
  Console.WriteLine("Ez éppen nulla");
}
 

Összetett elágazás

Az összetett elágazás kétirányú. Mivel ezt a logikai típusú kifejezések lehetővé teszik, így továbbra is őket használjuk. Általános alakjuk:

3. ábra: Összetett elágazás általános alakja

Az összetett (kétirányú) elágazás két utasításblokkot tartalmaz. A kettőt az else kulcsszó választja el egymástól. Az else egy létező angol szó, nagyar jelentése különben.

Az egyéb nyelveken, pl pascal is létezik az else kulcsszó, mivel ott is szükséges elválasztani a két utasításblokkot egymástól. Az else nem csak elválasztja a két blokkot egymástól - de azok összetartozását is jelzi. Vagyis else hiányában egyszerű elágazást kapunk, az if és else együttese összetett elágazást jelent.

4. ábra: Összetett elágazás végrehajtásának menete

Az összetett elágazás szintén egyetlen utasításnak tekinthető a szekvencia elv szempontjából. Vagyis bármi is történik az if-else belsejében - a program fut tovább az if-else utáni utasítások végrehajtásával.

Az if-else végrehajtása a feltétel kiértékelésével kezdődik. Ha annak értéke true, úgy végrehajtódik az if utáni utasításblokk, és az else blokk nem hajtódik végre. Ha a kifejezés értéke false, úgy az if blokk nem hajtódik végre, de az else blokk igen.

Ilyen módon az if-else két utasításblokkja közül az egyik blokk mindenképpen végrehajtódik. Hogy melyik - az a logikai kifejezés értékén múlik. Természetesen mindkét blokk tartalmazhat egyetlen utasítást, vagy több utasítást is.

if (a==0)
  Console.WriteLine("ez nulla");
else
{
  Console.WriteLine("ez nem nulla");
  Console.WriteLine("ez a szám jónak tűnik");
}
 

Másodfokú egyenlet megoldása

Készítsünk programot, amely a másodfokú egyenlet általános alakjában szereplő konstansokat bekéri, majd meghatározza, hogy az egyenlent megoldható-e, s ha igen, megadja a megoldásokat.

Console.WriteLine("ax2+bx+c=0 alakú másodfokú egyenlet megoldás");
Console.Write("Adja meg 'a' értékét:");
int a = int.Parse(Console.ReadLine());
if (a==0)
{
  Console.WriteLine("Ha az 'a' értéke nulla, akkor ez nem másodfokú egyenlet.");
}
else
{
  Console.Write("Adja meg 'b' értékét:");
  int b = int.Parse(Console.ReadLine());
  Console.Write("Adja meg 'c' értékét:");
  int c = int.Parse(Console.ReadLine());
  double diszkr = b*b-4*a*c;
  if (diszkr<0)
  {
    Console.WriteLine("A diszkrimináns nulla, az egyenletnek nincs valós megoldása.");
  }
  if (diszkr==0)
  {
    Console.WriteLine("A diszkrimináns éppen nulla, egyetlen megoldás lesz.");
    double X = -b/(2.0*a);
    Console.WriteLine("X={0}",X);
  }
  if (diszkr>0)
  {
    Console.WriteLine("A diszkrimináns pozitív, két különböző megoldás lesz.");
    double x1 = (-b+Math.Sqrt(diszkr))/(2.0*a);
    double x2 = (-b-Math.Sqrt(diszkr))/(2.0*a);
    Console.WriteLine("x1={0}",x1);
    Console.WriteLine("x2={0}",x2);
  }
}
 
Hernyák Zoltán
2013-01-24 10:42:36