Ciklai
Ciklai
Šis skyrius skirtas susipažinti su ciklais C++ programavimo kalboje.
Kas yra ciklas?
Kartais rašant programas norisi tam tikrus veiksmus kartoti daug kartų. Pavyzdžiui, galbūt norime nuskaityti dešimt vartotojo konsolėje įvestų skaičių. Vienas būdas tai padaryti būtų rašyti tokį kodą:
O kas jei tų skaičių norėtume nuskaityti šimtą? Turbūt akivaizdu, kad tokį kodą rašyti yra labai nepatogu, nors logika juk paprasta - pakartoti tą patį veiksmą dešimt (ar šimtą) kartų. Būtent tokiais atvejais galime panaudoti ciklus.
Ciklų rūšys
C++ programavimo kalba palaiko trijų rušių ciklus:
while
do...while
for
Apie kiekvieną iš jų pakalbėsime toliau.
while
ciklas
Ciklas while
naudojamas, kuomet norime kartoti tam tikrą kodą tol, kol tenkinama tam tikra sąlyga. Jo sintaksė yra tokia:
Pavyzdžiui, tarkime norime sužinoti, kiek kartų skaičius 1024 dalinasi iš dviejų. Tam nustatyti galėtume pabandyti 1024 dalinti iš dviejų iki tol, kol daugiau padalinti be liekanos nebeišeis. Kodas atrodytų taip:
Šis kodas išvestų skaičių 10
.
Taip pat while
ciklas naudingas, kuomet norime skaityti įvestį tol, kol ji pasibaigs. Tokiam atvejui rašomas toks ciklas:
Prie šio pavyzdžio derėtų pastebėti, kad, jei bandysite leisti programą pas save konsolėje, programa niekad nebaigs darbo, nes vis tikėsis įvesties. Tačiau šį kodą įkėlus į testavimo sistemą, viskas veiks gerai. Norint išbandyti tokį kodą lokaliai, reikėtų skaityti ne iš konsolės, o iš failo.
do...while
ciklas
do...while
ciklas yra lygiai toks pats, kaip ir while
ciklas, tik jame esantis kodas garantuotai bus įvykdytas nors vieną kartą, nes sąlyga tikrinama po kodo vykdymo. Sintaksė tokia:
Tarkime, kad norime nuskaityti iš konsolės skaičius iki kol bus ivestas nulis, bet bent vieną skaičių nuskaityti tikrai turime. Tada pagelbėtų toks kodas:
for
ciklas
for
ciklas dažniausiai naudojamas tada, kai iš anksto žinome, kiek kartų norime kartoti tam tikrą kodą. Šio ciklo sintaksė tokia:
Šį ciklą geriau paaiškinti konkrečiu pavyzdžiu. Tarkime, kad norime nuskaityti penkis skaičius iš konsolės ir išvesti jų sumą. Tai galima pasiekti tokiu kodu:
Panagrinėkime kodą:
int i = 0
nustato, kad ciklo kintamasis bus pavadintasi
ir jo pradinė reikšmė bus lygi nuliui.i < 5
reiškia, kad cikle esantis kodas bus vykdomas tol, koli
reikšmė bus mažesnė už 5. Ši sąlyga tikrinama kiekvieną kartą prieš vykdant ciklo kodą.i++
reiškia, kad kiekvieną kartą įvykdžius ciklo kodą, kintamojoi
reikšmė bus padidinama vienetu.
Taigi, kodas vyks taip:
- Sukuriamas kintamasis
i
su reikšme0
- Ar
i < 5
? Taip, todėl vykdome kodą. - Įvykdomas tarp riestinių skliaustų esantis kodas.
- Kintamojo
i
reikšmė padidinama vienetu (dabari = 1
). - Ar
i < 5
? Taip, todėl vykdome kodą. - Įvykdomas tarp riestinių skliaustų esantis kodas.
- Kintamojo
i
reikšmė padidinama vienetu (dabari = 2
). - …
- Kintamojo
i
reikšmė padidinama vienetu (dabari = 5
). - Ar
i < 5
? Ne, todėl cikle esantis kodas daugiau nebevykdomas.
Taigi iš viso kodas, esantis tarp riestinių skliaustų bus įvykdomas penkis kartus (kai i = 0
, kai i = 1
, kai i = 2
, kai i = 3
bei kai i = 4
).
Kurį ciklą pasirinkti?
Skirtingiems uždaviniams dažniausiai yra patogūs skirtingi ciklai, nors iš tikro bet kurį ciklą galima perrašyti kitu ciklu. Dažniausiai laikomasi tokių pasiūlymų:
- Jei iš anksto žinome, kiek kartų reikės kartoti ciklą, geriausia naudoti
for
ciklą. - Jei žinome, kad ciklo kodą būtinai reikia įvykdyti nors kartą, dažnai patogus yra
do...while
ciklas. - Beveik visais kitais atvejais patogiausias yra
while
ciklas.
Pavojai
Naudojant ciklus gali kilti ir tam tikrų pavojų. Konkrečiai šnekant, galima sukurti taip vadinamą amžinąjį ciklą - tokį ciklą, kuris niekada nesibaigs. Pavyzdžiui, šie du kodo gabaliukai sukuria amžinąjį ciklą, kuris “užlaužia” programą:
Tiek pirmame, tiek antrame cikluose niekada nebus įgyvendintos ciklo sąlygos, tad ciklai suksis amžinai. Dėl šios priežasties visada būtina atidžiai sužiūrėti savo kodą, kad nepaliktumėte tokių klaidų!
Programos vykdymo eiliškumo valdymas cikluose
Ciklų viduje galima naudoti du naujus raktažodžius - break
ir continue
. Jie skirti rankiniu būdu įsiterpti į ciklo vykdymą ir kažkiek pakeisti jo eiliškumą.
break
break
yra naudojamas, kai norima nutraukti ciklą prieš tikrinant jo sąlygą. Pavyzdžiui, tarkime turime tokį kodą:
Šis kodas bando dalinti kintamąjį x
iš dviejų tol, kol tokia dalyba yra įmanoma. Be to, dar laikomas kintamasis kiek
, kuris didėja vienetu su kiekvienu ciklo įvykdymu. Sakinys if (kiek > 5) { break; }
užtikrina, kad, jei kiek
viršys penkis, ciklas bus nutrauktas (net jei sąlyga x % 2 == 0
vis dar tenkinama). Taigi šiuo atveju, kodas spausdins 6
, nors iš tikro 1024
iš dviejų galima padalinti 10 kartų.
continue
continue
yra naudojamas, kai norima grįžti į ciklo pradžią dar nepabaigus vykdyti ciklo kodo. Pavyzdžiui, norime nuskaityti skaičius iš konsolės iki pirmo vieneto, ir tada skaičių 10 padalinti iš kiekvieno iš įvestų skaičių ir išvesti rezultatą. Kodas galėtų atrodyti taip:
Deja, šis kodas yra pavojingas dėl dalybos - juk vartotojas gali įvesti nulį, o bandant dalinti iš nulio nieko gero nebus! Tarkime, nusprendžiame nieko nespausdinti ir tiesiog toliau tęsti darbą, kai vartotojas įveda nulį. Čia gali padėti raktažodis continue
. Su juo kodas atrodytų taip:
Šiuo atveju prieš dalinant iš įvesto skaičiaus visų pirma patikriname, ar skaičius, iš kurio daliname (sk
) nėra lygus nuliui. Jei taip yra, grįžtame tiesiai į ciklo pradžią panaudoję raktažodį continue
. Taip padarę išvengsime dalybos iš nulio!