Materjalid koostas ja kursuse viib läbi
Tartu Ülikooli arvutiteaduse instituudi programmeerimise õpetamise töörühm
< eelmine | 3. nädala sisukord | järgmine > |
3.2 Tsükkel. Igal sammul juhtub midagi
Eelmisel nädalal tutvusime kilpkonnagraafikaga ja tegime näiteprogrammina ruudu.
Näiteprogramm. Ruut
from turtle import * # * lisamisel imporditakse kõik kilpkonna käsud forward(100) # Kilpkonn liigub edasi 100 pikslit left(90) # Kilpkonn pöörab 90° vasakule forward(100) # Kordame eelnevaid käske, sest ruudul on neli külge left(90) forward(100) left(90) forward(100) exitonclick() # Saame akna sulgeda hiireklõpsuga
On näha, et kilpkonn peab täitma korduvalt samu käske: minema 100 pikslit edasi ja pöörama seejärel 90° vasakule. Tegemist on tsüklilise tegevusega, seega saame kasutada tsüklit.
Kirjutame programmi ümber nii, et ruut joonistatakse while
-tsüklit rakendades.
Näiteprogramm. Ruut II
from turtle import * i = 0 # Muutuja i väärtus on esialgu 0 while i < 4: # Kilpkonn joonistab tsükli abil ruudu. Tsükli keha läbitakse neli korda. forward(100) left(90) i = i + 1 # Muutuja i väärtust suurendatakse ühe võrra exitonclick()
Pange see programm tööle ja püüdke seda modifitseerida nii, et joonistataks hoopis võrdkülgne kolmnurk. Mis sellisel juhul on ruudust erinev? Külgi on kolm ja pöörama peab ... proovige ise!
IGAL SAMMUL JUHTUB MIDAGI
Nagu juba eelmiste näidete puhul oli näha, juhtub igal sammul midagi. Võib juhtuda samu asju, võib natuke erinevaid asju juhtuda. Näiteks "Tere!" väljastamisel juhtus see nii igal sammul. Samuti liikus kilpkonn igal tsüklisammul 100 pikslit edasi ja pööras 90 kraadi vasakule.
Kui tsüklis oli aga käsk print(i)
, siis igal sammul toimus väljastamine, aga tsüklimuutuja i
väärtus oli eri sammudel erinev. Tsüklimuutuja väärtuse muutumine tagati reaga i = i + 1
.
Modifitseerime ruudu joonistamise programmi nii, et igal sammul tehtav sõltuks ka tsüklimuutuja i
tolle hetke väärtusest. Asendame rea forward(100)
reaga forward(100 * i)
. Pange programm tööle ja proovige toimunut seletada:
from turtle import * i = 0 # Muutuja i väärtus on esialgu 0 while i < 4: # Tsükli keha läbitakse neli korda. forward(100 * i) left(90) i = i + 1 # Muutuja i väärtust suurendatakse ühe võrra exitonclick()
Muutke programmis tsükli sammude arvu. Selleks tuleb tingimuses i < 4
arv 4
asendada suurema või väiksema arvuga. Samuti võib 100
piksli asemel kasutada mõnda väiksemat arvu, et tulemus paremini nähtav oleks.
Tsükli kehas ei pruugi alati midagi silmnähtavat juhtuda. Näiteks võidakse hoopis mingeid asju "meelde jätta" ja pärast tsüklit kasutada. Nii on järgmises programmis võetud kasutusele muutuja summa
, millesse hakatakse "koguma" summat.
i = 0 summa = 0 while i < 5: summa = summa + i i = i + 1 print(summa)
Ülesanne
Ülesanne
PIKEM SAMM! VÕI HOOPIS LÜHEM?
Eelmistes näidetes on tsüklimuutuja muutunud iga sammuga ühe võrra. See on küll kõige sagedasem variant, kuid kaugeltki mitte ainus. Põhimõtteliselt saame tsüklimuutujat muuta ükskõik millise lubatud tehtega. Proovige näiteks nii.
i = 0 while i < 5: i = i + 2 print(i)
Samm võib ka hoopis lühem olla: i = i + 0.5
. Või näiteks võib igal sammul i
väärtus kolm korda kasvada: i = i * 3
. Korrutamise puhul peab aga hoiduma esialgsest väärtusest 0
, sest korrutamine seda ei muuda.
Teeme programmi, mis väljastab ekraanile 1, 3, 9, 27 ... . Näeme, et iga eelmine tulemus korrutatakse järgmise saamiseks kolmega. Kasutajalt küsitakse näiteks, millisest arvust peab tulemus väiksemaks jääma:
piir = int(input("Millisest arvust väiksemaks peab tulemus jääma? ")) tulemus = 1 while tulemus < piir: print(tulemus) tulemus = tulemus * 3
Nagu näeme, on siin oluliseks muutujaks tulemus
ise. Selleks, et lugeda, mitmendal sammul me oleme (mitmendat tulemust oleme väljastamas) ja näiteks hoopis tulemuste arvu piirata, peab kasutusel olema teine muutuja.
piir = int(input("Millisest arvust väiksemaks peab tulemus jääma? ")) tulemus = 1 jrk = 0 while tulemus < piir: print(str(jrk) + ". rida on " + str(tulemus)) tulemus = tulemus * 3 jrk = jrk + 1
Kui nüüd tahta, et arvutataks ainult näiteks 6 järjestikust tulemust, peaks vastava tingimuse asendama: while tulemus < piir
asemel while jrk < 6
.
< eelmine | 3. nädala sisukord | järgmine > |