C kezdőknek (3)

Ebben a részben megismerkedünk az egy- és többágú szelekciókkal (elágazással). Ezek formája hasonlít a más nyelvekben megszokottakra, azonban van néhány szintaktikai eltérés.

Az egyágú szelekció

Ebben az esetben programunk egyes további tevékenységeit (vagy tevékenységét) egy bizonyos feltételhez kötjük. Ilyen szerkezetre van szükség akkor például, ha tájékoztatni akarjuk a felhasználót bizonyos feltételek teljesüléséről, de a program futását nem akarjuk elterelni.

Általános alakja a következő:

...

if (feltétel)

{

  //(1)

}

...

A feltétel helyén bármilyen kifejezés állhat. Ha a kifejezés igaz (azaz értéke 0-tól különbözik), akkor az (1)-es programblokk hajtódik végre. Ha pedig hamis, akkor a program futása folytatódik, ezt a részletet egyszerűen átugorva.

A kétágú szelekció

A feltételes szerkezetnek - a többi nyelvhez hasonlóan - van egy összetettebb alakja is, amikor nem csak azt vizsgáljuk, hogy a feltétel igaz-e, hanem azzal az esettel is számolunk, hogy a feltétel hamis. Ez a kétágú szelekció. Általában akkor van rá szükség, ha bizonyos feltétel hiánya esetén (az else ág) a program futása során adott tevékenységeket kell végrehajtani. Általános alakja hasonlít az előzőhöz:

...

if (feltétel)

{

  //(1)

}

else

{

  //(2)

}

...

Ha a feltétel igaz, az előbbiekhez hasonlóan az első blokk hajtódik végre, ha viszont hamis, akkor az else után következő. Nézzünk egy példát.

Programunk futásakor bekéri a felhasználó nevét, majd a nevet felhasználva üdvözli őt (ez a program is ismerős lehet, hasonlóan az előző részek "Hello Világ!" programjához), ha viszont a felhasználó semmit sem ír be, "megsértődik" J. Itt a teljes forráskód:

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

char nev[35];

int main()

{

   printf("Mi a neved? Kérlek írd ide:");

   gets(nev);

   if ( strlen(nev) >= 3 ) //azaz három karakter vagy hosszabb

   {

      printf("\nÜdvözöllek, kedves %s!\n", nev);

   }

   else

   {

      printf("\nNa jólvan! Nem is érdekel!\n");

   }

  

   system("pause");

}

Az include-dal beillesztett fájlok:

·         stdio.h: szinte minden programunkban szerepel, a szabványos ki/beviteli típusok, függvények, makrók (a makrókkal egy későbbi részben ismerkedünk meg).

·         stdlib.h: általános célú függvényeket tartalmaz, szintén sok programunkban használjuk az elkövetkezőkben.

·         string.h: elsősorban karakterláncok kezelésére használható függvényeket tartalmaz, de megtalálhatók benne a memóriakezelő függvények is.

A következő sorban deklaráljuk a 35 karakter hosszúságú (igazából 34, de erre még visszatérünk) „nev” azonosítójú változót, ez fogja majd tárolni a beolvasott nevet.

A main() függvény már régi ismerősünk, tőle kezdődik a program futása. A printf()-fel már szintén találkoztunk, szöveg kírására alkalmazzuk.

Egy új függvény a gets(). Feladata sztringek beolvasása az argumentumában megadott változóba.

Ezután következik a feltételes szerkezet, amelynek segítségével eldöntjük, hogy megadott–e nevet a felhasználó vagy sem. Ezt úgy tesszük, hogy az strlen() segítségével lekérdezzük a sztring hosszát. Ennek a függvénynek a visszatérési értéke a sztring hossza. Ha a sztring hossza >= 3 (olvasd: nagyobb vagy egyenlő), akkor ez azt jelenti hogy rendes nevet adott meg, hiszen csak 3 vagy több betűs nevek vannak.

