Materjalid koostas ja kursuse viib läbi
Tartu Ülikooli arvutiteaduse instituudi programmeerimise õpetamise töörühm
< eelmine | 2. nädala sisukord | järgmine > |
2.3 Mitmeosaline tingimus. Loogilised tehted ja avaldised
TINGIMUS ON KEERULISEM
Eespool käsitlesime olukorda, kus mingi tingimuslause oli teise tingimuslause ühes harus. Nüüd aga vaatleme, kuidas saab kasutada keerulisemaid tingimusi. Tegemist on siis ikkagi ühe tingimusega, aga see koosneb mitmest osast. Võib ette kujutada mitmeid elulisi situatsioone, kus 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"?
Ülesanne
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.
LOOGILISED TEHTED JA AVALDISED
Meil on kasutada tõeväärtused True
ja False
, mis sageli otseselt "nähtavad" polegi ja programmis paistavad näiteks hoopis mingite võrdlemistena.
pakutud_kood1 == "1234"
vanus < 14
soovitud_raha <= kontoseis
Olenevalt muutujate konkreetsetest väärtustest on nende avaldiste väärtusteks True
või False
. Loogiliste tehete abil saame keerulisemaid avaldisi moodustada. 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
.
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, kuiväide1
on väär.
Tehted ja avaldised on meile põhimõtteliselt tuttavad juba koolimatemaatikast - aritmeetikast ja algebrast. Loogilised tehted ja avaldised vajavad veidi harjumist. Ärge väga muretsege, kui esimese hooga kõik veel selgeks ei saa. Põhimõtteliselt on tegemist siiski loogilise asjaga. :-)
Loogilised avaldised muutuvad tingimusteks, kui neid selles rollis kasutatakse - näiteks tingimuslauses.
Vahel on tingimused keerulisemad ja programmi korraliku töö huvides tuleb need põhjalikult läbi mõelda. Olgu meil tahtmine teha salatit - kartuli- või makaronisalatit. Lihtsustatult oleks meil siis vaja kartuleid või makarone ja salatikastet.
Jätame praegu täpsustamata, millest see salatikaste tehtud on ja muid detaile ka. Tegelikult kipubki päriselu loogilistes avaldistes kirjeldamine päris keeruline olema. Programmide kirjutamisel aga vähemalt mingil tasemel seda teha tuleb.
Loogilise avaldise koostamiseks võtame kasutusele muutujad kartul_olemas
, makaron_olemas
ja salatikaste_olemas
. Vastavalt siis sellele, kas vastav koostisosa on olemas või mitte, on selle muutuja väärtus True
(on olemas) või False
(ei ole olemas).
Püüame nüüd kirja panna, kas saame salatit teha või mitte. Siin on tegelikult võimalikud mitu mõttekäiku ja ka avaldis võib lõpuks tulla (näiliselt) erinev.
Üks võimalus oleks mõelda nii, et meil on vaja kahte koostisosa: n-ö nimiosa ja salatikastet. Nimiosas võib olla kartul või makaron - panemegi kirja kartul_olemas or makaron_olemas
. Ja salatikaste -
(kartul_olemas or makaron_olemas) and salatikaste_olemas
. Sulud tähistavad siin (nagu ka aritmeetikas ja algebras) seda, et vastav tehe tuleb enne ära teha.
Järgmises näites on meil siis kartul olemas ja salatikaste, aga makarone pole. Kui meie mõttekäik on õige olnud, siis peaks ekraanile tulema True
, sest tõesti saame salatit teha. Proovige!
kartul_olemas = True makaron_olemas = False salatikaste_olemas = True print((kartul_olemas or makaron_olemas) and salatikaste_olemas)
Proovige nüüd programmi tööd muutujate kartul_olemas
, makaron_olemas
ja salatikaste_olemas
erinevatel väärtustel. Enne kui käivitate, mõelge milline tulemus võiks tulla. Kas programm töötab vastavalt teie ootustele?
Eelnevalt oli juttu, et sulgude kasutamine suunab tehete järjekorda. Sulgudes olev tehakse varem. Mis aga juhtuks, kui näiteks avaldises (a or b) and c
sulud ära jätaksime? Mis mõte neil üldse siin on? Kas siis nagunii ei tehtaks siin or
-tehet enne, asub see ju eespool?
Tõepoolest on sulud siin olulised, sest kui neid poleks, siis tehtaks esimesena hoopis and
-tehe. Nimelt on kokkulepe, et and
on kõrgema prioriteediga kui or
, analoogiliselt tavalise aritmeetikaga, kus ka korrutamine tehakse enne liitmist. Näiteks 2 + 3 * 4 on 14, aga mitte 20.
Ülesanne
VIDEO
Järgmises videos on veel üks programmi näide, kus on keerulisem tingimus ja erinevad loogilised tehted.
< eelmine | 2. nädala sisukord | järgmine > |