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 and on tavakeelse “ja” tähendusega. Tehte and tulemus on tõene siis ja ainult siis, kui mõlemad avaldised (tehte operandid), mille vahel 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 and tehtega 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 not “pöörab” tõeväärtuse vastupidiseks. Näiteks avaldise

not 1 == 1

väärtus on False, sest 1 == 1 väärtus on True.

Loogiliste tehete kokkuvõte

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).

Loogiliste tehete and, or ja not 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.

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 kartul_olemas or makaron_olemas. Sellele lisame salatikastme – (kartul_olemas or makaron_olemas) and salatikaste_olemas. Sulud tähistavad siin (nagu ka aritmeetikas ja algebras) seda, et vastav tehe sooritatakse enne välimisi.

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 and-tehe. Nimelt on kokkulepe, et and on kõrgema prioriteediga kui or, analoogiliselt tavalise aritmeetikaga, kus korrutamine tehakse enne liitmist. Näiteks 2 + 3 * 4 on 14, aga mitte 20.

Enesekontroll (1 küsimus)

Videomaterjal

Selles videos on veel ühe programmi näide, kus on keerulisem tingimus ja erinevad loogilised tehted.

Litsents

Icon for the Creative Commons Attribution 4.0 International License

Programmeerimine on loodud Eno Tõnisson, Tauno Palts, Merilin Säde, Kaarel Tõnisson jt poolt Creative Commons Attribution 4.0 International License litsentsi alusel, kui pole teisiti märgitud.

Jaga seda raamatut