Valik ja IF-lause

From Wikiversity

< 3. nädala teemad

Valik kui algoritmi koostisosa[edit]

Algoritmide ja programmide koostamisel on üheks oluliseks komponendiks ehk ehituskiviks valik. Valiku abil saab jätta otsustamise (kas teha ühtesid toiminguid või teisi toiminguid) algoritmi/programmi täitmise ajaks. Ja seega sõltub otsus antud hetkeks tekkinud olukorrast. Esimeseks oluliseks valikus kasutatavaks osaks on loogikaavaldis. Et loogikaavaldisel on kaks võimalikku väärtust (True ja False), saab selle järgi otsustada kahe võimaliku toimingute jada vahel. Rohkemate jadade vahel valimiseks on vaja mitut valikukonstruktsiooni koos loogikaavaldistega.

Teisiti öeldes – valikulause annab võimaluse kirja panna kaks alternatiivset toimingute järgnevust ja programmi / algoritmi täites saab alati valida vaid ühe nendest järgnevustest. Kui loogikaavaldise väärtus on True, valitakse üks jada ja kui False, siis teine jada.

Valikulause toimimise skeem on järgmine:

Valik Pythonis[edit]

Tegevusskeemil kasutatavat hargnemist koos valikuplokiga saab üsna üksühele programmeerimiskeelde „tõlkida“. Selleks on peaaegu igas keeles olemas nn if-lause, mille toimimispõhimõte erinevates keeltes on väga sarnane. If-lause sisaldab alati loogikaavaldist ning kui selle avaldise väärtus on tõene, täidetakse need laused, mis paiknevad nn if-osas. Peale seda jätkub programmi täitmine if-lausele järgnevate lausetega, st else-osas paiknevatest lausetest hüpatakse üle. Kui loogikaavaldise väärtus on väär, siis hüpatakse üle if-osas olevatest lausetest, täidetakse need, mis jäävad else-ossa ning seejärel jätkatakse programmi täitmist if-lausele järgneva lausega. Pythoni's on if-lausel mitu erinevat vormi (sõltuvalt valikute arvust), kuid kõige tüüpilisem näeb välja järgmine:

if loogika-avaldis:
    toimingud, kui avaldis tõene
else:
    toimingud, kui avaldis väär

Siinjuures tuleb arvestada, et if ja else-osas esitatud toimingud tuleb trükkida taandega, teisisõnu – tuleb programmikoodi treppida. Toiminguid (programmi lauseid) võib mõlemas osas olla mitu ja kõigi taane peab olema ühesugune. Taane näitab lausete kuulumist ühte plokki. Lisaks näitab ta, et taandega laused kuuluvad mingi keelekonstruktsiooni sisse (antud juhul kuuluvad need laused if-lause sisse).

Näide 1

# Jagatakse kaht arvu. Kui jagaja on null, antakse veateade.
if a2 = 0:
    print (“Viga“)
else:
    J = a1/a2
    print (“Jagatis on “, J)

Tavaliselt saab programmeerimiskeeltes kasutada nn ühe poolega if-lauset. See tähendab, et toimingud on ettenähtud vaid juhuks, kui loogikaavaldis oli tõene. Vastasel juhul ei tehta midagi erilist ning programmi täitmine jätkub kohe peale if-lause lõppu. Pythoni vastav konstruktsioon näeb välja järgmine:

if loogika-avaldis:
    toimingud, kui avaldis tõene

Mitmene valik[edit]

Lisaks saab Pythonis kasutada nn elif-lauset, mis on alternatiiviks mitme if-lause üksteise else-osadesse paigutamisele. Selline lause võimaldab teha valikuid mitmeid erinevaid tingimusi arvestades ja kohe, kui on leitud tõene avaldis, täidetakse temaga seotud toimingud, ning edasi jätkub programmi täitmine peale if-lauset. Keelekonstruktsioon elif on ka alternatiiviks valdavalt teistes keeltes kasutusel olevatele switch ja case-lausetele.

if..elif..else lause kuju on järgmine:

if loogika-avaldis1:
   avaldis1_tõene_toimingud
elif loogika-avaldis2:
   avaldis2_tõene_toimingud
               :
elif loogika-avaldisN:
   avaldisN_tõene_toimingud
else:
   toimingud, kui ükski eelnev avaldis ei sobinud

Näited if-lause kasutamisest[edit]

Näide 1

Esimeses näites on kasutatud ühte if-lauset, et vihmasaju järgi jagada soovitusi õueminekuks.

# -*- coding: ISO-8859-4 -*-
# Programm jagab soovitusi õue minemiseks
# Sisend: vastus - string

print("See on väga vajalik programm, mis aitab Sul enne kooli minekut olulisi otsuseid teha.")
vastus = input("Kas vihma sajab [ja/ei]? ")
if vastus == "ja":
    print("Ära unusta vihmavarju ja mõistlik oleks sõita trammiga!")
else:
    print("Liikumine on tervisele kasulik. Jaluta täna!")
print("Head koolipäeva")

Seda programmi võid täiendada, et jagada soovitusi ka teistsuguste ilmastikunähtustega toime tulemiseks :)

Näide 2

Teine näide tegeleb arvude võrdlemisega ja otsustamisega, kas suurem on esimesena või teisena sisestatud arv.

# -*- coding: ISO-8859-4 -*-
# Programm teeb selgeks, arvude suurused ja väljastab nad nii, et väiksem on enne
# ja suurem pärast
# Sisend: arv1, arv2 - int
# Väljund: sobiv tekst ja arvud õiges järjekorras.
# Klassikaline variant, kus üks if-lause on teise if-lause sees.
# Aga kas ta töötab ikka õigesti? Kes suudab vea leida?

print("Programm tuvastab, kumb sisestatud arvudest on suurem ja kuvab nad suuruse järjekorras.")
arv1 = input("Sisesta esimene arv ")
arv2 = input("Sisesta teine arv ")
if arv1 > arv2:
    print("Esimene arv on suurem.")
    print("Suuruse järjekorras: ", arv2, arv1)
else:
    if arv1 < arv2:
        print("Teine arv on suurem.")
        print("Suuruse järjekorras ", arv1, arv2)
    else:
        print("Arvud on võrdsed.")

Pane tähele, et programmi ees kommentaaride lõpus küsimus programmi kohta - miks ta meile mõne sisendi puhul valetab. Kui ei tea, milliste väärtustega proovida, mõned soovituslikud paarid võiksid olla: 12 ja 14 ning 9 ja 10


Näide 3

Alternatiiviks eelmise näite kohaselt üksteise sisse pandud valikutest oleks if..elif..else kasutamine:

# -*- coding: ISO-8859-4 -*-
# Programm teeb selgeks, arvude suurused ja väljastab nad nii, et väiksem on enne ja suurem pärast
# Sisend: arv1, arv2 - int
# Väljund: sobiv tekst ja arvud õiges järjekorras.
# Pythoni stiilis variant, kus kasutatakse elif-lauset mitmese valiku tekitamiseks.
# Ka selles variandis on viga. Leia see üles!

print("Programm tuvastab, kumb sisestatud arvudest on suruems ja kuvab nad suuruse järjekorras.")
arv1 = input("Sisesta esimene arv ")
arv2 = input("Sisesta teine arv ")
if arv1 > arv2:
    print("Esimene arv on suurem.")
    print("Suuruse järjekorras: ", arv2, arv1)
elif arv1 < arv2:
    print("Teine arv on suurem.")
    print("Suuruse järjekorras ", arv1, arv2)
else:
    print("Arvud on võrdsed.")

< 3. nädala teemad