Arvutiteaduse instituut
  1. Kursused
  2. 2014/15 kevad
  3. Programmeerimisest maalähedaselt (MTAT.TK.006)
EN
Logi sisse

Programmeerimisest maalähedaselt 2014/15 kevad

  • AVALEHT
  • 1. OSA. Algoritm. Programm
  • 2. OSA. Muutujad. Andmetüübid
  • 3. OSA. Valikulause
  • 4. OSA. Tsükkel
  • 5. OSA. Funktsioonid
  • 6. OSA. Sõned. Failid
  • 7. OSA. Regulaaravaldis
  • 8. OSA. Suurem programminäide
  • AUTORID
< eelmine3. OSA sisukordjärgmine >

3.2 Veel valikulauseid

VALIKULAUSE VALIKULAUSE SEES

Valikulausete puhul on kesksel kohal tingimus, mille kehtimisest sõltub, millise haruga edasi minnakse. Tingimus esitatakse tõeväärtustüüpi avaldisena, näiteks sisestatud_pin == "1234". Avaldis võib olla ka märksa keerulisem. Mõningaid selliseid vaatame käesoleva osa teises pooles.

Praegu aga jätkame varasemat programmi, kus küsitakse PIN-koodi ja õige koodi korral "sisenetakse" pangaautomaati. Mis aga saab edasi? Tundub, et programm peab edasigi valikutega minema. Teeme nüüd nii, et pangaautomaati sisenedes näidatakse, mitu eurot pangakontol on, ning küsitakse, mitu eurot soovitakse välja võtta. Kui kasutaja soovib välja võtta rohkem raha, kui on pangakontol, siis teavitatakse kasutajat, et see pole võimalik.

Eelnevalt oli meil olemas pangaautomaati sisenemise programm:

print("Sisesta PIN-kood:")
sisestatud_pin = input()
if sisestatud_pin == "1234":
    print("Sisenesid pangaautomaati!")
else:
    print("Vale parool! Enesehävitusrežiim aktiveeritud: 3 … 2 … 1 ....")

Esiteks võiks programmi alguses kasutusele võtta muutuja, mille väärtus näitab, kui palju pangakontol raha on. Näiteks teeme nii, et algselt on kasutaja pangakontol 100 eurot:

kontoseis = 100

Nüüd teeme programmiosa, mis töötab siis, kui kasutaja on automaati sisse saanud. Selles osas väljastatakse ekraanile pangakontol olev summa ning küsitakse, mitu eurot soovitakse välja võtta. Küsitud väljavõetava raha teisendame seekord koheselt täisarvutüüpi (int) väärtuseks:

print("Sisenesid pangaautomaati! Pangakontol on " + str(kontoseis) + " eurot.")
print("Sisesta, mitu eurot soovid välja võtta:")
soovitud_raha = int(input())

Seejärel oleks vaja kontrollida, et väljavõetav rahasumma oleks väiksem või võrdne kontol olevast. Kui nii on, siis võetakse vastav summa kontolt maha. Kui ei ole, siis väljastatakse vastav veateade:

if soovitud_raha <= kontoseis:
    kontoseis = kontoseis - soovitud_raha
    print("Välja võetud: " + str(soovitud_raha) + " eurot. Ärge unustage raha masinast ära võtta!")
else:
    print("Kontol ei ole nii palju raha!")

Võib tunduda kummaline, et kuidas me saame muutujale väärtuse anda tehtega, milles kasutame sedasama muutujat ennast (nt kontoseis = kontoseis - soovitud_raha). Tegelikult on see aga täiesti lubatud ja sageli kasutatav!

Uurige järgmist koodijuppi ning käivitage see:

komme_kausis = 11
print(komme_kausis)
komme_kausis = komme_kausis - 1
print(komme_kausis)

Muutuja uue väärtuse arvutamine vana põhjal on isegi nii levinud, et kasutusel on tehtemärgid (nt +=, -=, *=), mis võimaldavad seda lühemalt kirja panna.

