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.