2019. január 21., hétfő

Hátultesztelő logikai ciklusok - Számlálós ciklusok

A C-ben többféleképpen tudunk ciklusokat készíteni.


Az egyik ilyen a do … while ciklus. Általános alakja:
do utasítás while (<feltétel>);
A do … while ciklus egy hátul tesztelő pozitív vezérlésű ciklus. A feltétel itt egy logikai típusú feltétel. Az utasítás lehet egy darab utasítás, vagy több utasítás is (utasításblokk). Ez utóbbi esetben az utasításokat blokkjelek közé kell zárni ( „ { … } „ ).
Pl.:
int osszeg = 0, i=1;do
{ osszeg = osszeg + i;
i++;}
while (i<=100);
printf(”Az első 100 egész szám összege=%d”, osszeg);



A ’do … while’ végrehajtásának lépései:

a ciklusmag utasításainak végrehajtása
a logikai feltétel kiértékelése
amennyiben a feltétel IGAZ, úgy az (1) pont következik újra
a program folytatása a do … while-t követő utasítással
A ’do … while’ ciklus feltételét a ’ciklusban maradás’ feltételének is nevezhetjük, mivel ha a feltétel igaz értékű, akkor maradunk a ciklusban.

BREAK és a hátul tesztelő ciklus
A ciklusmagba elhelyezhetünk ’break’ utasítást. Ennek jelentése ebben az esetben: szakítsd meg a ciklus futását azonnal. Ennek hatására a program működése nem áll le, hanem folytatódik a ciklust követő utasításon.
Természetesen a ’break’ hatása eléggé végleges. Ha a ciklusmag direktben tartalmaz ’break’ utasítást, akkor az nem ciklus-szerű működésű lesz, hiszen a ciklusmag első végrehajtása egyben az utolsó is lesz.
Ezért a ’break’-et egy ’if’ belsejébe szoktuk elvégezni. Ez esetben az ’if’ a ciklus rendkívüli megszakítására szolgál.

Pl.:

int db = 0, a;
do
{
scanf(”%d”, &a);
if (a==0) break;
db++;
}
while ( 1 );

printf(”Összesen %d db 0-tól különböző számot írtál be”,db);



CONTINUE és a hátultesztelő ciklus
A ciklusmagba elhelyezhetünk ’continue’ utasítást. Ennek jelentése ebben az esetben: szakítsd meg a ciklusmag maradék részének végrehajtását, és ugorj a ciklus vezérlő feltétel kiértékelésére.
Természetesen a continue hatása eléggé végleges. Ha a ciklusmag direktben tartalmaz continue utasítást, akkor a continue utáni ciklusmag-utasítások sosem kerülnek végrehajtásra. Ezért a continue-t egy ’if’ belsejébe szoktuk elvégezni.

Pl.:

int db = 0, a;
do
{
scanf(”%d”, &a);
if (a<=0) continue;
db++;
}
while (a!=0)
printf(”Összesen %d db pozitív számot írtál be”,db);






Számlálós ciklusok működése
A ’C’-ben többféleképpen tudunk ciklusokat készíteni. Az egyik ilyen a for ciklus. Általános alakja:
for(kezdőértékadás; vezérlőfeltétel; iterációslépés) utasítás;
A ’for’ ciklus működésének lépései:

a kezdőértékadás végrehajtása (ha az nem üres)
a vezérlő feltétel kiértékelése
amennyiben a feltétel HAMIS értékű, úgy az (7) pont következik
a ciklusmag utasításainak végrehajtása
az iterációs lépés végrehajtása (ha az nem üres)
újra a (2)-es pont következik
a program folytatás a for ciklust követő utasítással
Vegyük észre, hogy amennyiben üresen hagyjuk a ’kezdőértékadás’ és ’iterációslépés’ részeket, akkor a működés megegyezik a ’while’ ciklus működésével.
A kezdőértékadás részt csak egyszer kell végrehajtani, a ciklus első lépéseként.
Az iterációs lépés garantáltan végrehajtásra kerül, ha a ciklusmag végrehajtása elkezdődik (a vezérlő feltétel IGAZ értékű).