Az első programblokkot tehát akkor hajtjuk végre, ha a feltétel igaz. A printf() első argumentuma:

"\nÜdvözöllek, kedves %s!\n"

Rögtön egy \n formázási karakterrel kezdődik, ami – mint már említettük – új sorba lépteti a kurzort és ott folytatja a kiírást. A végén találunk egy eddig ismeretlen formázási karaktert: %s. Ez azt jelzi a printf()-nek, hogy oda sztring lesz beszúrva. Majd ismét egy újsor karakter jön. A következő argumentum pedig a beszúrt sztringet (az imént beolvasott nevet) tartalmazó változó.

Ha a feltétel nem teljesül (vagyis a beírt név rövidebb, mint 3 karakter), kiírásra kerül a sértődős szöveg.

Programunk végén pedig a már jól ismert system() függvény szerepel a pause nevű utasítással, hogy a DOS ablak ne záródjon be azonnal.

Akkor most futtassuk a programot! Ha Dev-C++-t használunk, meglepő eredményt tapasztalhatunk: Az ékezetes karakterek helyett mindenféle furcsa karakterek jelennek meg. Ennek a DOS-os és a Windows-os karakterkészletek közti eltérés az oka. Ez többféleképpen megoldható, legegyszerűbb módszert alkalmazva az ékezetes karaktereket a hexadecimális kódjukkal adjuk meg. Ezt egy formázási karakterrel a \x segítségével tesszük meg. A táblázatban megtalálhatók az ékezetes karakterek kódjai. A példánál maradva:

"\n\x9Adv\x94z\x94llek, kedves %s\n"

Mint látható ez a kódban nem túl olvasható, de hatékony. A következő részben elkészítünk egy hatásosabb módszert.

A többágú szelekció

Gyakran előfordul, hogy bizonyos feltételek szerint rendezni, szétválasztani kívánjuk dolgainkat. Ennek egyszerű gyakorlati példája a következő: Fiatalok korát kérjük be években és ennek alapján eldöntjük, hogy nem iskolaköteles, általános iskolás, középiskolás, vagy felnőtt egyénről van szó (természetesen tetszés szerint finomítható a szétválasztás. Ilyen esetben a vezérlő szerkezet általános alakja a következő:

...

if (feltétel1) // kora > 18

{

  //(1)

}

else if (feltétel2) // kora > 14

{

  //(2)

}

else if (feltétel3) // kora > 6

{

  //(3)

}

else // és itt az összes többi, hat éves kor alatt

{

  //(4)

}

...

Persze a feltétel lista és ezzel az elágazások száma tetszés szerint bővíthető, de bizonyos szám felett már nem kényelmes a kezelése, ezért speciális megoldásokat használunk inkább.

A többágú szelekció speciális esete

Ez a speciális vezérlő szerkezet arra való, hogy egy változó különböző értékeihez kössük a program további futását, és jóval rövidebb, áttekinthetőbb, mintha sok kétágú szelekciót ágyaznánk egymásba. Változóként csak ún. sorszámozható típusokat, karaktert vagy integert használhatunk. Általános formája jól áttekinthető:

 

switch(változó)

{

   case érték1:

    //utasítások

   case érték2:

    //utasítások

   case értékn:

    //utasítások

}

 

Egyvalamire azonban fel kell hívni a figyelmet! Amennyiben a programvezérlés valamelyik ágra átadódik, alaphelyzetben az alatta - sorrendben utána következő - ágak is végrehajtásra kerülnek. Ezért ha azt szeretnénk, hogy az egyes ágakban található utasítások végrehajtása után a program "kiugorjon" a switch-ből, az utasítások után helyezzük el a break kulcsszót.

 

Hát, ennyi fért bele ebbe a részbe, a következőkben a ciklusokkal fogunk foglalkozni és elkészítünk egy egyszerű találgatós játékot.

 

 

Szelei Tamás - d4mi3n@mail.com