Materjalid koostas ja kursuse viib läbi
Tartu Ülikooli arvutiteaduse instituudi programmeerimise õpetamise töörühm
< eelmine | 2. nädala sisukord | järgmine > |
2.2 Tingimuslause tingimuslause sees. Juhuslik arv
Tingimuslause tingimuslause 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 nädala järgmistes materjalides.
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 edasi ka 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:
sisestatud_pin = input("Sisesta PIN-kood: ") 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!
Selle demonstreerimiseks 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 asendada vastavad read eeltoodud programmides järgmistega. (Märgiga # tähistatakse programmis kommentaare, mis on inimeste jaoks ja mida Python ei arvesta.)
kontoseis -= soovitud_raha #kontoseis = kontoseis - soovitud_raha asemel
komme_kausis -= 1 #komme_kausis = komme_kausis - 1 asemel
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.
kontoseis = 100 sisestatud_pin = input("Sisesta PIN-kood: ") 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
Sageli 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.
Võrdse tõenäosuse puhul on mõlema juhu tõenäosus 50% (sageli öeldakse ka 0,5). Kui teha piisavalt palju katseid, siis umbes samapaljudel juhtudel tuleb tulemuseks 1 kui 2. Oluline on siin märkida, et väikestel katsearvudel võib erinevus olla täiesti märgatav. Näiteks vabalt võib juhtuda, et kümnest juhust on seitsmel juhul 1 ja kolmel juhul 2. Järgmisel nädalal asume juhuslikkust tsükliliselt "kontrollima".
Sageli on meil aga vaja rohkem variante kui kaks. Näiteks randint(1,3)
annab kas arvu 1, 2 või 3. Igaühe tõenäosus on siis ligikaudu 33,3% (1/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 funktsioone ka.) Saab importida ka kõiki neid korraga.
from random import *
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 nüüd 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.")
Teeme nüüd programmi ümber lisades selle tingimuslause ühte harusse teise tingimuslause.
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.") suvaline_arv2 = randint(1, 2) if kasutaja_valik == suvaline_arv2: print("Arvamus oli õige ka teisel korral.") else: print("Teist korda see arvamus enam õige ei olnud.") else: print("Arvasid valesti.")
Attach:Nadal2_kullvoikiri1.png Δ
Ülesanne
Kes tahab sel teemal edasi mõtiskleda, võiksid läbi mõelda, mis oleks teisiti, kui
suvaline_arv2 = randint(1, 2)
asemel oleks suvaline_arv2 = randint(1, 3)
või
suvaline_arv2 = randint(1, 2)
asemel oleks suvaline_arv1 = randint(1, 2)
< eelmine | 2. nädala sisukord | järgmine > |