Ciklusok a Pascalban
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;
[1] Mi lenne a Ciklus i:= 1 –tõ 5-ig i:=i-1; ciklus értelme?