Sukupuu -ohjelma Ossi Väre (013759021) Joni Virtanen (013760641) 7.11.2011
1 Johdanto Toteutimme C -kielellä sukupuuohjelman, johon käyttäjä voi lisätä ja poistaa henkilöitä ja määrittää henkilöiden välisiä suhteita. Sukupuun sisältämät tiedot voidaan myös tallettaa JSON -muotoiseen tiedostoon, josta ne voidaan ohjelman käynnistyksen yhteydessä myös lukea. Ohjelma lienee kasvanut liian suureksi tavoitteeseen verrattuna. 1
2 Ohjelman rakenne 2.1 FamilyTree (Sukupuu) Sukupuu on talletettu ohjelmassa dynaamisena taulukkona, jossa henkilöt pidetään nimen mukaan aakkosjärjestyksessä ja haetaan binäärihaulla. 2.2 Person (Henkilö) Henkilöt sisältävät tiedon henkilön nimestä, sukupuolesta ja syntymä- ja kuolinpäivistä. Henkilöiden väliset relaatiot on tallennettu dynaamisena taulukkona. 2.3 Relation (Suhde) Suhteeseen talletetaan henkilöt person1 ja person2, sekä suhteen tyyppi. Suunnatuissa suhteissa (vanhempi-lapsi -suhde) suhteen suunta on aina person1 person2. Kun henkilölle lisätään suhde toiseen henkilöön, lisätään viite samaan suhteeseen toiselle henkilölle. Jos suhteen kumpi tahansa osapuoli poistetaan sukupuusta, poistetaan samalla myös suhde. 2.4 Date (Päivämäärä) Päivämäärä sisältää päivän, kuukauden sekä vuoden. 2
2.5 Aputiedostot 2.5.1 jsonparser.c JSON parseri osaa lukea sukupuun tiedot JSON -tyyppisestä tiedostosta. Tiedot talletetaan JSON tiedostoihin sisäkkäisinä hash table ja array rakenteina. 2.5.2 leio.c Tässä tiedostossa on funktiot JSON -parserin palauttaman hashtaulun muuttamiseen henkilöiksi ja suhteiksi, jotka talletetaan sukupuuhun. Myös sukupuun talletusfunktio on tässä tiedostossa. 2.5.3 hashtable.c Hash tablea käytetään avuksi tiedostoa luettaessa. 2.5.4 dynarray.c Dynaaminen void*-tyyppinen taulukko, jota käytetään useassa kohtaa ohjelmaa. Sisältää mm. binäärihaun ja funktion, jolla voidaan lisätä dataa taulukkoon niin, että se pysyy järjestyksessä. 2.5.5 colours.c Sisältää käyttöliittymän toteutuksessa käytettäviä funktioita. 3
3 Käyttöohje 3.1 Komentoriviparametrit Ohjelmalle voi ajaessa antaa JSON-tiedoston jossa on aiemmin luotu sukupuu. Tämä tapahtuu antamalla ohjelmalle parameitreina -f <tiedostonimi>. Lisäksi voit katsoa ohjeet antamalla parametrina -h 3.2 Ohjelman käyttö Ohjelma avautuu 80x24 kokoiseen käyttöliittymään jossa on lista käytettävistä toiminnoista. Toimintoja käytetään kirjaimilla jotka ovat listan kohtien edellä (esim a, b, c jne.) 3.2.1 Päävalikon toiminnot a. Lisää Henkilö Voit lisätä uuden henkilön `yksinäisenä' ihmisenä sukupuuhun.(huom! jos haluat lisätä ihmisen jonkun lapseksi katso päälistan kohtien jälkeen: Yhden henkilön tietojen muutto tai tarkastelu: kohta c). Valinnan jälkeen syötät uuden henkilön tiedot, jonka jälkeen henkilö on lisätty. b. Poista Henkilö Voit poistaa henkilön sukupuusta valitsemalla sen listasta. c. Listaa Henkilöt Tällä listataan sukupuun henkilöt aakkosjärjestyksessä listaan, jonka jälkeen voit tarkastella (tai muuttaa) yhden henkilön tietoja tarkemmin valitsemalla henkilön sen edessä olevalla numerolla. Pääset pois listasta antamalla komennon q jolla pääset takaisin alun valikkoon. d. Tallenna tiedostoon Voit tallentaa jo tehdyn sukupuun valitsemaasi tiedostoon (jos et anna tiedostonimeä tiedosto tallentuu FamilyTree.json tiedostoon). Tämänkään jälkeen muutokset eivät tallennu automaattisesti, joten on muistettava tallentaa uudelleen. q. Lopeta Poistuu ohjelmasta. 4
3.2.2 Yhden henkilön tietojen muutto tai tarkastelu Henkilöiden listauksesta pääsee tarkastelemaan ja muuttamaan yksittäisen henkilön tietoja: a. Muuta syntymäpäivää Muuttaa henkilön syntymäpäivää. b. Muuta kuolinpäivää Lisää tai muuttaa henkilön kuolinpäivää c. Lisää lapsi Lisää lapsen valitulle henkilölle. Toinen vanhempi valitaan lapsen tietojen syötön jälkeen. Voit lisätä lapsen yksinhuoltajalle valitsemalla 'q' toista vanhempaa valittaessa. d. Lisää suhde Lisää suhteen (avo- tai aviopari) valitun henkilön ja toisen listasta valitun henkilön välille. e. Näytä jälkeläiset Listaa kaikki henkilön jälkeläiset. f. Näytä esivanhemmat Listaa kaikki henkilön esivanhemmat. g. Näytä puoliso(t) Listaa henkilön puolison(/t) h. Näytä avoliitot Listaa kaikki henkilön avoliitot. 5
4 Testaus Ohjelma testattiin CUnit -kirjaston avulla toteutetuilla yksikkötesteillä. Valitettavasti aika ei riittänyt ottaman selvää, miten CUnit kirjasto saataisiin järkevästi pakattua projektin mukaan, joten testien tulosteet löytyvät liitteestä 1. Jos CUnit kirjasto kuitenkin löytyy, voidaan testit suorittaa komennolla make build-tests ja tämän jälkeen make test. Käyttöliittymään ja tiedostojen käsittelyyn liittyvää koodia ei testattu yksikötesteillä. Myöskään funktioita, jotka vain kutsutvat toista funktiota tai luovat uuden olion 'ei testattu. FamilyTree -tiedoston funktiot tulevat implisiittisesti testatuksi muissa testitiedostoissa, joten näillekään ei ole omaa testiä. Ohjelmaa testattiin myös manuaalisesti koko kehitysprosessin ajan ajamalla se valgrind -komennon läpi, ja ohjelmassa ei pitäisi esiintyä muistin vuotoa tai laittomia muistiviittauksia. 6
5 Liitteet 5.1 Liite 1 - Yksikkötestien tulokset Tuloksien ulkonäköä on muokattu luettavuuden parantamiseksi. CUnit - A Unit testing framework for C - Version 2.1-0 http://cunit.sourceforge.net/ --Run Summary: Type Total Ran Passed Failed datetest.c: tests 3 3 3 0 asserts 7 7 7 0 dynarraytest.c: tests 4 4 4 0 asserts 95 95 95 0 hashtabletest.c: tests 1 1 1 0 asserts 4 4 4 0 persontest.c: tests 13 13 13 0 asserts 48 48 48 0 relationtest.c: tests 3 3 3 0 asserts 13 13 13 0 7