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!")
Palun 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 eesti keeles või. Asendage palun 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õesed
- väide1 or väide2 - tõene siis, kui vähemalt üks väidetest on tõene
- not väide1 - tõene ainult siis, kui vä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?
TÕEVÄÄRTUSTABELID
Kerkib küsimus, mitu erinevat varianti üldse on? Igaüks kolmest muutujast võib omada kahte erinevat väärtust. Kui olekski ainult üks muutuja oleks võimalusi kaks.
True
False
Kui oleks ainult kaks muutujat, siis võimalusi neli.
True, True
True, False
False, True
False, False
Kui on kolm muutujat, siis on võimalusi kaheksa.
True, True, True
True, True, False
True, False, True
True, False, False
False, True, True
False, True, False
False, False, True
False, False, False
Ülesanne
Meie näites on salati jaoks vaja kartulit või makaroni. Sõnal või on tavakeeles mõnevõrra teistsugune tähendus, kui programmeerimisel (või ka matemaatilises loogikas). Tavakeeles on või sageli välistav - kas see või teine (aga mitte mõlemad). Loogikas ja programmeerimisel on aga tehe or
tõene ka siis, kui mõlemad operandid on tõesed. Seda saab kujutada ka tõeväärtustabelina. Loogikas tähistatakse or-tehet sageli märgiga V
. Tõene ja väär on tähistatud vastavalt t ja v.

Toome ka tõeväärtustabeli and-tehte jaoks, mida sageli tähistatakse märgiga &
.

Meie salatinäites on tõeväärtustabel arvutatud kahes järgus kõigepealt A v B, mis siis meil tähendab kartul_olemas or makaron_olemas
ja pärast siis kogu avaldis.

LOOGILISTE AVALDISTE SAMAVÄÄRSUS
Salatinäite puhul võime läheneda ka natuke teistmoodi. Kartulisalati jaoks oleks meil vaja kartulit ja salatikastet. Makaronisalati jaoks oleks vaja makarone ja salatikastet. Kokkuvõttes aga piisab, kui vähemalt ühe jaoks neist on materjal olemas. Vastav loogiline avaldis on siis järgmine.
(kartul_olemas and salatikaste_olemas) or (makaron_olemas and salatikaste_olemas)
Tegelikult ongi see samaväärne avaldisega, mis meil enne oli.
(kartul_olemas or makaron_olemas) and salatikaste_olemas
Loogiliste tehete puhul kehtivad mitmed seadused (analoogiliselt algebrale). Näiteks
- avaldis
a and b
on samaväärne avaldisegab and a
; - avaldis
a or b
on samaväärne avaldisegab or a
; - avaldis
(a or b) and c
on samaväärne avaldisega(a and c) or (b and c)
;
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
Loogilistes tehetes orienteeruda on programmeerijale väga oluline ja nii on seda arendavad õppeained ka ülikoolide õppekavades. Mitmetes ainetes Tartu Ülikooli kasutatakse veebipõhist tõeväärtustabeli ülesannete lahendamise keskkonda. Kes huvi tunneb, võiks seal proovida mõned tõeväärtustabelid arvutada. Kasutajanime ja ja parooli saate Moodle'is vastavast foorumist.
Selles keskkonnas on tehtud ka ülaltood tõeväärtustabelid, mis ühtlasi on ülesannete kogu Prog.alused esimeste ülesannete lahendused.
< eelmine | 2. nädala sisukord | järgmine > |