A programokban gyakran van szükség utasítások ismételt végrehajtására. Az ilyen feladatok megoldására szolgálnak a ciklusok. A Pascalban három féle ciklus található: a for, a while és a repeat-until.
A for ciklusutasítást akkor használjuk, ha pontosan ismerjük az ismétlések számát. A for ciklust két féle képen lehet használni: növekvő vagy csökkenő ciklusként. A for ciklusutasítás csak egyetlen utasítás végrehajtására vonatkozik (ha több utasítás, akkor blokk).
A for utasítás alakja növekményes ciklus esetén:
for ciklusváltozó:=kezdőérték to végérték do utasítás;
a végrehajtáshoz fontos hogy teljesüljön:kezdőérték < végérték kezdeti feltétel. A fentieket mindig az alábbi formában kérem (növekményes):
for ciklusváltozó:=kezdőérték to végérték do
begin
utasítás;
end;
A for utasítás alakja csökkenő ciklus esetén, vagyis ha kezdőérték > végérték
for ciklusváltozó:=kezdőérték downto végérték do utasítás;
A fentieket mindig így kérem (csökkenő):
for ciklusváltozó:=kezdőérték downto végérték do
begin
utasítás;
end;
A FOR ciklus folyamatábrája:
A növekményes for ciklus a hozzá szükséges változók deklarációjával:
Var i, kezd, veg : integer;
Begin
{kezd értékének beállítása }
{veg értékének beállítása}
For i:= kezd to veg do
Begin
<tevékenység>
End;
End.
A növekményes ciklus akkor fog a ciklusmagba belépni, vagyis a vezérlés akkor kerül a tevékenység-re ha a kezd<veg kezdeti feltétel teljesül. A FOR ciklus estén a ciklusmagban leírt utasításban felhasználhatjuk az i ciklusváltozó értékét, de azt tilos megváltoztatni![1] A kezd és veg értékének beállítása lehet a billentyűzetről, vagy valamely értékadó utasítással. A kezd és veg értékének ismertnek kell lennie mielőtt a vezérlés a ciklusfejre kerül!
Az alábbi példa egész szám kiírását végzi 1-től 6-ig! A ciklusmag egy szám kiírásából áll!
Program kiir1_6;
Var i, kezd, veg : integer;
Begin
kezd:=1;
veg:=6;
For i:= kezd to veg do
Begin
Write(i);
End
Readln;
End.
N db csillag a képernyőn, képernyőtörléssel és a szükséges crt unit meghívásával:
program Csillag;
uses Crt; {biztosítja a képernyő kezelést a programban}
var i, n: byte;
begin
ClrScr; {képernyőt közöl}
ReadLn(n);
for i := 1 to n do
Write('*');
ReadLn
end.
A deklaráció miatt n legfeljebb 255 lehet.
Az alábbi példa két billentyűről megadott érték közti számokat írja ki növekvő sorrendben:
Program kiir_tol_ig;
Var i, kezd, veg : integer;
Begin
Write(’Add meg hol kezdjem a számlálást:”);
Readln(kezd);
Write(’Add meg a számlálás végértékét:’);
Readln(veg);
For i:= kezd to veg do
Begin
Write(i:4); {1-1 kiíráshoz 4 karakternyi helyet használ fel}
End
Readln;
End.
Egy FOR-os progi (melyet a szokásos módon át kell, hogy írj!
program FOR_TEST;
var s, j, k, i, l : integer;
begin
s := 0;
for j:= 1 to 5 do
begin
write( j );
s := s + j
end;
writeln( s );
for k := 0 to 1 do write( k );
for i := 10 downto 1 do writeln( i );
j := 3; k := 8; l := 2;
for i := j to k do writeln( i + l )
end.
A kezdő és a vég érték lehet negatív is, csak az kell a tényleges kiíráshoz, hogy kezd<veg feltétel teljesüljön.
Az elöl tesztelő ciklus a Pacalban, a while ciklus
Ciklusaink lehetnek adott számszor lefutók, vagy előre nem ismert alkalommal lefutók. A nem ismert alkalommal lefutó ciklus lefutási feltételét tehetjük az ismétlődő tevékenység elé vagy mögé. Ha az ismétlés feltétele az ismétlődő utasítás előtt áll elöl tesztelő ciklusról beszélünk.
A while ciklus általános alakja:
while logikai kifejezés do utasítás;
A fenti ciklust mindig az alábbi módon kell leírni:
while (logikai kifejezés) do
begin
utasítás;
end;
Szokjuk meg, hogy a feltételt zárójelbe tesszük.
A folyamatábra:
A while utasítás legegyszerűbb alkalmazása, az mikor egy számláló ciklust átírunk elöl tesztelővé. Nézzük az alábbi példát:
For i:=1 to 6 do
Begin
write(i);
End;
Az i kezdőértéke 1 és végértéke 6, az i értéke egyesével növekszik. Tehát i kezdőértéke 1, vagyis i:=1; minden i-re igaz, hogy i<=6, vagyis a while-os megoldás:
i:=1;
while i<= 6 do
begin
write(i);
i:=i+1; {figyelem, nem FOR-os ciklus, ez biztosítja a kilépést}
end;
Egy tipikusan elöl tesztelő ciklussal megoldandó feladat az alábbi:
Kérdezze meg a gyerek az apját, mit gondol, hogy ma hányast kapott? A gyerek ma is egy szép jelest hozott. Míg az apa rossz jegyet, azaz 5-től eltérőt mond addig a gyerek újra kérdezi. Az ismétlésre akkor kerül sor, ha az apa nem találta el a kapott jegyet.
Be: jegy
Ciklus míg jegy<>5
Be: jegy
Ciklus vége
A lényeges rész kódja:
Readln(jegy);
While (jegy<>5) do
Begin
Readln(jegy);
End;
A fenti tevékenység az alapja az úgynevezett előolvasásos végjeles bekérésnek, mely adatok, adatsorok bevitelénél nagy szerepet játszik.
A repeat-until ciklus hasonló a while ciklushoz. Az ismétlést itt is egy logikai kifejezés vezérli. A különbség az, hogy a repeat-until ciklus egyszer mindenképpen végrehajtódik, mert a feltétel (a logikai kifejezés) a ciklus végén kerül kiértékelésre. A ciklusmag addig hajtódik végre, amíg a logikai kifejezés hamis, és akkor fejeződik be, amikor a logikai kifejezés igazzá válik. Ebben az esetben a logikai kifejezést kilépési feltételnek hívjuk. Az utasítás általános formája:
repeat ciklusmag; until logikai kifejezés;
A ciklusmag több utasításból is állhat. Itt nincs szükség a begin-end kulcsszavak használatára, mert a repeat-until kulcsszavak helyettesítik azokat.
A példa:
repeat
Osszeg:=Osszeg+Szam;
Szam:=Szam+1;
until Szam=21;
Az utasítás folyamatábrája:
Összefoglalóan a ciklusokról:
A ciklus fajtája |
A futások száma |
Legkevesebb hányszor fut le? |
|
Feltételes |
Elöl tesztelő |
előre nem ismert |
lehet, hogy egyszer sem |
Hátul tesztelő |
előre nem ismert |
legalább egyszer |
|
Számlálós |
előre ismert |
lehet, hogy egyszer sem |
A ciklus utasításokkal utasítás(ok) ismételt végrehajtását lehet előírni. Az ismétlések számáról rendelkezésre álló információ alapján dönthetjük el, melyik ciklusszervező utasítást alkalmazzuk.
· Ha előre ismert az ismétlések száma:
for ciklusváltozó:=kezdőérték to/downto végérték do utasítás;
· Ha a végrehajtási feltétel a belépés előtt ismert (előltesztelő):
while logikai kifejezés do utasítás;
· Ha a feltételvizsgálat előtt egyszer végre kell hajtani (hátultesztelő):
repeat ciklusmag until logikai kifejezés;