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 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.
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ű.