Jätkub arvutiprogrammide koostamise põhimõtteid ja –võtteid tutvustav artiklisari, mis algas jaanuarinumbris. Seekord vaatleme valikulauseid, mis võimaldavad programmi töö ajal otsustada, milliseid käske täita ja milliseid mitte.
Kodutöö lahendus
Eelmise numbri koduse ülesande lahendamiseks oli kõigepealt vaja teada (või välja uurida), et toll on võrdne 0,0254 meetri ja USA nael umbes 0,4536 kilogrammiga.
Esimene võimalus selle info kasutamiseks on enne kehamassi indeksi arvutamist SI ühikud USA omadeks teisendada, lisades ülesande püsituses toodud programmis rea
kmi = kaal / (pikk * pikk) * 703
ette read
pikk = pikk / 0.0254 ' teisendame m -> tollid kaal = kaal / 0.4536 ' teisendame kg -> naelad
Teine võimalus on vajalikud kordajad otse kmi avaldisse sisse viia. Siis saame pärast konstantsete tegurite koondamist
kmi = kaal / (pikk * pikk) * 0.9999
mis on väga lähedal Maailma Tervishoiuorganisatsiooni ametlikule meetermõõdus määratlusele
kmi = kaal / (pikk * pikk)
Väike erinevus on tingitud sellest, et esiteks pole naelte ja kilogrammide vaheline teisendus päris täpne ja teiseks on USA valemis olev kordaja 703 juba veidi ümardatud.
Õiged lahendused saatsid Andres Vahter, Mati Vait, Andres Võsa, Toivo Hein, Andres Mähar, Toomas Vahter, Marek Laane, Kirstel Kivikangur, Anu Adler, Tõnu Leemet, Ingmar Aasoja, Margus Rätsepp, Rene Talviste, Allan Voog, Kert Sasi, Maarek Aabmets, Marko Mäekivi, Margus Klaos, Aira Lõhmus, Andri Arula, Avo Joorits, Roger Mikomägi, Karl Janson, Harri Poom, Raimo Herkül, Indrek Saar, Kaja Saar ja Taavi Saar. Auhinna saab loosi tahtel Toomas Vahter, kellel palume toimetusega ühendust võtta.
Valikulaused
Nagu juba kehamassi indeksi ülesandest näha, on isegi üsna lihtsates programmides vaja käskude järjest täitmise asemel neid mõnikord valikuliselt täita või täitmata jätta. Selleks ongi kõigis programmikeeltes olemas valikulaused. Basicus on valikulause üldkuju
IF tingimus1 THENkäsud1 ELSEIF tingimus2 THEN
käsud2 ELSEIF ... THEN
... ELSE
käsudX ENDIF
mis tähendab, et kui kehtib tingimus1, siis täidetakse käsud1, kui tingimus2, siis käsud2 jne. Kui ei kehti ükski tingimus, täidetakse käsudX.
Vormilise poole pealt tasub märkida, et ELSEIF ja ELSE harud pole kohustuslikud — kui neid ei ole ja tingimus1 ei kehti, siis jätkub programmi täitmine ENDIF järel olevast reast.
Sisulise poole pealt on oluline tähele panna, et kui tingimus1 kehtib, siis teisi tingimusi enam ei uurita ja pärast käsud1 täitmist jätkab arvuti kohe ENDIF järelt. See asjaolu võimaldab kirjutada valikulauseid, kus muidu võiks juba tingimuste kontrollimine ise veaolukordi põhjustada.
Oletame näiteks, et me tahame kontrollida, kas ruut pindalaga S mahub ringi diameetriga D. Selle ülesande lahendamiseks peame kõigepealt märkama, et ruut mahub ringi sisse parajasti siis, kui tema diagonaal ei ole pikem ringi diameetrist. Pythagorase teoreemi põhjal on ruudu diagonaal
, millest saame vajalikuks tingimuseks
.
Joonis 1: Ruudu mahtumine ringi
Arvestades, et Basicus on ruutjuure arvutamiseks olemas standardfunktsioon SQR, võime sama tingimuse üles kirjutada kujul SQR(2 * S) <= D. Selle tingimuse kontrollimisel aga katkeb programmi töö süsteemi veateatega, kui S on negatiivne. Siin saamegi ära kasutada tingimuste kontrollimist kindlas järjekorras:
S = CDbl(InputBox("Ruudu pindala"))
D = CDbl(InputBox("Ringi diameeter"))
IF S < 0 THEN
MsgBox("Pindala ei saa olla negatiivne!")
ELSEIF SQR(2 * S) <= D THEN
MsgBox("Mahub")
ELSE
MsgBox("Ei mahu")
ENDIF
Loogilised avaldised
Tingimused, mida valikulauses kasutada võib, on loogilised avaldised. Lihtsamaid loogilisi avaldisi — arvude (või tekstide) võrdlemisi — olema juba näinud ja kasutanud. Neid, loogika mõttes lihtlauseid, on aga võimalik ühendada liitlauseteks loogikatehete NOT, AND ja OR abil.
Tingimuse A eitus NOT A on tõene parajasti siis, kui tingimus A ise on väär. Loogiline korrutis A AND B on tõene ainult siis, kui A ja B mõlemad on tõesed. Loogiline summa A OR B on tõene siis, kui kas A või B või nad mõlemad on tõesed (seega, A OR B on väär ainult siis, kui A ja B mõlemad on väärad).
Nende tehete ja sulgude abil saab moodustada üsna keerulisi loogilisi avaldisi, näiteks
IF A > 0 AND A < 10 THENMsgBox("A on 1...9") ENDIF
või isegi
IF NOT(NOT(B > 0) OR NOT(B < 10)) THENMsgBox("B on ka 1...9") ENDIF
Tingimus tingimuse sees
Keerukamate programmide koostamisel tuleb sageli kasuks asjaolu, et valikulause on käsk nagu iga teinegi, ja järelikult võib üks valikulause esineda käsuna teise sees. Nii võime eelmises lõigus toodud näidetest esimese ümber kirjutada kujule
IF A > 0 THENIF A < 10 THEN
MsgBox("A on 1...9")
ENDIF ENDIF
Sellist lausete üksteise sisse panekut kutsutakse pesastamiseks. Kuigi põhimõtteliselt võib lauseid matrjoškade kombel üksteise sisse panna kuitahes palju, loetakse praktikas maksimumiks umbes viis “kihti” — üle selle on juba väga raske jälgida, mis tingimustel mida tehakse või tegemata jäetakse.
Kumba esitust — pesastamist või liitavaldisega tingimusi — ühel või teisel juhul kasutada, on enamasti maitseasi, vahel on tingimust mugavam esitada ühel, vahel teisel kujul. Siiski on mõned erijuhud, kus pesastamine on selgelt parem.
Nimelt, kui välimise valikulause tingimus ei kehti, siis sisemise tingimuse kehtivust ei hakata uurimagi. See asjaolu tuleb kasuks, kui sisemise tingimuse tõeväärtuse leidmine sisaldab keerulist ja ajakulukat arvutust või võib välimise tingimuse mittekehtimisel tekitada veaolukorra.
Nii näiteks võime juba tuttavas ringi ja ruudu ülesandes negatiivse pindala sisestamisel ringi diameetri küsimisest üldse loobuda ja kohe veateate väljastada:
S = CDbl(InputBox("Ruudu pindala"))
IF S >= 0 THEN
D = CDbl(InputBox("Ringi diameeter"))
IF SQR(2 * S) <= D THEN

