[6 Pamoka] Ciklai

Šiame forume galima rasti pamokas, patarimus, skriptus ir kitą naudingą informciją.
Post Reply
User avatar
aaarnas
Vyr. diskusijų administratorius
Posts: 3891
Joined: 2010 Aug 31 13:21
Skype: fiarno
Contact:

[6 Pamoka] Ciklai

Post by aaarnas »

Ciklai programavime naudojami atlikti kažkokį algoritmą tiek kartų, kiek nustatyta, arba kol sąlyga teisinga. Viskas atliekama akimirksniu, be jokio uždelsimo, dėl to dažniausiai tai naudojama skaičiavimams arba atlikti kažką tokio kelis kartus.

while ciklas

While ciklas kartoja nurodytą algoritmą tol kol jam pateikta sąlyga yra teisinga. Kai tik sąlyga tampa neteisinga, ciklas iš karto sustabdomas ir daugiau nebekartojamas.
Svarbu: sąlyga tikrinama, tik tada, kai įvykdomas visas skliausteliuose ( { } ) nurodytas algoritmas.

Code: Select all

new numwhile(num != 100) {num = random_num(1, 100)}
Čia mes pateikiame tokią sąlygą - num != 100 (kintamasis num nelygus 100). Vadinasi while ciklas kartos tarp laužtinių skliaustų ( { } ) esantį algoritmą, kol kintamasis num taps 100 ir sąlyga bus nebeteisinga. Tada ciklas sustos ir kompiuteris keliaus prie tolimesnių savo darbų.

Galimas pavyzdžiui ir toks variantas:

Code: Select all

new numwhile(num < 150) {num++}
Čia sąlygoje tikriname ar num yra mažiau už 150. Kadangi yra mažiau, tai vykdo ciklą, kuriame prie num pridedama 1. Tada vėl tikrinama sąlyga ir kadangi 1 yra vis dar mažiau už 150, tai taip vykdoma, kol num tampa 150 ir sąlyga tampa nebeteisinga.

do ciklas

Tai yra tas pats kaip ir while ciklas. Jis panaudojamas labai retai. Esminis skirtumas nuo while ciklo yra tas, kad čia pirma įvykdomas algoritmas ir tik tada tikrinama sąlyga ir jei sąlyga teisinga, bus kartojama antrą kartą. Tad su šiuo ciklu turint neteisingą sąlygą, algoritmas bus atliktas mažiausiai vieną kartą.

Code: Select all

new numdo {num++}while(num<100)
Pirma vykdoma kas yra po do (prie num pridedama 1) ir tada tikrinama ar num yra mažesnis už 100.

for ciklas

For ciklas taip pat turi sąlygą, kaip ir while, bet jis turi dar vieną papildomą funkciją - jis kas kart prie pasirinkto kintamojo prideda po 1.

Code: Select all

new i, skfor(i=1; i<100; i++) {sk++}
Atliekami tokie veiksmai:
1. i priskiriama reikšmė 1.
2. Tikrina, ar i<100.
3. Jei sąlyga teisinga, vykdo algoritmą esantį tarp skliaustelių ( { } ).
4. Prie i prideda 1 (i++).
5. Tikrina ar sąlyga teisinga. Jei taip, vėl leidžia algoritmą.
6. Prie i prideda 1(i++).
...

Ir taip vyksta tol, kol i tampa 100 ir sąlyga tampa nebeteisinga. Pagal šį pavyzdį patikrinę sk reikšmę po ciklo, pamatytume, kad jame yra skaičius 100. Vadinasi ciklas įvyko 100 kartų.

For ciklas dažniausiai naudojamas skaičiavimams, kur reikia patikrinti visus elementus iš eilės. Labai geras pavyzdys būtų masyvas:

Code: Select all

new masyvas[33], ifor(i=0; i<sizeof(masyvas); i++) {masyvas[i] = i}
Čia i reikšmė nustatome į 0, nes masyvų elementai pawn kalboje pradedami skaičiuoti nuo 0. Įvykdžius šį ciklą, masyve bus tokios reikšmės:
masyvas[0] = 0
masyvas[1] = 1
masyvas[2] = 2
....
ir taip iki pat masyvo pabaigos (32).

Pastaba: jei for cikle, prieš pradedant, i reikšmė bus 100, viskas teiks, nes ciklas pradėdamas veikti, pats nustato į reikšmę į nurodytą. Kitaip yra su while ciklu. Jis turi tik sąlygą, tai jei sąlygą jau per patį pirmą patikrinimą bus neteisinga, tai ciklas nė karto ir neįvyks.

break ir continue

Taip pat cikluose galima naudoti 2 komandas, kurios nulemia ciklo baigtį.

continue - iškvietus, vykdomas algoritmas nutraukiamas iš karto toje vietoje, kur parašytas žodis continue ir pereinama prie sąlygos tikrinimo.

Code: Select all

new masyvas[33], ifor(i=0; i<sizeof(masyvas); i++) {if(i==5) continuemasyvas[i] = i}
Čia, kaip jau aiškinomės, į masyvą įrašome skaičius. Tik čia yra if sąlyga, kuri tikrina ar i yra lygus skaičiui 5. Kai i tampa 5, iškviečiamas continue ir ciklui nurodoma pereiti prie sekančio veiksmo ignoruojant ką dar liko įvykdyti. Vadinasi į šeštą (atminkime, kad masyve skaičiuojama nuo 0, o ne 1) masyvo elementą skaičius nebus įrašytas.

break - visiškai sustabdo vykstantį ciklą.

Code: Select all

new numfor(;;) {if(random_num(1, 100) == 20) break}
Pagal šį pavyzdį sukuriamas amžinas ciklas (tai reiškia, kad šis ciklas bus vykdomas amžinai, kol jo kas nors nenutrauks. Jo sąlyga visada bus teisinga, bet counter-strike programavime geriau venkime tokių dalykų, nes susidaręs amžinas masyvas užstabdo serverį ir sunaudoja 100% cpu, ko pasekoje sutrinka serverio darbas). Nuolatos gauname kažkokį naują skaičių su random funkcija, ir kai pataikoma į skaičių 20, if sąlyga tampa teisinga ir paleidžiamas break ir ciklas sustabdomas. Jei dar būtų kažkas tokio po break, tai nebūtų iškviečiama.
for(;;) yra lygiai tas pats kaip i r while(true), tiesiog jei rašysite while(true), kompiliatorius rodys klaidą, dėl to amžinas ciklas pawn kalboje kuriamas su for(;;).

Šis gidas priklauso Amxmodx.lt forumui.
Bet koks šios informacijos platinimas be autoriaus sutikimo yra griežtai draudžiamas.
Palikau CS pasaulį ;/ . Nebepasiekiamas.

Post Reply

Who is online

Users browsing this forum: No registered users and 7 guests