< eelmine | 3. nädala sisukord | järgmine > |
3.1 Tsükkel
KORDUV TEGEVUS
Kui püüda arvuti võimalikke plusse välja tuua, siis üheks oluliseks neist on kahtlemata võime mingeid tegevusi kiiresti ja korduvalt sooritada. Nii saab teha arvutusi, midagi andmetest otsida, erinevaid variante läbi vaadata jpm. Arvutid on läinud järjest kiiremaks ja nii saavad paljud asjad tehtud praktiliselt silmapilkselt. Samas on ülesandeid, mille lahendamiseks kulub ikkagi rohkem aega kui tahaks, isegi kui mitu arvutit korraga ülesannet lahendama panna. Näiteks ilmaennustus on selline keeruline ülesanne.
Kui tahta mingeid asju korduvalt teha, siis võivad ju programmid väga pikaks minna? Näiteks kui tahame, et programm väljastaks ekraanile viis korda üksteise alla "Tere!", siis kõlbaks selline programm.
print("Tere!") print("Tere!") print("Tere!") print("Tere!") print("Tere!")
Saja korra jaoks tuleks siis programm vastavalt pikem. Tegelikult on programmeerimiskeeltes olemas head võimalused selliste korduste lühemaks esituseks. Kõigepealt püütakse aru saada, mis on see korduv tegevus, mis päris samasugusena (või kindlate reeglite järgi muudetuna) tuleb ikka ja jälle teha. Eelmises näites oli selleks rida print("Tere!")
. Teise asjana tuleb läbi mõelda, mitu korda me tahame seda tegevust teha. See võib olla meil ette teada, aga võib sõltuda ka mingitest välistest asjaoludest, näiteks kasutaja poolt antud vastusest. Näiteks pole mõtet parooli uuesti küsida, kui juba õige on sisestatud.
WHILE-TSÜKKEL
Korduvaid tegevusi realiseeritakse tsüklite abil. Vastavaid vahendeid võib konkreetses programmeerimiskeeles olla mitmeid. Näiteks Pythonis on olemas while
-tsükkel ja for
-tsükkel. Meie alustame eelkontrolliga tsüklist, mille põhimõte on teatud mõttes sarnane valikulausega. Sellist tsüklit kutsutaksegi while
-tsükliks, sest reeglina on programmeerimiskeeltes just võtmesõna while
selles tähenduses kasutusel. Erinevus if
-lausest on selles, et pärast seda, kui tsükli sisus olevad laused on täidetud, minnakse uuesti tingimust kontrollima. Kui tingimus ikka veel kehtib, siis täidetakse sisu edasi jne. Kui mingil hetkel tingimust kontrollides see enam ei kehti, siis lõpetatakse tsükli täitmine. Tsükli sisus olevad laused peavad olema taandatud sarnaselt if
-lause kehas olevatele lausetele.
Eelkontrolliga tsükli plokkskeem näeb välja selline:
Tsükli jätkamistingimus on (nagu ka if
-lause tingimus) tõeväärtustüüpi. Kui tingimus on täidetud (tingimusavaldise väärtus on tõene), siis minnakse tsükli sisu täitma. Kui aga pole täidetud, siis minnakse tsüklist välja.
Tavaliselt on tingimus esitatud võrdlemisena, aga võib näiteks olla ka lihtsalt tõeväärtus True
. Või hoopis tõeväärtus False
. See viimane on küll üsna mõttetu: nii karm “piirivalvur”, et kunagi kedagi edasi ei lubata. Jätkamistingimuse True
puhul on tegemist lõpmatu tsükliga, sest tingimusavaldis on alati tõene. Teoreetiliselt jääbki see tsükkel igavesti tööle. Praktiliselt siiski ilmselt pannakse arvuti millalgi kinni, toimub elektrikatkestus vms. Kui me nüüd Pythonis meelega või kogemata sellise programmi teeme, mis igavesti tööle jääb, siis ei ole meil katkestamiseks siiski vaja arvutit kinni panna. Nimelt saame Thonnys programmi töö katkestada Stop-märgiga nupu või klahvikombinatsiooni Ctrl + F2 abil. (Keskkonnas IDLE katkestatakse programmi töö Ctrl + C abil.) Tegelikult saab lõpmatut tsüklit kasutada ka päris sihipäraselt sellises olukorras, kus tuleb näiteks mingit sündmust aktiivselt oodata. Sellisel juhul on tsüklist väljasaamine teisiti organiseeritud.
Ülesanne
Lähme tagasi algse ülesande juurde. Me tahaks, et tsükli abil viis korda "Tere!" ekraanile tuleks. Seega peab olema midagi, mis tsükli sisus muutub nii, et just pärast viiendat korda “piirivalvur” enam tsükli sisu juurde ei lubaks. Kuidas me inimlikult sellises olukorras loendaksime? Üks võimalus oleks näiteks sõrmedel lugeda ja nii meeles hoida, kui palju kordi juba tsükli sisu on täidetud. Põhimõtteliselt teeme sarnaselt ka programmeerides. Võtame kasutusele ühe muutuja, mille nimeks saagu i
. Olgu i
väärtus esialgu 0: i = 0
. Igal tsükli sammul liidame väärtusele 1
. Varem olid näited, kus muutujale saime erinevaid väärtusi anda mingite teiste muutujate või näiteks arvude ja tehete abil. Nüüd aga on vaja selle sama muutuja väärtust muuta. Saame seda teha sellise avaldisega
i = i + 1
Võimalik, et selline võimalus vajab natuke harjumist. Kui vaatame koolimatemaatikat, siis võib see paista üsna kummaline, aga võrdusmärgi tähendus on siin teistsugune kui matemaatikas. Vasak pool näitab, et muutuja i
saab uue väärtuse. Paremal pool on avaldis, millega see uus väärtus arvutatakse. Selles arvutamises kasutatakse ka muutuja i
senist väärtust. Enne programmi kokkupanekut mõtleme veel jätkamistingimusele. Selleks sobib i < 5
, sest kui i
on esialgu 0
ja igal sammul liidetakse 1
, siis just 5 sammuga jõuame niikaugele, et tingimus i < 5
ei ole enam täidetud. Panemegi nüüd programmi kokku. Olulisel kohal on taas koolon ja taandamine.
i = 0 while i < 5: print("Tere!") i = i + 1
On kokkulepe, et just i
ongi tavaliselt sellise loendaja (tsüklimuutuja) nimeks. Püüame nüüd programmi tööd analüüsida sammude kaupa.
- Jätkamistingimus (
i < 5
) on täidetud, kui esimest korda tsükli juurde jõuame, sest0 < 5
. - Pärast esmakordset sisu täitmist on
i
väärtus1
ja jätkamistingimus ikkagi täidetud, sest1 < 5
. - Pärast teist korda on
i
väärtus2
ja ikka saame jätkata, kuna2 < 5
. - Ja siis
i
on3
ja ikka3 < 5
. - Ja siis
i
on4
ja ikka4 < 5
. - Ja siis
i
on5
ja kontrollime, kasi < 5
? Kas5 < 5
? Ei ole, sest5
ja5
on võrdsed, seega võrratus5 < 5
ei kehti ja jätkamistingimus on väär.
Lisame tsükli kehasse ühe rea, mis i
väärtuse ekraanile tooks, siis saame seda paremini jälgida.
i = 0 while i < 5: print("Tere!") i = i + 1 print(i)
Pange programm tööle.
Kui me programmi alles teeme, siis on mingites kohtades muutujate väärtuste väljastamine täiesti omal kohal, et olla kursis, mis seis vastaval hetkel on. Thonnys on muutuja väärtuste jälgimine sisse ehitatud ja seda saab nähtavale tuua View-menüüst valikuga Variables. Kuna programm töötab kiiresti, siis tavaliselt käivitades jäävad näha ainult programmi töö lõpus kehtivad väärtused. Selleks, et sammsammult programmi tööst ülevaadet saada, tuleb käivitada hoopis silumisrežiimis - putukaga nupuga või Run-menüüst Debug current script. Seejärel saab erineva ulatusega samme teha vastavate nuppude või Run-menüü valikute abil.
Kokkuvõttev video:
Kuna muutuja väärtuse muutmist eelmise väärtuse alusel tuleb päris sagedasti ette, siis on selleks ka lühemad variandid olemas. Näiteks a = a + 3
asemel võime kirjutada a += 3
. Samasugused variandid on ka lahutamise (-=
), korrutamise (*=
), jagamise (/=
), täisarvulise jagamise (//=
), jäägi leidmise (%=
) ja astendamise (**=
) jaoks.
Ülesanne
Ülesanne
Ülesanne
Ülesanne
Ülesanne
< eelmine | 3. nädala sisukord | järgmine > |