03.02.2015 Views

Loomapuu selgitus

Loomapuu selgitus

Loomapuu selgitus

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Iseõppiv programm<br />

Lahenduse <strong>selgitus</strong> näitele loomad.exe<br />

Peale programmi katsetamist pidid kõik mõistma, et programmi poolt juurde õpitud loomad ja<br />

küsimused lisanduvad alati andmestikku. Järgmisel korral mängides ei paku programm enam samas<br />

kohas eelmisel korral valesti arvatud looma, vaid esitab uue sisestatud küsimuse ja vastavalt<br />

mängija antud vastusele (j/e) pakub vana või siis viimati sisestatud looma. Selle asja märkamine<br />

pidi viima lõpuks arusaamisele andmestiku ülesehitusest. Et selleks on kahendpuu, oli juba tunnis<br />

juttu. Lisaks tuli meeles pidada seda, et kõige tüüpilisem kahendpuu kasutamine seisneb ühe tee<br />

(path) läbimises – alustatakse juurest ja jõutakse peale igas puu tipus edasiliikumise otsuse tegemist<br />

(kas jah või ei, kas vasakule või paremale) puu leheni.<br />

Siin ka võrdlus morsepuuga – ka siin läbiti tee puu juurest alates, kuid see ei pidanud tingimata<br />

lõppema lehel, vaid hoopis siis, kui ühe tähe kood otsa sai.<br />

Andmestik<br />

Enne programmi kirjutamist peab olema selge, milline on andmestik. Seniks kuni programmeerite<br />

kirjutage endale hästi tugevalt kõrva taha:<br />

Tark andmestiku ülesehitus tagab mõistliku ja lihtsa programmi.<br />

Mis on olemas alguses Jah paikneb puus vasakul ja ei paikneb paremal (loomulikult võib see olla<br />

ka vastupidi, kuid iga tipu suhtes olgu see ühte moodi). Järgnevalt (joonis 1) on kujutatud puu<br />

mängu alguses.<br />

JAH<br />

Suur<br />

EI<br />

Elevant<br />

Hiir<br />

Joonis 1: Algne loomapuu<br />

Milline on puu peale ühe suure ja karvase looma lisamist (loom oli suur, aga ei olnud elevant)<br />

Vaata pilti järgmisel leheküljel.<br />

Kujuta nüüd ette, kuidas toimub ühe looma ära arvamine. Iga mängu lähtekohaks on puu juur.<br />

Oletame, et Sa mõtled loomaks elevandi. Igal juhul on 1. küsimus: „Kas ta on suur“ Ilmselt on<br />

Sinu vastus jah. St et puus tuleb arvamise jätkamiseks liikuda JAH-suunas (vasakule). Järgmises<br />

puu tipus on küsimus „Kas ta on karvane“ Elevant eriti ei ole. Seega on Sinu vastus ei. Järelikult<br />

tuleb liikuda EI-suunas (paremale) ja sellega jõuad puu leheni, kus on kirjas elevant. Puus<br />

liikumisel on leheni jõudmine märgiks sellest, et kõik täpsustavad küsimused on otsa saanud ning


aeg on pakkuda looma. Kui loom on õige, on programmil põhjust rõõmustamiseks. Pildil (joonis 2)<br />

on läbitud lehed ja kaared märgitud punase värviga.<br />

JAH<br />

Suur<br />

EI<br />

JAH<br />

Karvane<br />

EI<br />

Hiir<br />

Karu<br />

Elevant<br />

Joonis 2: Puu peale karu lisamist, punased on elevenadi arvamiseks läbitud tipud<br />

Nüüd mõtle selle peale seni, kuni oled aru saanud ;)<br />

Läheme edasi.<br />

Kui mõeldud loom ei olnud elevant, vaid hoopis jõehobu, kelle kohta nimetatud 2 küsimust võiksid<br />

olla samade vastustega, siis tuleb programmi õpetada ja uus loom juurde lisada. Samuti küsimus,<br />

mis eristaks oma vahel kahte suurt ja mittekarvast looma: elevanti ja jõehobu. Puusse tuleb lisada<br />

kaks uut tippu ja need lähevad viimati pakutud looma-tipule (elevant) lehtedeks, st tipule, mille<br />

juures parasjagu ollakse tuleb külge kinnitada kaks uut tippu. Seejärel on vaja mõtelda, millisesse<br />

tippu missugune info kirjutada vaja on: Elevandi kohale läheb uus küsimus ja lisatud lehtedesse<br />

tuleb kirjutada elevant ja jõehobu.<br />

Loodan, et loogilises plaanis on asi selge. Kui ei, siis mõtle edasi.<br />

