Elsszenciális programozás | Vezérlési struktúrák
Hurok
A “ciklus utasítások” nem mások, mint a többlépéses folyamatok automatizálása műveletsorozatok szervezésével és az ismétlésre szoruló részek csoportosításával. Szintén a programozás központi része, az iteráció (vagy Looping) adja a számítógépek teljesítményének nagy részét. Egy lépéssorozatot annyiszor tudnak megismételni, ahányszor csak szükséges, és az egyszerű lépések megfelelő ismétlésével összetett problémákat is meg lehet oldani.
Általánosságban kétféle “Looping technikát” különböztetünk meg:
- “For Loops”: azok, amelyek egy számláló vagy egy index által vezérelve meghatározott számú alkalommal hajtódnak végre.
- “While Loops” és “Repeat Loops”: egy logikai feltétel bekövetkeztén és ellenőrzésén alapulnak. A feltétel vizsgálata a cikluskonstrukció kezdetén vagy végén történik.
Vessünk rájuk egy pillantást:
1) For ciklusok
Ezekben a vezérlési struktúrákban az utasítások egymás után, egymást követő sorrendben hajtódnak végre egy értéksorozaton, amely csak a “For ciklus” indításakor kerül kiértékelésre (soha nem értékelődik újra). Ebben az esetben az iterációk száma rögzített és előre ismert.
Ha egy változóra (amely egy meghatározott sorozaton belüli értékeket vehet fel) vonatkozó feltétel kiértékelése TRUE eredményt ad, akkor egy vagy több utasítás egymás után végrehajtásra kerül az adott értéksorozaton. Amint az első feltételvizsgálat megtörtént (és eredménye TRUE), az utasítás végrehajtásra kerül, és a feltétel kiértékelése ismét megtörténik, egy iteratív folyamaton keresztül. A “változó a sorozatban” rész ezt a tesztet a sorozat minden egyes értékén elvégzi, amíg az utolsó elemre nem terjed ki.
Ha a feltétel nem teljesül, és az eredmény FALSE (pl. a “változó a sorozatban” rész befejezte a sorozat összes elemének végigjárását), a ciklus véget ér. Ha a feltételvizsgálat eredménye az első iterációban FALSE, a “For Loop” soha nem kerül végrehajtásra.
A “For ciklusok” szintaxisa a következő:
Példa 1
A “For ciklusok” működésének bemutatásához először létrehozunk egy sorozatot, különböző gyümölcsnevek összekapcsolásával egy (“gyümölcs_lista” nevű) lista létrehozásához:
Ezt a gyümölcslistát fogjuk használni “szekvenciaként” egy “For Loop”-ban, és a “For Loop”-ban a szekvencia minden megadott értékére (a gyümölcslistában szereplő különböző gyümölcsök) egyszer lefuttatunk egy utasítást (minden érték nevét kiírjuk):
Így a “For Loop” eredménye a következő:
## "Apple"
## "Kiwi"
## "Orange"
## "Banana"
OK, tehát a listában szereplő minden egyes érték nevét kiírtuk. Nem nagy dolog, igaz? A jó dolog az, hogy a “For hurkok” segítségével még érdekesebb eredményeket lehet elérni. Nézzük meg a következő példát:
Példa 2
Mi van akkor, ha értékeket akarunk módosítani, vagy számításokat akarunk egymás után végrehajtani? A “For ciklusok” segítségével matematikai műveleteket végezhetünk szekvenciálisan egy vektor minden egyes értékén (azonos típusú elemek, ami ebben az esetben numerikus lesz).
Ebben a példában létrehozunk egy számsorozatot (1-től 10-ig), és beállítunk egy “For Loop”-ot, hogy kiszámítsa és kiírja a sorozat minden egyes értékének négyzetgyökét:
A “megszakító feltétel” akkor lép működésbe, amikor a változó (x) eléri a 10-et, és a ciklus véget ér.
Kimenet
5
6
7
8
9
2. példa
Most tegyük fel, hogy véletlen számok listáját állítjuk elő, amelyeknek nem ismerjük a generálás sorrendjét vagy sorrendjét.
Ebben a példában egy “ismétlődési hurok” segítségével normális eloszlású véletlen számok sorozatát generáljuk (bármilyen más eloszlással is generálhatunk véletleneket, mi csak ezt választottuk), és a sorozatot megszakítjuk, amint az egyik szám nagyobb lesz 1-nél. Mivel nem tudjuk, hogy melyik számok jönnek először, nem tudjuk, hogy milyen hosszú lesz a sorozat: csak a megszakítási feltételt ismerjük.
Először is a “set.seed” utasítással rögzítjük a véletlenszámokat (mindig ugyanazokat a véletlenszámokat generáljuk), és reprodukálhatóvá tesszük ezt a példát.
Ezután elindítjuk az “Ismétlődési hurkot” egy normális eloszlású véletlen szám generálásával, kinyomtatjuk, és ellenőrizzük, hogy ez a szám nagyobb-e, mint 1. Csak ha ez a feltétel IGAZ lesz (lehet az első generált számmal, vagy nem), a ciklusciklus átmegy a break utasításhoz és véget ér.
Kimenet
-0.9619334
-0.2925257
0.2587882
-1.152132
0.1957828
0.03012394
0.08541773
1.11661
Ez ismét megmutatja a megfelelő megszakítási feltétel beállításának fontosságát. Ennek elmulasztása végtelen ciklushoz vezet.
Végső gondolatok
A fogalmakat elszigetelten láttuk és magyaráztuk, de a “vezérlési struktúrák” tetszés szerint kombinálhatók: A hurok tartalmazhat több belső hurkot; a feltételes szerkezetek tartalmazhatnak hurkokat és feltételes szerkezeteket, a lehetőségek végtelenek. (valójában az “Ismétlődő hurkok” áttekintésekor azt találtuk, hogy a példák egymásba ágyazott “If utasításokat” tartalmaztak).
Elég fejlett megoldásokat fejleszthetsz ki pusztán a “Vezérlési struktúrák” kombinálásával, amelyeket ebben a cikkben elmagyaráztunk. Ahogy Minsky is megállapította, egyszerűbb összetevők kölcsönhatásának eredményeként érhetünk el összetett eredményeket. A Vezérlőszerkezetek alkotják a számítástechnikai döntéshozatali folyamatok alapblokkjait. Megváltoztatják a programok áramlását, és lehetővé teszik számunkra, hogy egyszerűbb építőelemekből összetett utasításkészleteket építsünk fel.
Azt tanácsolom: ismerje meg őket.
Ez megkönnyíti a kódoláshoz és a programok megértéséhez vezető utat, és segít abban, hogy új utakat találjon a problémák megoldására.