„Ciklus (programozás)” változatai közötti eltérés
[ellenőrzött változat] | [nem ellenőrzött változat] |
Tartalom törölve Tartalom hozzáadva
a Visszaállítottam a lap korábbi változatát 2001:738:809:6FB:A020:89A1:6F43:AE03 (vita) szerkesztéséről 2001:4C4C:2298:B500:A090:322E:D4C5:A378 szerkesztésére Címke: Visszaállítás |
Nincs szerkesztési összefoglaló |
||
1. sor:
A '''ciklus''', vagy '''iteráció''' a [[számítógép-programozás]] és az [[algoritmus]]ok egyik alapvető eszköze, amely az ismétlődő (azonos vagy hasonló) tevékenységek megvalósítására
szolgál. A ciklus beépítését a programba ''ciklusszervezés''nek is nevezik. A ciklust az egyes [[programozási nyelv]]ek különböző [[kulcsszó|kulcsszavakkal]] valósítják meg.
== Típusai==
== A ciklus részei ==
Alább egy egyszerű [[BASIC]] nyelvű ciklust láthatunk, amelyik
<syntaxhighlight lang="freebasic">
FOR i=
PRINT i," négyzete: ",i*i
NEXT i
</syntaxhighlight>
Ebben a ciklusban az ''i'' a '''ciklusváltozó''', amely a ciklus kezdetén [[értékadás|értéket kap]]. A szerepe kettős: egyrészt vezérli a ciklust, mivel a ciklusváltozó értékétől függ, hogy folytatódik-e a futás, másrészt a pillanatnyi értéket a program felhasználja. A ciklus futásának kezdetén tehát az ''i'' értéke
sort. Ezután ''i'' értéke
Ebben a ciklusban a ciklusváltozónak van '''kezdőértéke''' (
A ciklus első sorát '''ciklusfejnek''' nevezik. Általában ez vezérli a ciklust; itt kap helyet a ciklusváltozó(k) definíciója, valamint a futási feltétel is. A középső sor a '''ciklusmag''', vagyis a ténylegesen ismétlődő utasítások meghatározása. Ennek a ciklusnak a magja egyetlen utasításból áll. Végül az utolsó sor a '''ciklusvég'''; az
== Feltételes ciklusok (WHILE)==
A feltételes
===
[[Fájl:While-loop-diagram.svg|
Az
<pre>Ismételd, amíg a feltétel igaz
utasítások
ciklus vége</pre>
Az
Az
Az
Általános alakja a következő:
<pre>
while(feltétel){
utasítás(ok);
}
</pre>
Példa (awk):
<pre>
while (i<10){
print i;
}
</pre>
===
[[Fájl:Do-while-loop-diagram.svg|
A
<pre>Ismételd
utasítások
amíg a feltétel igaz</pre>
Mivel a feltételvizsgálat a ciklusmag után áll, ezért a
A konkrét programnyelvi megvalósítástól függ, hogy a
Általános alakja a következő:
<pre>
do
{
utasítás(ok);
}while(feltétel);
</pre>
Jellemző példa a hátul tesztelő ciklusra az adatbevitel ellenőrzése. Tegyük fel, hogy regisztrálni szeretnénk egy ingyenes [[E-mail|postafiókot]] az [[internet]]en. A [[szerver]]en futó programnak először ellenőriznie kell, hogy szabad-e még a választott azonosító, majd azt is, hogy kitöltöttük-e az összes kötelező adatmezőt, és addig kell ismételnie ezt a lépést, amíg az összes adat helyessé nem válik. Sok szolgáltató ezt egy lépésben végzi el, vagyis először ki kell töltenünk az űrlapot, aztán tudjuk meg, hogy szabad-e még az azonosító. Ebben az esetben a ciklus a következőképpen nézhet ki:
<pre>
Ismételd
58 ⟶ 72 sor:
Ha egy kötelező mező hiányzik, írd ki, és add vissza az űrlapot
amíg hibás az űrlap</pre>
Mivel a feltételt csak az adatbeolvasás után ellenőrzi a program, ezért az adatok beolvasása legalább egyszer mindenképpen megtörténik. Ha sikerült elsőre jól kitölteni az adatlapot, akkor tovább lehet lépni.
Zavart okozhat a szöveges leírásokban a magyar '''amíg''' szó két, egymással lényegében ellentétes jelentése. Az algoritmusok leírásában az ''amíg'' szót mindig a 'mialatt', 'miközben' értelmében használjuk, ami az angol ''while''-nak felel meg. A fenti eljárást úgy is fogalmazhatnánk, hogy ''„olvasd be az adatokat, ahányszor kell, amíg jók lesznek”'' – ebben az esetben az ''amíg'' szót az angol ''until'' értelmében használtuk, ami szintén lehet a hátul tesztelő ciklus kulcsszava. Ezért előfordulhat, hogy a programkódban épp a szöveges algoritmusban látható feltétel tagadását kell megfogalmaznunk.
== Számláló (FOR) ciklus ==
[[Fájl:For-loop-diagram.png|200px|jobbra|bélyegkép]]
A számláló ciklus általánosságban olyan elöl tesztelő ciklust jelent, amely egy felsorolható típus adott intervallumán léptet végig, speciálisan egész számokon. Üres intervallumra nem fut le.
C-ben a <code>for</code> ciklus majdnem teljesen ekvivalens az elől tesztelő ciklussal, de más nyelvekben nem feltétlenül van ez így: a <code>for</code> ciklus átírható más ciklussá, de visszafelé általában nem.
A <code>for</code> ciklusnak kisebb lehet a kifejezőereje, de könnyebb olvasni: ezért a használata javasolt minden olyan esetben, ahol csak lehetséges.
Számok összegzése <code>for</code>ciklussal C-ben:
<syntaxhighlight lang="cpp">
int sum = 0; // Kezdetben a szumma 0
int i;
for(i=0; i<200; ++i) // Kezdőérték; feltétel; növelés
sum += i; // Az i hozzáadása sum-hoz
</syntaxhighlight>
<syntaxhighlight lang="cpp">
int sum = 0;
int i =
while(i<
++i;
}
</syntaxhighlight>
Az
<syntaxhighlight lang="ada">
96 ⟶ 112 sor:
</syntaxhighlight>
== Iteráló ciklus (FOR IN, FOREACH) ==
Egyes nyelvekben a <code>foreach</code> [[kulcsszó]]t kell használni. Arra való, hogy egy egy [[tároló (adatszerkezet)|tároló]] (pl.: tömb, lista, bináris fa, stb., stb.) elemeit bejárjuk. Erre egy egyszerű példa PHP-ban:<ref>{{Cite web |url=http://hu.php.net/manual/en/control-structures.foreach.php# |title=Archivált másolat |accessdate=2010-01-19 |archiveurl=https://web.archive.org/web/20090213012453/http://hu.php.net/manual/en/control-structures.foreach.php# |archivedate=2009-02-13 }}</ref>
<syntaxhighlight lang="php">
$arr = array(1, 2, 3, 4); // Tömb az 1,2,3,4 számokból
109 ⟶ 119 sor:
$value = $value * 2; // Minden elem megszorzása 2-vel
}
// A $arr elemei itt rendre 1, 2, 3 és 4
</syntaxhighlight>
Egy lista bejárása (AutoLISP):
<syntaxhighlight lang="lisp">
(foreach n '(a b c) (print n))
</syntaxhighlight>
Egyenértékű a
<syntaxhighlight lang="lisp">
(print a)
(print b)
(print c)
</syntaxhighlight>
megadásával. Mivel egy lista elemszáma nem kötött, az előny nyilvánvaló.
Néhány programozási nyelv a <code>for in</code>utasítással valósítja meg a
tömbök, listák bejárását, pl. awk:
(már létezik a ''szavak'' nevú tömb)
<syntaxhighlight lang="cpp">
for (x in szavak) {
if (length(x) > 12) { # ha a szó hosszabb, mint 12 karakter
print x # akkor kiírjuk
}
}
</syntaxhighlight>
Ez a példa egy [[MS-DOS]] [[kötegelt állomány]]ában szerepel, és törli az aktuális könyvtárból az ideiglenes állományokat néhány tipikus kiterjesztés alapján:
<syntaxhighlight lang="dos">
for %%c in (*.bak *.tmp *.$$$ *.wbk) do del %%c
</syntaxhighlight>
== Beavatkozás a ciklus menetébe ==
Egy ciklus menetébe beavatkozni többféleképpen lehet:
* a ciklusváltozó növelésével, ill. csökkentésével;
* a <code>break</code> utasítással;
* a <code>continue</code> utasítással.
Mindhárom módszer használható a <code>for</code> és a <code>while</code> segítségével létrehozott ciklusokban. Az egyetlen követelmény, hogy a ciklus törzén belül kell elhelyezni,különben hibajelzést kapunk.
=== Ciklusváltozó módosítása ===
Gyakran előfordul, hogy ''n'' darab különböző számot kell generálnunk vagy bekérnünk. Ilyenkor kézenfekvő a <code>for</code> ciklus használata, ugyanakkor ismétlődés vagy hibás adat esetén szükség lehet a ''visszalépés''re.
<syntaxhighlight lang="cpp">
126 ⟶ 171 sor:
} else {
cerr << "A szám nem megfelelő vagy már volt." << endl;
--i; // visszalépés
}
}
</syntaxhighlight>
=== A BREAK utasítás ===
Ez a speciális, ciklusok esetén használható utasítás azonnal ''megszakítja'' a ciklus futását, és függetlenül a ciklus vezérlő feltétel értékétől, függetlenül minden mástól azonnal (erőszakosan) befejezi a ciklus futását. A program futása ettől nem szakad meg, folytatódik a ciklusra rákövetkező utasítás végrehajtásával.
=== A CONTINUE utasítás ===
A <code>break</code>-hez hasonló utasítás a code<>continue</code>. Ennek használata esetén a ciklus futása nem szakad meg (fejeződik be) mint a <code>break</code>, sőt, ellenkezőleg. A <code>continue</code> hatására a ciklusmag maradék utasításai ebben a menetben már nem hajtódnak végre, de a ciklus futása folytatódik, mintha elértük volna a ciklusmag végét, vagyis újra a vezérlő feltétel kiértékelése következik. Például szeretnénk kihagyni az 1234-es irányítószámot:
<pre>
kimarad = 1234;
start = 1230;
end = 1240;
for(i= start; i<=end; i++){
if(i== kimarad){continue} else{
print i,"\n";
}
}
</pre>
A <code>continue</code> utasítás pl. menük ,,kiszürkítésére" is jól használható.
== Néhány nevezetes alkalmazás ==
143 ⟶ 209 sor:
std::cout << "A cellák összege: " << sum << std::endl;
</syntaxhighlight>
A ciklusokat használó programok rendszerint korllátozzák a ciklusok egymásba
ágyazhatóságának számát. Egyrészt a kiértékelések száma hatványozódik, ami
drámaian megnöveli a program futásidejét (kibírhatatlanul lassúvá válik).
Másrészt pedig a kiértékeléshez használt veremtár betelhet a sok átmeneti adattól,
ami pedig a program működését akadályozza meg (elszáll a program).
=== A végtelen ciklus ===
A végtelen ciklus olyan ciklus, melynek futása külső esemény bekövetkezte nélkül sohasem zárulna le.
189 ⟶ 260 sor:
Üresnek neveznek egy ciklust akkor, ha a magja egyszer sem fut le.
Ugró utasítással akkor lehetséges ciklust szervezni, ha az adott nyelv támogatja
a címkék elhelyezését, továbbá van olyan utasítás, amellyel egy már megadott
címkére lehet ugrani. Ez azt jelenti, hogy a program az adott címkétől folytatódik.
Használata kerülendő.
Az alábbi program egy ciklust valósít meg [[BASIC]]-ben a <code>GOTO</code> ugró utasítás segítségével.
213 ⟶ 289 sor:
{{DEFAULTSORT:Ciklus (programozas)}}
[[Kategória:Programozási alapfogalmak]]
|