Realisatsioonist<br />

Puu tipu kirjelduse leiab puu materjalist, seda ei ole mõtet siia kopi-pasteerida. Morsepuu eeskujul<br />

võiksid näiteks viidaväljad nimetada 'jah' ja 'ei' (Llink ja Rlink asemel), et programmi sees ei peaks<br />

enam mõtlema vasakule ja paremale poolele, vaid jah/ei vastused annaksid kõik vajaliku kätte.<br />

Esimese sammuna tuleks valmis ehitada esialgne puu (nagu 1. pildil). Seda on kõige lihtsam teha<br />

nö jõumeetodil. Ehk siis teha valmis kolm tippu erinevaid viitmuutujaid kasutades (funktsioon<br />

malloc()) ja seejärel need tipud õigesti viitadega kokku ühendada. Loomulikult omistada tippudesse<br />

vajalikud tekstid (NB! Ära neid kasutajalt küsima hakka). Ja ära unusta lehtede viidaväljadesse<br />

NULL-e kirjutamast (kokku 4 NULL-i). Selle sammu läbimiseks võiks olla abi näitest linked_1.c.<br />

Kuid pead niimoodi viitasid lisama, et tekiks puu kuju.<br />

Teise sammuna tuleks organiseerida nö arvamise tsükkel, mis peab olema nii universaalne, et<br />

temaga saaks ükskõik kui kõrges puus arvata. Selleks:<br />

1. Jälgi, et viit puu juurele säilitaks oma algse koha. NB! Puu juure viita ei tohi Sa<br />

kasutada mitte millekski muuks, kui ainult abiviida paika sättimiseks!!!!!


2. Võta kasutusele abimuutuja (abiviit), mille abil puu tippe järjest läbitakse –<br />

eeskujudeks nii morsepuus dekodeerimise osa kui ka ühe viidaga nimistu läbimine.<br />

Abiviida poolt viidatus tipu järgi esita küsimusi ja lõpuks paku looma. Abiviit läbib<br />

2. pildil joonistatud punase tee.<br />

3. Antud juhul sobib tsükli tüübiks WHILE, sest me ei tea, mitu küsimust meid<br />

leheni/loomani viib.<br />

4. Tsükli sisuks planeeri küsimused, tsükkel lõpeta loomani/leheni jõudmisel, tsükli üks<br />

kordus küsib ühe küsimuse ja vastavalt saadud vastusele liigutab abiviita edasi kas<br />

jah- või ei-suunas.<br />

5. Peale tsükli lõppu paku loom, rõõmusta, kui see oli õige või täienda puud, kui loom<br />

oli vale.<br />

6. Täiendamiseks tuleb taas korralikult viitadele mõtelda, nagu seda esimest puukest<br />

luues tegid. Ja loomulikult sellele, millisesse puu sõlme milline tekst panna tuleb. Et<br />

abiviit on pakutud loomaga tipu küljes, on võimalik selle suhtes nii uusi tippe lisada<br />

kui ka nendes olevate tekstidega tegeleda. Vaata selle kohta pilti allpool: lisatavad<br />

sõlmed ja tekstid on punased, samuti on punase joonega näidatud, kuidas tekstid<br />

ümberomistatakse.<br />

Stringide omistamiseks sõlmedesse ja stringide võrdlemisel tuleb kasutada stringide töötlemise<br />

funktsioone (vt stringid.c). Kasutajalt “jah”-e ja “ei”-sid küsides võiks piirduda 'j' ja 'e'-ga ning<br />

kasutada char-tüüpi muutujat, mida saab “normaalselt” võrrelda.<br />

jah<br />

Suur<br />

loomad<br />

ei<br />

Karvane<br />

NULL<br />

Hiir<br />

NULL<br />

abi<br />

NULL<br />

Karu<br />

NULL<br />

Elevant<br />

Lont on<br />

Jõehobu<br />

NB!<br />

Veel üks tähelepanek C-keele kohta: oleme seni valdavalt scanf() käsuga andmeid sisestanud.<br />

Stringide sisestamisel tekivad aga probleemid, sest scanf(“%s”,&kysimus); loeb sisendit<br />

kuni esimese tühikuni (mis tervikliku küsimuse puhul ei ole hea). Terve küsimuse sisestamiseks<br />

võiks kasutada käsku gets(kysimus); (mõeldud vaid stringidele, puudub formaat ja aadressi<br />

märk muutuja ees).<br />

Ja lõpuks: näidete viite alt leiad “Funktsioonid loomade arvamise jaoks “, kus on hulk funktsioone<br />

antud ülesande lahendamiseks.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!