Arvutiteaduse instituut
  1. Kursused
  2. 2020/21 kevad
  3. Programmeerimise alused (MTAT.03.236)
EN
Logi sisse

Programmeerimise alused 2020/21 kevad

  • Pealeht
  • Loengud
  • Moodle
  • Thonny paigaldamine
  • Thonny logide esitamine
  • Kiireksamist
  • Viited
< eelmine3. nädala sisukordjärgmine >

3.2 Tsükkel. Igal sammul juhtub midagi

KILPKONN TSÜKLIS

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.


< eelmine3. nädala sisukordjärgmine >
  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Tartu Ülikooli arvutiteaduse instituudi kursuste läbiviimist toetavad järgmised programmid:
euroopa sotsiaalfondi logo it akadeemia logo