|
Egy szp lers ChuckNorristl sampforum.hu-rl
A ciklusok hasznlata
dvzlk mindenkit,szeretnm leirni nektek a ciklusok hasznlatt ebben a kis lersban.
Elszr is,bevezetnek:
Ciklust akkor hasznlunk, ha ugyanazt a feladatot tbbszr kell elvgezni egyms utn.
Hromfle ciklus ltezik.Ezeket egyenknt fogom bemutatni pldkkal.
2 nagyobb fajta ciklus van : elltesztels (for,while) s htultesztels (do-while) ciklus.
A program az elltesztels ciklusba csak akkor lp be, ha a felttel teljesl. A felttel a ciklus elejn tallhat.
A htultesztels ciklus hasznlatakor a program mindenkppen belp a programba s mindaddig ismtli, amg a felttel nem teljesl.
Kezdjk is el:
A for ciklus
Ez a legegyszerbb s a leggyakrabban hasznlt ciklus,s szerintem ezt mindenkinek ismernie kell.
Ez egy elltesztels ciklus.
Nzzk a ciklus felptst.
for(ciklusvltoz;ciklusfelttel;posztfix) //vagy prefix
i++ = posztfix
++i = prefix
Klmbsg: ebben a konkrt pldban( for ciklus ) ugyan nincs, de a prefixes alak hasznlatnl a lptets mvelet feldolgozsa eltt lejtszdik, gy a vltoz mr az j rtkkel vesz rszt a folyamatban.
new x, y = 5;
x = ++y;
//Az x, s az y rtke is 6 lesz
new x, y = 5;
x = y++;
//Az x rtke 5, az y rtke 6 lesz
//szrevtelt ksznm Fade-nak,szp megfogalmazst ZeRo-nak.
Plda:
for(new i = 0;i < 10;i++) // Vagy ++i
{
//Ez a ciklustrzs,ide jnnek a feladatok.
printf("Az i rtke %d",i); // A printf fgvnyel runk a konzolba.
}
Ez egy nagyon egyszer kis kd,ami azt eredmnyezn,hogy addig rjuk ki az i vltozt a konzolba,ameddig annak rtke kisebb mint 10.Teht,a ciklus addig fut le amg a vltoznk rtke kisebb mint 10.
Mindig azok az utastsok hajtdnak vgre,amik a ciklustrzsben vannak.
Ez akkor hasznos a gyakorlatban,hogyha pl. vgig akarunk menni az sszes jtkoson,akik a szerveren tartzkodnak.NEM csak erre lehet hasznlni!
/* rdekessg:
Egyes paramterek elhagyhatk,de a pontosvesszt ( ; ) mindig ki kell rakni!
Plda:
for(;ciklusfelttel;rtkvltoztats)
Itt elhagyuk a ciklusvltozt,a ciklus viszont gy is mkdik!
*/
Plda a gyakorlatra:
for(new i = 0;i < GetMaxPlayers();i++)
{
SpawnPlayer(i); // jraspawnoljuk az i-azonostj jtkost.
}
Ez a plda a gyakorlatban lespawnolja a sszes jtkost.
Magyarzat:
GetMaxPlayers(); //Ezel a fgvnyel lekrjk a szerver maximum frhelyt.Nem vesz fel paramtert.
SpawnPlayer(playerid); //Ezzel a fgvnyel jra lespawnolhatunk egy jtkost.Egyetlen paramrtere a jtkos azonostja.
A tbbi szerintem rthet,amg az i rtke kisebb mint GetMaxPlayers(); visszatrsi rtke (Pl. 30,vagy 50 stb...),Addig 1 el nveljk s vgrehajtjuk a feladatokat,amejeket a ciklustrzsbe rtunk.Magyarul ha van egy 30 slotos szervernk,akkor ez a ciklus vgigmegy mind a 30-jtkoson,s jraspawnolja ket.A ciklus viszont mindenkpp lefut 30-szor,akkoris ha az adott azonostoj jtkos nincs csatlakozva.Ezt knyen megelzhetjk.
for(new i = 0;i < GetMaxPlayers();i++)
{
// Spawn eltt ellenrizzk,hogy a jtkos csatlakozva van-e.
if(IsPlayerConnected(i)) SpawnPlayer(i);
}
gy a SpawnPlayer fgvny nem fut le ha a jtkos nincs csatlakozva.
A while ciklus
Ez a ciklus nagyon hasonlt a feltteles utastshoz (if).
Ez egy elltesztels ciklus.
if(felttel)
while(felttel)
Legalbbis a szerkezete,ugyanis a feltteles utasts nem fut le ha a felttel nem teljesl.
A while ciklus ponthogy fut mindaddig,amg a felttel teljesl.
Plda:
new i = 0;
while(i != 10) printf("i tke: %d",i);
Teht,amg az i rtke nem 10,addig lefut a ciklus.Taln egyeseknek feltnhetett valami,mgpedigaz,hogy ez a ciklus hibs.Mivel ez egy vgtelen ciklus!Magyarzat:Nem modostjuk megfelel mdon az i rtkt,teht soha nem lesz az rtke 10!
A for ciklusban ez autmatikus,itt magunknak kell figyelnnk r!
new i = 0;
while(i != 10) printf("i tke: %d",i),i++;
Na ez a ciklus a cljnak megfelelen mkdik,lefut 10 szer.
sszefoglalva,ez a ciklus addig fut le amg a felttel nem teljesl.
Gyakorlatban,mondjuk fjlok olvassnl hasznljuk,de ezzel is megoldhat a for ciklusnl hasznlt kis spawn kd.
new i = 0;
while(i != GetMaxPlayers())
{
if(IsPlayerConnected(i)) SpawnPlayer(i);
i++;
}
A do-while ciklus
Ez a ciklus ugyangy mkdik mint a while ciklus,anyi klnbsggel,hogy az itt lert utastsok 1X-mindenkpp lefutnak,ha teljesl a felttel,ha nem.
Ez egy htultesztels ciklus.
Szerkezet:
new i = 1;
do
{
printf("i rtke %d",i);
} while(i != 1)
Ez egy egyszer plda,ltrehozunk egy i vltozt mejnek kezdrtke 1.
Lefut a ciklus,majd ellenrizzk hogy az i egyenl e 1-el.Ha nem,a ciklus jra lefut,amg a felttel nem teljesl.
Ha igen,a ciklus vget is rt.
A felttel mr teljeslt,a cikus mgis lefutott egyszer.
//A gyakorlatban ne feletsk el megvltoztatni a megfelel mdon az i-rtkt,vagy vgtelen ciklust kapunk.
Nzzk csak a spawnols kdunkat.
new i = 0;
do
{
if(IsPlayerConnected(i)) SpawnPlayer(i);
i++;
} while(i != GetMaxPlayers())
Utsz
Egyenlre enyit a ciklusokrl,ha valamit elrtam/nem jl fogalmaztam,hibztam stb.
Akkor krlek jelezztek a topicban.
Ha eszembe jut mg valami a ciklusokrl,akkor aztis hozzrom a lershoz.
Prbltam egyszeren leirni,hogy a kezdk is teljesen megrtsk.
| |