|
Egy szép leírás ChuckNorristól sampforum.hu-ról
A ciklusok használata
Üdvözlök mindenkit,szeretném leirni nektek a ciklusok használatát ebben a kis leírásban.
Először is,bevezetőnek:
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 nem teljesül.
Kezdjük is el:
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ömbsé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ügvé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 elhagyuk 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(); //Ezel a fügvényel lekérjük a szerver maximum férőhelyét.Nem vesz fel paramétert.
SpawnPlayer(playerid); //Ezzel a fügvényel újra lespawnolhatunk egy játékost.Egyetlen paramértere 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,amejeket a ciklustörzsbe írtunk.Magyarul ha van egy 30 slotos 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,akkoris ha az adott azonosítojú játékos nincs csatlakozva.Ezt könyen 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ügvé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 étéke: %d",i);
Tehát,amíg az i értéke nem 10,addig lefut a ciklus.Talán egyeseknek feltünhetett valami,mégpedigaz,hogy ez a ciklus hibás.Mivel ez egy végtelen ciklus!Magyarázat:Nem modosítjuk megfelelő módon az i értékét,tehát soha nem lesz az értéke 10!
A for ciklusban ez autómatikus,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 nem 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,anyi különbséggel,hogy az itt leírt utasítások 1X-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 mejnek 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 nem teljesül.
Ha igen,a ciklus véget is ért.
A feltétel már teljesült,a cikus mégis lefutott egyszer.
//A gyakorlatban ne feletsü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 enyit a ciklusokról,ha valamit elírtam/nem jól fogalmaztam,hibáztam stb.
Akkor kérlek jelezzétek a topicban.
Ha eszembe jut még valami a ciklusokról,akkor aztis hozzáírom a leíráshoz.
Próbáltam egyszerűen leirni,hogy a kezdők is teljesen megértsék.
| |