Nii saaks vastavad read asendada eeltoodud programmides asendada järgmistega. (Märgiga # tähistatakse programmis kommentaare, mis on inimeste jaoks ja mida Python ei arvesta.)

kontoseis -= soovitud_raha 
#kontoseis = kontoseis - soovitud_raha asemel
komme_kausis -= 1
#komme_kausis = komme_kausis - 1 asemel

Lähme nüüd tagasi pangaautomaadi programmi juurde. Kõige lõpuks võime veel ekraanile väljastada, kui palju raha pangakontole jäi.

print("Pangakontol on nüüd: " + str(kontoseis) + " eurot.")

Kui nüüd lisada need read algse programmi if-osa sisse, siis saame kokkuvõttes järgneva programmi.

kontoseis = 100

print("Sisesta PIN-kood:")
sisestatud_pin = input()
if sisestatud_pin == "1234":
    print("Sisenesid pangaautomaati! Pangakontol on " + str(kontoseis) + " eurot.")
    print("Sisesta, mitu eurot soovid välja võtta:")
    soovitud_raha = int(input())
    if soovitud_raha <= kontoseis:
        kontoseis = kontoseis - soovitud_raha #kontoseisu väärtus väheneb
        print("Raha välja võetud: " + str(soovitud_raha) + " eurot.")
    else:
        print("Kontol ei ole nii palju raha!")
    print("Pangakontol on järgi: " + str(kontoseis) + " eurot.")
else:
    print("Vale parool! Enesehävitusrežiim aktiveeritud: 3 … 2 … 1 ....")

Palun mõelge selle programmi loogika rahulikult läbi ning seejärel katsetage selle tööd.

Ülesanne

JUHUSLIKU ARVU GENEREERIMINE

Sageli läheb programmeerimises vaja, et arvuti oskaks genereerida juhuslikku arvu. Näiteks proovime teha programmi, mis simuleeriks mündiviskamist ja saaks tulemuseks kulli või kirja.

Kuidas panna arvuti juhuslikult valima kahe valiku vahel?

Selles tulebki meile appi juhusliku arvu genereerimine. Funktsiooniga randint(1,2) saame võrdse tõenäosusega ühe arvu vahemikust 1-st 2-ni (mõlemad kaasaarvatud). Kuna sinna vahemikku jäävadki vaid kaks arvu: 1 ja 2, siis valitakse nende vahel. Kumb igal konkreetsel juhul tuleb, ei ole ette teada. Näiteks funktsiooniga randint(1,3) saaksime kas arvu 1, 2 või 3.

Funktsiooni randint() saab aga kasutada ainult siis, kui esimesele reale kirjutada, et seda funktsiooni programmis kasutatakse: from random import randint

See tähendab, et me impordime moodulist random funktsiooni randint. (Seal moodulis on veel teisi funktsioone ka.)

Proovige aga nüüd järgmist programmi:

from random import randint

suvaline_arv = randint(1, 2)
if suvaline_arv == 1:
    arvuti_valik = "kull"
else:
    arvuti_valik = "kiri"

print("Mündiviskes võitis: " + arvuti_valik)

Kui nüüd küsida kasutajalt, kas ta valib kulli või kirja, siis saamegi kulli ja kirja viskamise mängu:

from random import randint

print("Kas kull (1) või kiri (2)?")
kasutaja_valik = int(input())
suvaline_arv = randint(1, 2)

if kasutaja_valik == suvaline_arv:
    print("Arvasid õigesti.")
else:
    print("Arvasid valesti.")

MITME TINGIMUSEGA VALIKULAUSE

Vahel 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 == "1234" and pakutud_kood2 == "0000":
    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 == "1234" or pakutud_kood2 == "0000":

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?

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.

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.

Ülesanne

Kokkuvõtvalt 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.

MITMEHARULINE VALIKULAUSE

Vaatame sellist näidet, kus programmile öeldakse punktisumma ja programm teatab, mis hinde see summa annab.

Ülikoolis pannakse vahel hindeid järgmise skeemi järgi:

Tulemus (%)Hinne
>90 .. 100A
>80 .. 90B
>70 .. 80C
>60 .. 70D
>50 .. 60E
<=50F

Programm, mis saab sisendiks punktid ja kontrollib, kas selle eest saab hinde "A", oleks järgnev:

print("Sisesta punktide arv")
punktid = int(input())

if punktid > 90:
    print("Hinne A")
else:
    print("Ei ole hinne A")

Lisame nüüd kontrolli ka hindele "B":

print("Sisesta punktide arv")
punktid = int(input())

if punktid > 90:
    print("Hinne A")
else:
    if punktid > 80:
        print("Hinne B")
    else:
        print("Hinne ei ole A ega B")

Kuna hinnete vahemikke on palju, siis kipub programm jooksma treppides liiga paremale. Mugavamaks programmeerimiseks võib kasutada ka elif-osa, mis on nii kirjapildi kui ka tähenduse poolest kombinatsioon else-ist ja talle järgnevast if-ist.

Näiteks eelnev programmilõik oleks siis selline:

print("Sisesta punktide arv")
punktid = int(input())

if punktid > 90:
    print("Hinne A")
elif punktid > 80:
    print("Hinne B")
else:
    print("Hinne ei ole A ega B")

Proovige lõpetada programm iseseisvalt.


< eelmine3. OSA sisukordjärgmine >
  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Tartu Ülikooli arvutiteaduse instituudi kursuste läbiviimist toetavad järgmised programmid:
euroopa sotsiaalfondi logo it akadeemia logo