Személyes eszközök
Keresés

 

A InfoWiki wikiből

Egyszerű ciklusok

A ciklusok valamely utasítások, utasításcsoport elemeinek ismétlését jelentik. Az ismétlést előidézhetnénk oly módon is, hogy az utasításokat a kódban egymás alatt többször is leírjuk (erre a szövegszerkesztőnk copy-paste menüpontjai nagyon egyszerű módot adnak) - de van olyan eset, amikor a kód írása közben nem eldönthető, hogy futás közben hányszor kell az adott kódsorozatot ismételni. Első esetben is elegánsabb a ciklusok alkalmazása, hiszen a kód tömörebb lesz, könyebben karbantartható.

Logikai vezérlésű ciklusok

A legegyszerűbb ciklusok erősen hasonlítanak az if működéséhez, azzal a különbséggel, hogy amennyiben a feltétel igaz értékű, úgy a hozzá kapcsolt utasításblokkot nem egyszer, hanem többször is végre kell hajtani. Ezt úgy értjük, hogy a feltétel igaz esetén végrehajtjuk az utasításblokkot, majd újra kiértékeljük a feltételt. Ha az még mindíg igaz értékű, újra végrehajtjuk az utasításblokkot. Ezt addig ismételjük, amíg a feltétel kiértékelésének eredménye végre hamis lesz. Ekkor a ciklus befejezi az ismétlést, és folytatódhat a program futása a ciklus utáni utasításokon.

A ciklusok által tartalmazott utasításblokkot ciklusmagnak nevezzük, a ciklushoz tartozó logikai feltételt ciklus vezérlő feltételének nevezzük.


A fenti, legegyszerűbb működésű ciklust a while kulcsszóval képezzük:

int a=1;
 while(a<=5)
 {
   Console.WriteLine("Hello");
   a=a+1;
 }
 Console.WriteLine("Kész.");

A fenti kis ciklus esetén az első menetben az a változó értéke még 1, ezért az a<=5 feltétel értéke igaz. A ciklusmag utasításait a szekvencia szabályainak megfelelő sorrendben hajtjuk végre, először kiíródik a Hello, majd az a értéke növelődik. A következő menetben az a<=5 még mindíg igaz értékű, a harmadik, negyedik menetben is. Amikor a növelés közben az a változó felveszi a 6 értéket, a következő menetben a feltétel értéke már hamis lesz, a ciklus véget ér, és folytatódik a program futása, kiíródik a Kész. a képernyőre.

Pozitív és negatív vezérlés

A fenti while ciklus esetén a vezérlő feltétel igaz értéke engedélyezi a ciklusmag végrehajtását. Ezt a gondolkodásmódot pozitív-nak értékeljük, a ciklus vezérlését pozitív vezérlésnek nevezzük. A ciklus addig ismétlődik, amíg a feltétel igaz, ezért a feltételt néha ciklusban maradás feltételének nevezzük.

Fordítva is elképzelhető a vezérlés. Ez esetben a ciklus feltételének hamisnak kell lennie, hogy a ciklus végrehajtódjon, ha igazzá válik, a ciklus futása befejeződik. Ez a negatív vezérlésű ciklus, feltételének neve ciklusból kilépés feltétele.

A C# nyelvben negatív vezérlésű ciklus nincs, de más programozási nyelvekben előfordulhat.

Előltesztelő ciklusok

Egy ciklus működésében alapvetően az alábbi sémát követi:

1: a ciklus vezérlő feltételének kiértékelése
    ha a ciklus végrehajtható, akkor...
       a ciklusmag utasításainak végrehajtása
	     ugrás újra az <1> lépésre
    hvége
 2: a ciklus utáni programrész ...

Van egy másik séma is:

1: a ciklusmag utasításainak végrehajtása
    a ciklus vezérlő feltételének kiértékelése
    ha az a ciklus végrehajtható, akkor...
	     ugrás újra az <1> lépésre
    hvége
 2: a ciklus utáni programrész ...

Az első séma szerint a ciklus vezérlő feltételének első kiértékelése megelőzi a ciklusmag első lefutását. Ha a vezérlő feltétel rögtön hamis lenne, akkor a ciklusmag egyetlen egyszer sem tudna lefutni (előfordulhat hogy a ciklusmag egyszer sem fut le).

A második séma szerint a ciklusmag fut le először, majd ezt követően a ciklus vezérlő feltétele alapján eldől, hogy van-e szükség további lefutásokra.

Az első séma alapján működő ciklusokat előltesztelő, a második séma szerintieket hátultesztelő ciklusoknak nevezzük.


A korábban felírt while ciklus előltesztelős működésű ciklus volt. Módosítsuk kicsit a kódot, és a működés azonnal nyilvánvalóan feltárul:

int a=10;
 while(a<=5)
 {
   Console.WriteLine("Hello");
   a=a+1;
 }
 Console.WriteLine("Kész.");

A fenti kis kód nem hibás! Sokszor szembesülök azzal a megfogalmazással, hogy ezen ciklus nem működik, hibás. Persze ez bizonyos értelemben igaz, de a hiba általában azt jelöli, hogy a kód le sem fordul, vagy bár lefordul, de a program futása a ciklust elérve leáll futási hibával. Ezek egyike sem következik be, mivel a fenti kód minden értelemben hibátlan, bár valóban sajátságosan működik.

Ugyanis az a=10 kezdőérték hatása az a<=5 feltétel a legelső kiértékelés során máris hamis értékű lesz, így a ciklusmag nem hajtódik végre, hanem folytatódik ugyanolyan lendülettel a ciklus utáni utasításokkal a program futása, kiíródik a Kész. sor.

Hátultesztelő változat

A C# nyelv hátultesztelő ciklusát szintén a while kulcsszóval képezzük, bár a szintaktikája változik, sugallja a hátultesztelős működést:

int a=10;
 do
 {
   Console.WriteLine("Hello");
   a=a+1;
 }
 while(a<=5);
 Console.WriteLine("Kész.");

Mint látjuk, a ciklus elejére bekerült egy do szócska, és a while a feltétellel együtt látványosan a ciklusmag mögé került. Ha kipróbáljuk a fenti kis kódot, kiderül, hogy működése szerint első lépésben az a változó felveszi a 10 értéket, majd kiíródik a Hello, az a értéke növelődik 1-el (eléri a 11-t), a vezérlő feltétel hamis lesz, a ciklus leáll, a program folytatódik tovább.

A két működés közötti különbség tehát az, hogy előltesztelős esetben egyszer sem íródott ki a Hello (a ciklusmag egyszer sem hajtódott végre), míg hátultesztelős esetben a Hello mindenképpen kiíródik (a ciklusmag legalább egyszer végrehajtódik), legfeljebb többször már nem.

A valós életben általában előltesztelős ciklusokat használunk (valamiért gyakoribbak az ilyen megoldások).

Hátultesztelős ciklust akkor alkalmazunk csak, ha a ciklusmagnak legalább egyszer le kell futnia.


Konklúzió

A C# while ciklusának teljes meghatározása: pozitív vezérlésű előltesztelős ciklus, míg a do...while ciklus teljes meghatározása pozitív vezérlésű hátultesztelős ciklus.

Az egyéb lehetőségek (negatív vezérlésű elől-, vagy hátultesztelő ciklus) egyes programozási nyelveken rendelkezésre állnak, van olyan nyelv, ahol mind a négyfajta ciklus jelen van. Más nyelveken (pl. pascal) az előltesztelős ciklus pozitív vezérlésű, a hátultesztelős változat pedig negatív vezérlésű.

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