MsgBox("Mahub")
ELSE

MsgBox("Ei mahu")
ENDIF
ELSE
MsgBox("Pindala ei saa olla negatiivne!")
ENDIF
Programmi treppimine
Pesastatud lausete struktuuri paremaks esiletoomiseks on traditsioon, et sisemised käsud trükitakse välimise suhtes taandega. Nii on ka keerulises programmis kohe näha, millised IF-id ja ENDIF-id omavahel paari käivad — need, mis algavad samast veerust — ja milliste käskude täitmist või mittetäitmist iga tingimus mõjutab — nende, mis jäävad selle tingimuse IF-i ja sellega paari käiva ENDIF-i vahele.
Kindlasti võiks oma programmide treppimine juba algusest peale harjumuseks kujundada. Kuigi esmapilgul tundub, et see kulutab vaid asjatult aega, tasub see väike ajakulu end tegelikult kuhjaga ära kohe, kui kirjutatavad programmid kasvavad pikemaks kui umbes 10 rida.
Kodutöö
Esimene kodune ülesanne on kirjutada loogiline avaldis, mis on tõene parajasti siis, kui arvud A, B ja C võivad olla mingi kolmnurga küljepikkused (see tähendab, et nad kõik on positiivsed ja suurim neist on rangelt väiksem kui kahe väiksema summa). Muidugi on selle avaldise praktiliseks kasutamiseks sinna ümber vaja ka programmi, mis A, B ja C väärtused sisestab ning diagnoosi kasutajale väljastab. Kuigi praktikas on ilmselt mõistlikum erinevate vealiikide korral erinevaid veateateid väljastada, võtame seekord harjutamise mõttes plaani kirjutada üks loogiline avaldis.
Teine kodune ülesanne on kirjutada esimene programm ümber nii, et see ei kasuta loogikatehteid NOT, AND ja OR, vaid saavutab sama tulemuse lihttingimustel põhinevate valikulausete pesastamisega. Selles variandis on muidugi igati põhjendatud erinevate vigade tuvastamisel ka erinevate veateadete väljastamine.
AUHINNAD paneb välja MAX 123 — DELLi müügi- ja teeninduskeskus. Seekordseks kuuauhinnaks on DELLi tindiprinter. AASTAAUHINNAKS on DELLi sülearvuti.
Rubriigi autor AHTO TRUU (1972) on WM-data AS tarkvaraarendaja. Viimased kümme aastat tegelenud lisaks põhitööle informaatikavõistluste korraldamisega nii üldhariduskoolide õpilastele kui ka Tartu Ülikooli tudengitele. Eesti Informaatikaolümpiaadi žürii esimees, mitme rahvusvahelise võistluse žürii liige.
Siit saate endale laadida programminäited OpenDocument Spreadsheet vormingus. Nende avamiseks kasutage OpenOffice.org versiooni 2.0 või uuemat.
Faili avamisel hoiatab OpenOffice.org, et see sisaldab makrosid, mis võivad teie arvutit kahjustada. Kui te tahate failis olevaid programme ainult vaadata, võite makrode käivitamise keelata (nupp ‘Disable Macros’). Kui aga tahate programme ka käivitada proovida, peate ise otsustama, kas usaldate makrode käivitamist lubada (nupp ‘Enable Macros’) või mitte.
Programmitekstide vaatamiseks valige pärast faili avamist peamenüüst ‘Tools’ → ‘Macros’ → ‘Organize Macros’ → ‘OpenOffice.org Basic’. Avanevas dialoogiaknas valige kastis ‘Macro from’ vastavatud fail, selle all ‘Standard’, selle all omakorda soovitava programmi nimi. Programmi teksti vaatamiseks vajutage seejärel nuppu ‘Edit’, käivitamiseks aga nuppu ‘Run’.