Számlálós ciklusok felépítése
A C-ben többféleképpen tudunk ciklusokat készíteni. Az egyik ilyen a for ciklus. Általános alakja:
for(kezdőértékadás; vezérlőfeltétel; iterációslépés) utasítás;
A for ciklus egy elöltesztelő pozitív vezérlésű ciklus. A vezérlő feltétel egy logikai feltétel, mely IGAZ értéke esetén hajtódnak végre a ciklusmag utasításai.
A for fejrészében szereplő három rész közül a kezdő értékadás és az iterációs lépés bármelyike (vagy akár mindkettő) üresen is hagyható. A pontosvesszőket ez esetben is ki kell tenni.
Pl.:
for( ; vezérlőfeltétel; iterációslépés) utasítás;
for( kezdőértékadás ; vezérlőfeltétel; ) utasítás;
for( ; vezérlőfeltétel; ) utasítás;





BREAK és a számlálós ciklus
A ciklusmagba elhelyezhetünk ’break’ utasítást. Ennek jelentése ebben az esetben: szakítsd meg a ciklus futását azonnal. Ennek hatására a program működése nem áll le, hanem folytatódik a ciklust követő utasításon.
Természetesen a ’break’ hatása eléggé végleges. Ha a ciklusmag direktben tartalmaz ’break’ utasítást, akkor az nem ciklus-szerű működésű lesz, hiszen a ciklusmag első végrehajtása egyben az utolsó is lesz.
Ezért a ’break’-et egy ’if’ belsejébe szoktuk elvégezni. Ez esetben az ’if’ a ciklus rendkívüli megszakítására szolgál.

Pl.:

int db = 0, a, i;
for(i=0;i<10;i++)
{
scanf(”%d”,&a);
if (a==0) break;
db++;
}
printf(”A lehetséges 10 számból %d esetben írtál be nem nulla értéket”,db);




CONTINUE és a számlálós ciklus
A ciklusmagba elhelyezhetünk ’continue’ utasítást. Ennek jelentése ebben az esetben: szakítsd meg a ciklusmag maradék részének végrehajtását, és lépj újra az iterációs lépésre.

Természetesen a continue hatása eléggé végleges. Ha a ciklusmag direktben tartalmaz continue utasítást, akkor a continue utáni ciklusmag-utasítások sosem kerülnek végrehajtásra. Ezért a continue-t egy if belsejébe szoktuk helyezni.

Pl.:

int db = 0, a, i;
for(i=0;i<10;i++)
{
scanf(”%d”,&a);
if (a<=0) continue;
db++;
}
printf(”A lehetséges 10 számból %d esetben írtál be pozitív számot.”,db);



Mi tilos a számlálós ciklusokban?
A kezdő értékadás során általában valamely változónak adunk kezdőértéket. Ugyanezen változót használjuk a feltételben, és az iterációs lépésben ezen változó értékét változtatjuk következetesen.
Pl. for(int i=0;i<10;i++) ….;
Egy ilyen felépítésű ciklus fejrészéből leolvasható, hogy egészen pontosan hányszor is kerül végrehajtása a ciklusmag (ebben a példában 10-szer).
Amennyiben a ciklusmagban is megváltoztatjuk a fenti változó értékét, úgy a for ciklus lényegét veszítjük el, mégpedig hogy a ciklus fejrésze adjon információt a várható ismétlések számáról.
Ez elvileg nem tilos, de zavaró. Ezért próbáljuk meg elkerülni. Ha mégsem tudjuk, akkor ne for ciklust használjunk, hanem while-t:
for(int i=0;i<10;i++)
{
scanf(”%d”, &a);
if (a<=0) i--;
else db++;
}

Nincsenek megjegyzések:

Megjegyzés küldése