9 Mitmeosaline tingimus. Loogilised tehted ja avaldised
Mõnikord on meil tarvis kontrollida tingimust, mis koosneb mitmest osast. Olgu näiteks seif, mis avaneb ainult siis, kui kaks erinevat koodi õigesti sisestatakse. Sellisel juhul oleks meil vaja kontrollida nii esimese kui teise koodi õigsust. Selliseid alamtingimusi on võimalik kombineerida loogiliste tehete abil. Programmeerimise olulisemad loogilised tehted on and
, or
ning not
. Loogilisi tehteid kasutades moodustub loogiline avaldis, millel on tõeväärtus.
Tehe and
Tehe
on tavakeelse “ja” tähendusega. Tehte and
tulemus on tõene siis ja ainult siis, kui mõlemad avaldised (tehte operandid), mille vahel and
and
paikneb, on tõesed. Järgnevas programmis ongi seda ära kasutatud:
Näiteprogramm. Kahe koodiga seif
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!")
Katseta 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?
Tehe or
Sõna “or” tähendab tõlkes “või”. Selgita välja, mida see meie jaoks programmis tähendab (selle tähendus erineb pisut tavakeelsest tähendusest). Asenda eelmise programmi valikulauses tehe
tehtega and
or
:
if pakutud_kood1 == kood1 or pakutud_kood2 == kood2:
Katseta nüüd programmi tööd erinevate sisenditega, nimelt kui
- mõlemad koodid on õiged;
- 1. kood on õige, 2. kood vale;
- 1. kood on vale, 2. kood õige;
- mõlemad on valed.
Kasuta saadud tulemusi järgmisele küsimusele vastuse leidmiseks:
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.
Tehe not
Tehe
“pöörab” tõeväärtuse vastupidiseks. Näiteks avaldisenot
not 1 == 1
väärtus on False
, sest 1 == 1
väärtus on True
.
Loogiliste tehete kokkuvõte
Tehete
ja and
puhul on meil vaja kahte operandi, millega tehe toimub. Selliseid tehteid nimetatakse kahekohalisteks ehk binaarseteks. Tehe or
töötab ühe operandiga (on ühekohaline ehk unaarne).not
Loogiliste tehete
, and
ja or
kasutamisel on tulemused järgnevad:not
väide1 and väide2
– tõene ainult siis, kui mõlemad väited on tõesed
– tõene siis, kui vähemalt üks väidetest on tõeneväide1 or väide2
– tõene ainult siis, kuinot väide1
väide1
on väär.
Sealjuures on iga väide avaldis tõeväärtusega True
või False
, mis võib “pärineda” ka mingisugusest võrdlemistehtest (nt pakutud_kood1 == "1234"
,vanus < 14
) või ka loogilisest tehtest (seda vaatame varsti).
Tehted ja avaldised on meile põhimõtteliselt tuttavad juba koolimatemaatikast. Loogilised tehted ja avaldised vajavad veidi harjumist. Ärge väga muretsege, kui esimese hooga kõik veel selgeks ei saa.
Loogilised avaldised muutuvad tingimusteks, kui neid selles rollis kasutatakse – näiteks tingimuslauses.
Keerulisem tingimus
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 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 küllaltki keeruline olema. Programmide kirjutamisel tuleb seetõttu teha mõningaid lihtsustusi.
Loogilise avaldise koostamiseks võtame kasutusele muutujad kartul_olemas
, makaron_olemas
ja salatikaste_olemas
. Vastavalt sellele, kas 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 mitu võimalikku 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
. Sellele lisame salatikastme – kartul_olemas or makaron_olemas
. Sulud tähistavad siin (nagu ka aritmeetikas ja algebras) seda, et vastav tehe sooritatakse enne välimisi.(kartul_olemas or makaron_olemas) and salatikaste_olemas
Järgmises näites on meil olemas kartul ja salatikaste, aga makarone pole. Kui meie mõttekäik on õige olnud, siis peaks ekraanile tulema True
, sest tõesti saame salatit teha. Proovi järele!
Näiteprogramm. Salati võimalikkuse kontroll
kartul_olemas = True makaron_olemas = False salatikaste_olemas = True print((kartul_olemas or makaron_olemas) and salatikaste_olemas)
Proovi nüüd programmi tööd muutujate kartul_olemas
, makaron_olemas
ja salatikaste_olemas
erinevatel väärtustel. Enne käivitamist mõtle, milline tulemus oleks ootuspärane. Kas programm töötab vastavalt ootustele?
Tehete järjekord loogilises avaldises
Eelnevalt mainisime, 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? Kas siis nagunii ei tehtaks siin or
-tehet enne, sest see asub eespool?
Tõepoolest on sulud siin olulised, sest nende puudumisel tehtaks esimesena hoopis
-tehe. Nimelt on kokkulepe, et and
and
on kõrgema prioriteediga kui
, analoogiliselt tavalise aritmeetikaga, kus korrutamine tehakse enne liitmist. Näiteks 2 + 3 * 4 on 14, aga mitte 20.or
Enesekontroll (1 küsimus)
Videomaterjal
Selles videos on veel ühe programmi näide, kus on keerulisem tingimus ja erinevad loogilised tehted.