Materjalid koostas ja kursuse viib läbi
Tartu Ülikooli arvutiteaduse instituudi informaatika didaktika töörühm
< eelmine | 3. OSA sisukord | järgmine > |
3.2 Veel valikulauseid
VALIKULAUSE VALIKULAUSE SEES
Valikulausete puhul on kesksel kohal tingimus, mille kehtimisest sõltub, millise haruga edasi minnakse. Tingimus esitatakse tõeväärtustüüpi avaldisena, näiteks sisestatud_pin == "1234"
. Avaldis võib olla ka märksa keerulisem. Mõningaid selliseid vaatame käesoleva osa teises pooles.
Praegu aga jätkame varasemat programmi, kus küsitakse PIN-koodi ja õige koodi korral "sisenetakse" pangaautomaati. Mis aga saab edasi? Tundub, et programm peab edasigi valikutega minema. Teeme nüüd nii, et pangaautomaati sisenedes näidatakse, mitu eurot pangakontol on, ning küsitakse, mitu eurot soovitakse välja võtta. Kui kasutaja soovib välja võtta rohkem raha, kui on pangakontol, siis teavitatakse kasutajat, et see pole võimalik.
Eelnevalt oli meil olemas pangaautomaati sisenemise programm:
print("Sisesta PIN-kood:") sisestatud_pin = input() if sisestatud_pin == "1234": print("Sisenesid pangaautomaati!") else: print("Vale parool! Enesehävitusrežiim aktiveeritud: 3 ... 2 ... 1 ....")
Esiteks võiks programmi alguses kasutusele võtta muutuja, mille väärtus näitab, kui palju pangakontol raha on. Näiteks teeme nii, et algselt on kasutaja pangakontol 100 eurot:
kontoseis = 100
Nüüd teeme programmiosa, mis töötab siis, kui kasutaja on automaati sisse saanud. Selles osas väljastatakse ekraanile pangakontol olev summa ning küsitakse, mitu eurot soovitakse välja võtta. Küsitud väljavõetava raha teisendame seekord koheselt täisarvutüüpi (int
) väärtuseks:
print("Sisenesid pangaautomaati! Pangakontol on " + str(kontoseis) + " eurot.") print("Sisesta, mitu eurot soovid välja võtta:") soovitud_raha = int(input())
Seejärel oleks vaja kontrollida, et väljavõetav rahasumma oleks väiksem või võrdne kontol olevast. Kui nii on, siis võetakse vastav summa kontolt maha. Kui ei ole, siis väljastatakse vastav veateade:
if soovitud_raha <= kontoseis: kontoseis = kontoseis - soovitud_raha print("Välja võetud: " + str(soovitud_raha) + " eurot. Ärge unustage raha masinast ära võtta!") else: print("Kontol ei ole nii palju raha!")
Võib tunduda kummaline, et kuidas me saame muutujale väärtuse anda tehtega, milles kasutame sedasama muutujat ennast (nt kontoseis = kontoseis - soovitud_raha
). Tegelikult on see aga täiesti lubatud ja sageli kasutatav!
Uurige järgmist koodijuppi ning käivitage see:
komme_kausis = 11 print(komme_kausis) komme_kausis = komme_kausis - 1 print(komme_kausis)
Muutuja uue väärtuse arvutamine vana põhjal on isegi nii levinud, et kasutusel on tehtemärgid (nt +=
, -=
, *=
), mis võimaldavad seda lühemalt kirja panna.
Nii saaks vastavad read asendada eeltoodud programmides järgmistega.
kontoseis -= soovitud_raha
komme_kausis -= 1
Lähme nüüd tagasi pangaautomaadi programmi juurde. Kõige lõpuks võime veel ekraanile väljastada, kui palju raha pangakontole jäi.
print("Pangakontol on nüüd: " + str(kontoseis) + " eurot.")
Kui nüüd lisada need read algse programmi if
-osa sisse, siis saame kokkuvõttes järgneva programmi. Märgiga #
tähistatakse programmis kommentaare, mis on inimeste jaoks ja mida Python ei arvesta. Kõik, mis #
märgile samal real järgneb, on kommentaar.
kontoseis = 100 print("Sisesta PIN-kood:") sisestatud_pin = input() if sisestatud_pin == "1234": print("Sisenesid pangaautomaati! Pangakontol on " + str(kontoseis) + " eurot.") print("Sisesta, mitu eurot soovid välja võtta:") soovitud_raha = int(input()) if soovitud_raha <= kontoseis: kontoseis = kontoseis - soovitud_raha # kontoseisu väärtus väheneb print("Raha välja võetud: " + str(soovitud_raha) + " eurot.") else: print("Kontol ei ole nii palju raha!") print("Pangakontol on järgi: " + str(kontoseis) + " eurot.") else: print("Vale parool! Enesehävitusrežiim aktiveeritud: 3 ... 2 ... 1 ....")
Palun mõelge selle programmi loogika rahulikult läbi ning seejärel katsetage selle tööd.
Ülesanne
Vahest läheb programmeerimises vaja, et arvuti oskaks genereerida juhuslikku arvu. Näiteks proovime teha programmi, mis simuleeriks mündiviskamist ja saaks tulemuseks kulli või kirja.
Kuidas panna arvuti juhuslikult valima kahe valiku vahel?
Selles tulebki meile appi juhusliku arvu genereerimine. Funktsiooniga randint(1,2)
saame võrdse tõenäosusega ühe arvu vahemikust 1-st 2-ni (mõlemad kaasaarvatud). Kuna sinna vahemikku jäävadki vaid kaks arvu: 1 ja 2, siis valitakse nende vahel. Kumb igal konkreetsel juhul tuleb, ei ole ette teada. Näiteks funktsiooniga randint(1,3)
saaksime kas arvu 1, 2 või 3.
Funktsiooni randint()
saab aga kasutada ainult siis, kui esimesele reale kirjutada, et seda funktsiooni programmis kasutatakse: from random import randint
. See tähendab, et me impordime moodulist random
funktsiooni randint
. (Seal moodulis on veel teisi huvitavaid funktsioone ka.)
Failide nimetamisega peab olema ettevaatlik! Programmi nimi ei tohi ühtida moodulite nimedega - praegusel juhul annaks "random.py" faili kasutamine veateate. Samuti ei tohi samas kataloogis olla moodulite nimedega teisi faile.
Proovige aga nüüd järgmist programmi:
from random import randint suvaline_arv = randint(1, 2) if suvaline_arv == 1: arvuti_valik = "kull" else: arvuti_valik = "kiri" print("Mündiviskes võitis: " + arvuti_valik)
Kui küsida kasutajalt, kas ta valib kulli või kirja, siis saamegi kulli ja kirja viskamise mängu:
from random import randint print("Kas kull (1) või kiri (2)?") kasutaja_valik = int(input()) suvaline_arv = randint(1, 2) if kasutaja_valik == suvaline_arv: print("Arvasid õigesti.") else: print("Arvasid valesti.")
MITME TINGIMUSEGA VALIKULAUSE
Vahel on vaja kontrollida mitut tingimust korraga. Olgu näiteks selline seif, mis avaneb ainult siis, kui kaks erinevat koodi õigesti sisestatakse. See võimaldaks näiteks kindlalt teada, et seifi avamisel peavad mõlemad partnerid korraga kohal olema.
Tingimusi saab kombineerida loogiliste tehete abil. Üks nendest on näiteks and
, mis ongi "ja" tähenduses. Tehtega and
seotud avaldis on tõene siis ja ainult siis, kui mõlemad avaldised, millega tehe tehakse, on tõesed. Järgnevas programmis ongi seda ära kasutatud.
kood1 = "1234" kood2 = "0000" print("Sisesta 1. salakood:") pakutud_kood1 = input() print("Sisesta 2. salakood:") pakutud_kood2 = input() if pakutud_kood1 == kood1 and pakutud_kood2 == kood2: print("Seif avaneb!") else: print("Salakoodidega on kehvasti. Tõstke käed üles!")
Katsetage seda programmi erinevate sisenditega. Näiteks, kui
- mõlemad koodid on õiged;
- 1. kood on õige, 2. kood vale;
- 1. kood on vale, 2. kood õige;
- mõlemad on valed.
Kas tulemus vastas teie ootustele?
Loogilisi tehteid on veel, näiteks or
ja not
. Sõna or
tähendab tõlkes "või". Asendage valikulauses tehe and
tehtega or
:
if pakutud_kood1 == kood1 or pakutud_kood2 == kood2:
Katsetage nüüd programmi tööd erinevate sisenditega. Jälle, kui
- mõlemad koodid on õiged;
- 1. kood on õige, 2. kood vale;
- 1. kood on vale, 2. kood õige;
- mõlemad on valed.
Püüdke or
-tehte olemust nüüd selgitada. Kuidas on seos tavakeele sõnaga "või"?
Eelmise näite puhul olid välja pakutud mõned variandid, mida katsetamisel kasutada. Need polnud valitud suvaliselt, vaid püüdsid hõlmata kõiki põhimõtteliselt erinevaid variante. Testimine on programmeerimises väga oluline. Vähegi suurema programmi puhul on mõistlike testide koostamine omaette suur töö. IT-firmades on lausa testija ametikohad ja vastavad osakonnad.
Tehete and
ja or
puhul on meil vaja kahte operandi, millega tehe toimub. Selliseid tehteid nimetatakse kahekohalisteks ehk binaarseteks. Tehe not
töötab ühe operandiga (on ühekohaline ehk unaarne). Tehe not
"pöörab" tõeväärtuse vastupidiseks. Näiteks avaldise
not 1 == 1
väärtus on False
, sest 1 == 1
on True
.
Ülesanne
Kokkuvõtvalt võib öelda, et and
, or
ja not
tehete kasutamisel on tulemused järgnevad:
väide1 and väide2
- tõene ainult siis, kui mõlemad väited on tõesedväide1 or väide2
- tõene siis, kui vähemalt üks väidetest on tõenenot väide1
- tõene ainult siis, kui väide1 on väär.
MITMEHARULINE VALIKULAUSE
Vaatame sellist näidet, kus programmile öeldakse punktisumma ja programm teatab, mis hinde see summa annab.
Ülikoolis pannakse sageli hindeid järgmise skeemi järgi:
Tulemus (%) | Hinne |
---|---|
>90 .. 100 | A |
>80 .. 90 | B |
>70 .. 80 | C |
>60 .. 70 | D |
>50 .. 60 | E |
<=50 | F |
Programm, mis võtab sisendiks punktid ja kontrollib, kas selle eest saab hinde "A", oleks järgnev:
print("Sisesta punktide arv") punktid = int(input()) if punktid > 90: print("Hinne A") else: print("Ei ole hinne A")
Lisame nüüd kontrolli ka hindele "B":
print("Sisesta punktide arv") punktid = int(input()) if punktid > 90: print("Hinne A") else: if punktid > 80: print("Hinne B") else: print("Hinne ei ole A ega B")
Kuna hinnete vahemikke on palju, siis kipub programm jooksma treppides liiga paremale. Mugavamaks programmeerimiseks võib kasutada ka elif
-osa, mis on nii kirjapildi kui ka tähenduse poolest kombinatsioon else
-ist ja talle järgnevast if
-ist.
Näiteks eelnev programmilõik oleks siis selline:
print("Sisesta punktide arv") punktid = int(input()) if punktid > 90: print("Hinne A") elif punktid > 80: print("Hinne B") else: print("Hinne ei ole A ega B")
Proovige lõpetada programm iseseisvalt.
< eelmine | 3. OSA sisukord | järgmine > |