Üdvözlök mindenkit, szeretném leírni nektek a ciklusok használatát ebben a kis leírásban.
Ciklust akkor használunk, ha ugyanazt a feladatot többször kell elvégezni egymás után.
Háromféle ciklus létezik. Ezeket egyenként fogom bemutatni példákkal.
2 nagyobb fajta ciklus van : elöltesztelõs (for,while) és hátultesztelõs (do-while) ciklus.
A program az elöltesztelõs ciklusba csak akkor lép be, ha a feltétel teljesül. A feltétel a ciklus elején található.
A hátultesztelõs ciklus használatakor a program mindenképpen belép a programba és mindaddig ismétli, amíg a feltétel teljesül.
A for ciklus
Ez a legegyszerûbb és a leggyakrabban használt ciklus,és szerintem ezt mindenkinek ismernie kell.
Ez egy elöltesztelõs ciklus.
Nézzük a ciklus felépítését.
for(ciklusváltozó;ciklusfeltétel;posztfix) //vagy prefix
i++ = posztfix
++i = prefix
Különbség: ebben a konkrét példában( for ciklus ) ugyan nincs, de a prefixes alak használatánál a léptetés mûvelet feldolgozása elõtt lejátszódik, így a változó már az új értékkel vesz részt a folyamatban.
new x, y = 5;
x = ++y;
//Az x, és az y értéke is 6 lesz
new x, y = 5;
x = y++;
//Az x értéke 5, az y értéke 6 lesz
//Észrevételt köszönöm Fade-nak,szép megfogalmazást ZeRo-nak.
Példa:
for(new i = 0;i < 10;i++) // Vagy ++i
{
//Ez a ciklustörzs,ide jönnek a feladatok.
printf(\"Az i értéke %d\",i); // A printf függvényel írunk a konzolba.
}
Ez egy nagyon egyszerû kis kód,ami azt eredményezné,hogy addig írjuk ki az i változót a konzolba,ameddig annak értéke kisebb mint 10.Tehát,a ciklus addig fut le amíg a változónk értéke kisebb mint 10.
Mindig azok az utasítások hajtódnak végre,amik a ciklustörzsben vannak.
Ez akkor hasznos a gyakorlatban,hogyha pl. végig akarunk menni az összes játékoson,akik a szerveren tartózkodnak.NEM csak erre lehet használni!
/* Érdekesség:
Egyes paraméterek elhagyhatók,de a pontosvesszõt ( ; ) mindig ki kell rakni!
Példa:
for(;ciklusfeltétel;értékváltoztatás)
Itt elhagyjuk a ciklusváltozót,a ciklus viszont így is mûködik!
*/
Példa a gyakorlatra:
for(new i = 0;i < GetMaxPlayers();i++)
{
SpawnPlayer(i); // Újraspawnoljuk az i-azonosítójú játékost.
}
Ez a példa a gyakorlatban lespawnolja a összes játékost.
Magyarázat:
GetMaxPlayers(); //Ezzel a függvénnyel lekérjük a szerver maximum férõhelyét.Nem vesz fel paramétert.
SpawnPlayer(playerid); //Ezzel a függvénnyel újra lespawnolhatunk egy játékost.Egyetlen paramétere a játékos azonosítója.
A többi szerintem érthetõ,amíg az i értéke kisebb mint GetMaxPlayers(); visszatérési értéke (Pl. 30,vagy 50 stb...),Addig 1 el növeljük és végrehajtjuk a feladatokat,amelyeket a ciklustörzsbe írtunk.Magyarul ha van egy 30 férõhelyes szerverünk,akkor ez a ciklus végigmegy mind a 30-játékoson,és újraspawnolja õket.A ciklus viszont mindenképp lefut 30-szor, akkor is ha az adott azonosítójú játékos nincs csatlakozva.Ezt könnyen megelõzhetjük.
for(new i = 0;i < GetMaxPlayers();i++)
{
// Spawn elõtt ellenõrizzük,hogy a játékos csatlakozva van-e.
if(IsPlayerConnected(i)) SpawnPlayer(i);
}
Így a SpawnPlayer függvény nem fut le ha a játékos nincs csatlakozva.
A while ciklus
Ez a ciklus nagyon hasonlít a feltételes utasításhoz (if).
Ez egy elöltesztelõs ciklus.
if(feltétel)
while(feltétel)
Legalábbis a szerkezete,ugyanis a feltételes utasítás nem fut le ha a feltétel nem teljesül.
A while ciklus ponthogy fut mindaddig,amíg a feltétel teljesül.
Példa:
new i = 0;
while(i != 10) printf(\"i értéke: %d\",i);
Tehát,amíg az i értéke nem 10,addig lefut a ciklus.Talán egyeseknek feltûnhetett valami,még pedig az, hogy ez a ciklus hibás. Mivel ez egy végtelen ciklus!Magyarázat:Nem módosítjuk megfelelõ módon az i értékét,tehát soha nem lesz az értéke 10!
A for ciklusban ez automatikus,itt magunknak kell figyelnünk rá!
new i = 0;
while(i != 10) printf(\"i étéke: %d\",i),i++;
Na ez a ciklus a céljának megfelelõen mûködik,lefut 10 szer.
Összefoglalva,ez a ciklus addig fut le amíg a feltétel teljesül.
Gyakorlatban,mondjuk fájlok olvasásánál használjuk,de ezzel is megoldható a for ciklusnál használt kis spawn kód.
new i = 0;
while(i != GetMaxPlayers())
{
if(IsPlayerConnected(i)) SpawnPlayer(i);
i++;
}
A do-while ciklus
Ez a ciklus ugyanúgy mûködik mint a while ciklus,annyi különbséggel,hogy az itt leírt utasítások
egyszer mindenképp lefutnak, ha teljesül a feltétel,ha nem.
Ez egy hátultesztelõs ciklus.
Szerkezet:
new i = 1;
do
{
printf(\"i értéke %d\",i);
} while(i != 1)
Ez egy egyszerû példa,létrehozunk egy i változót melynek kezdõértéke 1.
Lefut a ciklus,majd ellenõrizzük hogy az i egyenlõ e 1-el.Ha nem,a ciklus újra lefut,amíg a feltétel teljesül.
Ha igen,a ciklus véget is ért.
A feltétel már teljesült,a ciklus mégis lefutott egyszer.
//A gyakorlatban ne felejtsük el megváltoztatni a megfelelõ módon az i-értékét,vagy végtelen ciklust kapunk.
Nézzük csak a spawnolós kódunkat.
new i = 0;
do
{
if(IsPlayerConnected(i)) SpawnPlayer(i);
i++;
} while(i != GetMaxPlayers())
Utószó
Egyenlõre ennyit a ciklusokról,ha valamit elírtam/nem jól fogalmaztam,hibáztam stb.
Akkor kérlek jelezzétek a témában.
Ha eszembe jut még valami a ciklusokról,akkor az tis hozzáírom a leíráshoz.
Próbáltam egyszerûen leírni,hogy a kezdõk is teljesen megértsék.
« Utoljára szerkesztve: 2011. március 10. - 14:59:21 írta staR »
Naplózva