Harjoitustyö 2: Henkilötietojärjestelmä

Samankaltaiset tiedostot
Harjoitustyö 1: Palkkatilastot

Harjoitustyö 3: It's a social network, baby!

Harjoitustyö 1: Kaupungit

Harjoitustyö 2: Game of Taxes

Harjoitustyö 1: Beacons of RGB

Harjoitustyö 3: Roads are coming

Harjoitustyö 2: Game of Fibres

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).

Ohjelmoinnin jatkokurssi, kurssikoe

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

TAMPEREEN TEKNILLINEN YLIOPISTO

TAMPEREEN TEKNILLINEN YLIOPISTO

Harjoitustyö 3 - Millosemeni

ITKP102 Ohjelmointi 1 (6 op)

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Hakemistojen sisällöt säilötään linkitetyille listalle.

Tietorakenteet ja algoritmit - syksy

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

ITKP102 Ohjelmointi 1 (6 op)

811120P Diskreetit rakenteet

Maahan on pudonnut omenoita, ja Uolevi aikoo poimia niitä. Tiedät jokaisesta omenasta, kuinka painava se on.

58131 Tietorakenteet ja algoritmit (syksy 2015)

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

Olio-ohjelmointi Syntaksikokoelma

ITKP102 Ohjelmointi 1 (6 op)

Harjoitus 6 (viikko 42)

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu

Lausekielinen ohjelmointi II Ensimmäinen harjoitustyö

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Zeon PDF Driver Trial

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Metropolia ammattikorkeakoulu TI00AA : Ohjelmointi Kotitehtävät 3 opettaja: Pasi Ranne

Toinen harjoitustyö. ASCII-grafiikkaa

Harjoitus 3 (viikko 39)

f(n) = Ω(g(n)) jos ja vain jos g(n) = O(f(n))

Ohjelmoinnin perusteet, kurssikoe

Ohjelmoinnin perusteet Y Python

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Algoritmit 1. Demot Timo Männikkö

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Rajapinta (interface)

Ohjelmoinnin perusteet Y Python

Harjoitus 5. Esimerkki ohjelman toiminnasta: Lausekielinen ohjelmointi I Kesä 2018 Avoin yliopisto 1 / 5

Ohjelmoinnin perusteet Y Python

Algoritmit 1. Luento 12 Ti Timo Männikkö

Harjoitus 5 (viikko 41)

Tietorakenteet (syksy 2013)

Algoritmit 1. Luento 1 Ti Timo Männikkö

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2

Harjoitustyö: virtuaalikone

ITKP102 Ohjelmointi 1 (6 op)

Algoritmit 2. Luento 2 To Timo Männikkö

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Harjoitus 6. Käytä String-luokasta vain charat- ja length-operaatioita.

Taulukot. Jukka Harju, Jukka Juslin

Ohjelmointi 1 C#, kevät 2013, 2. tentti

Luento 5. Timo Savola. 28. huhtikuuta 2006

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Algoritmit 1. Luento 3 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

Rakenteiset tietotyypit Moniulotteiset taulukot

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Sisältö. 22. Taulukot. Yleistä. Yleistä

Numeropelissä 3x3-ruudukko sisältää luvut 1, 2,, 9. Tehtäväsi on järjestää ruudukko näin:

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Harjoitus 4 (viikko 47)

Tietorakenteet, laskuharjoitus 3, ratkaisuja

Algoritmit 1. Demot Timo Männikkö

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

1. Mitä tehdään ensiksi?

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Sisältö. 2. Taulukot. Yleistä. Yleistä

Algoritmit 1. Luento 12 Ke Timo Männikkö

5. HelloWorld-ohjelma 5.1

Listarakenne (ArrayList-luokka)

Metropolia ammattikorkeakoulu TI00AA : Ohjelmointi Kotitehtävät 3

Algoritmit 2. Luento 1 Ti Timo Männikkö

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

13 Operaattoreiden ylimäärittelyjä

Toinen harjoitustyö. ASCII-grafiikkaa 2017

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

2 Konekieli, aliohjelmat, keskeytykset

Ohjelmointi Tunnilla 1 (5) Viikko 7 tuntitehtäviä: metodien tekeminen Javalla

Ohjelmoinnin perusteet Y Python

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Algoritmit 2. Luento 2 Ke Timo Männikkö

7. Näytölle tulostaminen 7.1

4. Luokan testaus ja käyttö olion kautta 4.1

A TIETORAKENTEET JA ALGORITMIT

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

Transkriptio:

TIE-20100 Tietorakenteet ja algoritmit, kevät 2017 Harjoitustyö 2: Henkilötietojärjestelmä Viimeksi päivitetty 31.03.2017 Huom. koska tämä harjoitustyö pohjautuu aiempaan harjoitustyöhön, on allaolevassa merkitty harmaalla pohjalla kaikki muuttuneet / uudet asiat. Harjoitustyön aihe Tässä harjoitustyössä ensimmäisen harjoitustyön ohjelmaa laajennetaan niin, että se osaa käsitellä myös ihmisten esimiessuhteita ja muutamia muita uusia asioita. Työntekijöiden yksilöiminen tehdään nyt yksikäsitteisen ID-tunnisteen avulla. Ohjelmalla saa myös haettua palkkoihin liittyviä tunnuslukuja, joita ihan oikeastikin käytetään: minimi- ja maksimipalkan, mediaanipalkan sekä palkkakvartiilit (tunnuslukujen määritelmät löytyvät myöhemmin tästä ohjeesta). (Kiinnostuneille: mediaanit ja kvartiilit kertovat palkoista enemmän kuin keskiarvo ja keskihajonta, koska palkkojen suuruudet ovat yleensä todella epätasaisesti jakautuneita, jolloin esim. pieni määrä miljardöörejä saa keskiarvon nousemaan hämäävän suureksi "normaaleihin" palkkoihin verrattuna). Koska kyseessä on Tietorakenteiden ja algoritmien harjoitustyö, ohjelman tehokkuus on tärkeä arvostelukriteeri. Tavoitteena on tehdä mahdollisimman tehokkas toteutus, kun oletetaan että kaikki ohjelman tuntemat komennot ovat suunnilleen yhtä yleisiä (ellei komentotaulukossa toisin mainita). Plussaa tietysti saa, mitä tehokkaammin operaatiot pystyy toteuttamaan. Huomaa erityisesti seuraavat: Vihje tehokkuudesta: Jos minkään operaation keskimääräinen tehokkuus on huonompi kuin ϴ(nlog n), ratkaisun tehokkkuus ei ole hyvä. Suurin osa operaatioista on mahdollista toteuttaa paljon nopeamminkin. Osana ohjelman palautusta palautetaan git:ssä dokumentti nimeltä "readme.pdf", jossa perustellaan toteutuksessa käytetyt tietorakenteet tehokkuuden kannalta. Siinä luetellaan myös oma arvio kunkin toteutetun operaation tehokkuudesta O-notaatiolla. Operaatioiden remove(), nearest_common_boss() ja higher_lower_ranks() toteuttaminen ei ole pakollista läpipääsyn kannalta. Ne ovat kuitenkin osa arvostelua, joten toteuttamatta jättäminen vaikuttaa työn arvosanaan! Tehokkuudessa olennaisinta on, miten ohjelman tehokkuus muuttuu datan kasvaessa, eivät pelkät sekuntimäärät. Operaation tehokkuuteen lasketaan kaikki siihen liittyvä työ, myös mahdollisesti alkioiden lisäyksen yhteydessä tehty operaatioon liittyvä työ. Plussaa tietysti saa, jos operaatioita saa toteutettua vaadittua mahdollisimman tehokkasti.

Samoin plussaa saa, mitä nopeammaksi operaatiot saa sekunteinakin (jos siis kertaluokka on vähintään vaadittu). Mutta plussaa saa vain tehokkuudesta, joka syntyy omista algoritmivalinnoista ja suunnittelusta. (Esim. kääntäjän optimointivipujen vääntely, rinnakkaisuuden käyttö, häkkerioptimoinnilla kellojaksojen viilaaminen eivät tuo pisteitä.) Riittävän huonolla toteutuksella työ voidaan hylätä. Esimerkkejä kysymyksistä, joilla tehokkuutta voi usein parantaa: Tehdäänkö jokin asia turhaan useaan kertaan? Voiko jonkin asian joskus jättää kokonaan tekemättä? Tehdäänkö joissain työtä enemmän kuin on välttämättä tarpeen? Voiko jonkin asian tehdä "lähes ilmaiseksi" samalla, kun tehdään jotain muuta? Harjoitustyössä käytetyt tunnuslukujen määritelmät Tässä harjoitustyössä palkkojen vertailuissa käytetään seuraavia tunnuslukuja. Harjoitustyön yksinkertaistamiseksi niiden määritelmiä on hieman yksinkertaistettu. Alla "palkkajärjestys" tarkoittaa järjestystä pienimmäistä palkasta suurimpaan. Minimi / maksimi: Henkilö, jolla on pienin/suurin palkka. Jos tällaisia henkilöitä on useita, palautetaan jokin heistä. Mediaani: Palkkajärjestyksessä keskimmäinen henkilö. Tässä harjoitustyössä palkkajärjestyksessä henkilö indeksillä n. ( x on pyöristys alaspäin eli C++:n 2 normaali kokonaislukujakolaskun tapa pyöristää.). Ensimmäinen kvartiili: Palkkajärjestyksessä neljäsosan kohdalla oleva henkilö. Tässä harjoitustyössä palkkajärjestyksessä henkilö indeksillä n 4. Kolmas kvartiili: Palkkajärjestyksessä kolmannen neljäsosan kohdalla oleva henkilö. Tässä harjoitustyössä palkkajärjestyksessä henkilö indeksillä (3n) 4. Järjestämisestä Työntekijöitä järjestettäessä on mahdollista, että palkan mukaan järjestettäessä usealla on sama palkka (tai nimijärjestyksessä nimi). Tällaisten tapausten keskinäinen järjestys on mielivaltainen. Ohjelman hyväksymissä nimissä voi olla vain kirjaimia A-Z, a-z ja sanavälejä. Järjestämisen voi tehdä joko C++:n string-luokan vertailuoperaattorin "<" mukaan (jossa sanaväli tulee ennen kirjaimia ja isot kirjaimet tulevat ennen pieniä) tai "oikealla tavalla", jossa vastaavat isot ja pienet kirjaimet ovat samanarvoisia, mutta sanaväli tulee edelleen ennen muita kirjaimia. Työntekijöiden ID:iden järjestämisessä tulee käyttää C++:n string-luokan "<"-vertailua. Harjoitustyön toteuttamisesta ja C++:n käytöstä Tämän harjoitustyön tarkoituksena on opetella valmiiden tietorakenteiden ja algoritmien käyttöä, joten C++:n STL:n käyttö on erittäin suotavaa ja osa arvostelua. Mitään erityisiä rajoituksia C++:n

standardikirjaston käytössä ei ole. Luonnollisesti kielen ulkopuolisten kirjastojen käyttö ei ole sallittua (esim. Windowsin omat kirjastot tms.). HUOMAA, että koska tämän harjoitustyön tarkoituksena on harjoitella STL:n käyttöä, on erittäin todennäköistä, että ensimmäisen harjoitustyön tietorakenneratkaisusi EI ole paras mahdollinen tässä harjoitustyössä. Samoin kannattaa harkita, missä kohdin ensimmäisessä harjoitustyössä itse toteutettuja algoritmeja voi korvata STL:n valmiilla algoritmeilla! Ohjelman toiminta ja rakenne Osa ohjelmasta tulee valmiina kurssin puolesta, osa toteutetaan itse. Valmiit osat, jotka tarjotaan kurssin puolesta Tiedosto main.cpp (johon EI SAA TEHDÄ MITÄÄN MUUTOKSIA) Pääohjelma, joka hoitaa syötteiden lukemisen, komentojen tulkitsemisen ja tulostusten tulostamisen. Pääohjelmassa on myös valmiina komentoja testaamista varten. Tiedosto datastructure.hpp class Datastructure: Luokka, johon harjoitustyö kirjoitetaan. Luokasta annetaan valmiina sen julkinen rajapinta (johon EI SAA TEHDÄ MITÄÄN MUUTOKSIA) Tyyppimäärittely Salary: kokonaisluku. Määritelty myös vakio NO_SALARY esim. tilanteita varten, joissa palkka ei ole tiedossa Tyyppimäärittely PersonID: merkkijono, joka koostaa numeroista 0-9 ja kirjaimista välillä a-z tai A-Z. Määritelty myös vakio NO_ID, jota käytetään paluuarvona jos henkilöä ei löydy. Tiedosto datastructure.cpp Funktio random_in_range: Ykkösharjoitustyön tapaan arpoo luvun annetulla välillä (alku- ja loppuarvo ovat molemmat välissä mukana). Harjoitustyönä toteutettavat osat Tiedostot datastructure.hpp ja datastructure.cpp class Datastructure: Luokan julkisen rajapinnan jäsenfunktiot tulee toteuttaa. Luokkaan saa listätä omia määrittelyitä (jäsenmuuttujat, uudet jäsenfunktiot yms.) Huom! Omassa koodissa ei ole tarpeen tehdä ohjelman varsinaiseen toimintaan liittyviä tulostuksia, koska pääohjelma hoitaa ne. Mahdolliset Debug-tulostukset kannattaa tehdä cerr-virtaan, jotta ne eivät sotke testejä. Ohjelman tuntemat komennot ja luokan julkinen rajapinta Kun ohjelma käynnistetään, se näyttää komentokehotteen ">" ja jää odottamaan komentoja, jotka on selitetty alla. Komennot, joiden yhteydessä mainitaan jäsenfunktio, kutsuvat ko. Datastructure-

luokan operaatioita, jotka siis opiskelijat toteuttavat. Osa komennoista on taas toteutettu kokonaan kurssin puolesta pääohjelmassa. Jos ohjelmalle antaa komentoriviltä tiedoston parametriksi, se lukee komennot ko. tiedostosta ja lopettaa sen jälkeen. Komento Julkinen jäsenfunktio add 'nimi' id 'titteli' palkka void add_person(string name, PersonID id, string title, Salary salary); remove id void remove_person(personid id); add_boss id bossid void add_boss(personid id, PersonID bossid); (no command) string get_name(personid id); (no command) string get_title(personid id); (no command) Salary get_salary(personid id); size unsigned int size(); clear void clear(); find 'name' vector<personid> find_persons(string name); titlelist 'title' vector<personid> personnel_with_title(string title); change_name id 'new name' void change_name(personid id, string new_name); Selitys Lisää tietorakenteeseen työntekijän annetulla nimellä, uniikilla id:llä, tittelillä ja palkalla. Aluksi työntekijälle ei ole esimiestä. Poistaa annetulla ID:llä olevan työntekijän. Jos työntekijää ei ole lisätty, ei tee mitään. Jos poistettavalla työntekijällä on suoria alaisia, alaiset siirtyvät poistetun työntekijän pomon suoriksi alaisiksi. Jos pomoa ei ole, ei suorille alaisillekaan jää pomoa poiston jälkeen. Jos annetulla ID:llä ei löydy työntekijää, ei tehdä mitään. Tämän komennon toteutus ei ole pakollinen (mutta se vaikuttaa arvosteluun). Lisää työntekijälle esimiehen. Työntekijälle voi olla vain yksi esimies. Työssä saa olettaa, että esimiessuhteet eivät voi muodostaa silmukoita (ts. työntekijä ei voi olla suoraan tai epäsuorasti itsensä pomo). Palauttaa annetulla ID:llä olevan työntekijän nimen. (Pääohjelma kutsuu tätä eri paikoissa.) Tätä operaatiota kutsutaan useammin kuin muita. Palauttaa annetulla ID:llä olevan työntekijän tittelin. (Pääohjelma kutsuu tätä eri paikoissa.) Tätä operaatiota kutsutaan useammin kuin muita. Palauttaa annetulla ID:llä olevan työntekijän palkan. (Pääohjelma kutsuu tätä eri paikoissa.) Tätä operaatiota kutsutaan useammin kuin muita. Palauttaa tietorakenteessa olevien työntekijöiden lukumäärän. Tyhjentää tietorakenteen (tämän jälkeen size palauttaa 0). Palauttaa listan henkilöistä, joilla on annettu nimi. Lista on järjestettävä nousevan ID:n mukaiseen järjestykseen. Palauttaa listan henkilöistä, joilla on annettu titteli. Lista on järjestettävä nousevan ID:n mukaiseen järjestykseen. Tätä operaatiota kutsutaan harvoin, eikä se ole mukana tehokkuustestissä. Muuttaa annetulla ID:llä olevan henkilön nimen.

Komento Julkinen jäsenfunktio change_salary id newsalary void change_salary(personid id, Salary new_salary); alphalist vector<personid> personnel_alphabetically(); salarylist vector<personid> personnel_salary_order(); min PersonID min_salary(); max PersonID max_salary(); median PersonID median_salary(); 1stquartile PersonID first_quartile_salary(); 3rdquartile PersonID third_quartile_salary(); underlings id vector<personid> underlings(personid id); ceo PersonID find_ceo(); nearest_common_boss id1 id2 PersonID nearest_common_boss(personid id1, PersonID id2); higher_lower_ranks id pair<unsigned int, unsigned int> higher_lower_ranks(personid id); Selitys Muuttaa annetulla ID:llä olevan henkilön palkan. Palauttaa työntekijät nimen mukaan aakkosjärjestyksessä. Palauttaa työntekijät palkan mukaan suuruusjärjestyksessä (pienin ensin). Palauttaa työntekijän, jolla on pienin palkka (ks. ohjeista minimin määritelmä tässä työssä). Palauttaa työntekijän, jolla on suurin palkka (ks. ohjeista maksimin määritelmä tässä työssä). Palauttaa työntekijän, jolla on mediaanipalkka eli palkkajärjestyksessä keskimmäisen (ks. ohjeista mediaanin määritelmä tässä työssä). Palauttaa työntekijän, jolla on 1. kvartiilipalkka eli palkkajärjestyksessä neljäsosan kohdalla (ks. ohjeista kvartiilien määritelmä tässä työssä). Palauttaa työntekijän, jolla on 3. kvartiilipalkka eli palkkajärjestyksessä kolmen neljäsosan kohdalla (ks. ohjeista kvartiilien määritelmä tässä työssä). Komento tulostaa sisennettynä listan työntekijän alaisista ja heidän alaisistaan. HUOM! Itse jäsenfunktio palauttaa ainoastaan listan työntekijän välittömistä alaisista. Lista on järjestettävä nousevan ID:n mukaiseen järjestykseen. Pääohjelma käyttää jäsenfunktiota rekursiivisesti hierarkian tulostamiseen. Palauttaa organisaation pääjohtajan (jonka alaisia kaikki suoraan tai epäsuorasti ovat) ja varmistaa, että organisaatiolla on tasan yksi tällainen pääjohtaja. Jos ei ole, palauttaa NO_ID. Palauttaa kahden työntekijän lähimmän yhteisen esimiehen tai NO_ID, jos sellaista ei ole. Tämän komennon toteutus ei ole pakollinen (mutta se vaikuttaa arvosteluun). Palauttaa parin, jonka ensimmäinen luku kertoo, kuinka monta tasoltaan suurempaa työntekijää organisaatiohierarkiassa on, ja toinen luku kertoo, kuinka monta pienempää. Pääjohtajan taso on korkein, hänen alaistensa yhtä alempi jne. Jos organisaatio ei muodosta yhtä yksikäsitteistä hierarkiaa, on määrittelemätöntä mitä palautetaan. Tämän komennon toteutus ei ole pakollinen (mutta se vaikuttaa arvosteluun).

Komento Julkinen jäsenfunktio random_add n random_seed n read 'tiedostonimi' stopwatch on / off / next perftest all/compulsory/cmd1;cmd2... timeout n n1;n2;n3... testread 'in-tiedostonimi' 'out-tiedostonimi' help quit Selitys Lisää tietorakenteeseen (testausta varten) n kpl työntekijöitä, joilla on satunnainen id, nimi, tittleli ja palkka, ja jokaiselle satunnaisen pomon. Huom! Arvot ovat tosiaan satunnaisia, eli saattavat olla kerrasta toiseen eri. Asettaa pääohjelman satunnaislukugeneraattorille uuden siemenarvon. Oletuksena generaattori alustetaan joka kerta eri arvoon, eli satunnainendata on eri ajokerroilla erilaista. Siemenarvon asettamalla arvotun datan saa toistumaan samanlaisena kerrasta toiseen (voi olla hyödyllista debuggaamisessa). Lukee lisää komentoja annetusta tiedostosta. (Tällä voi esim. lukea listan tiedostossa olevia työntekijöitä tietorakenteeseen, ajaa valmiita testejä yms.) Aloittaa tai lopettaa komentojen ajanmittauksen. Ohjelman alussa mittaus on pois päältä ("off"). Kun mittaus on päällä ("on"), tulostetaan jokaisen komennon jälkeen siihen kulunut aika. Vaihtoehto "next" kytkee mittauksen päälle vain seuraavan komennon ajaksi (kätevää read-komennon kanssa, kun halutaan mitata vain komentotiedoston kokonaisaika). Ajaa ohjelmalle tehokkuustestit. Tyhjentää tietorakenteen ja lisää sinne n1 kpl satunnaisia työntekijöitä. Sen jälkeen arpoo n kertaa satunnaisen komennon. Mittaa ja tulostaa sekä lisäämiseen että komentoihin menneen ajan. Sen jälkeen sama toistetaan n2:lle jne. Jos jonkin testikierroksen suoritusaika ylittää timeout sekuntia, keskeytetään testien ajaminen (tämä ei välttämättä ole mikään ongelma, vaan mielivaltainen aikaraja). Jos ensimmäinen parametri on all, arvotaan lisäyksen jälkeen kaikkista komennoista. Jos se on compulsory, testataan vain komentoja, jotka on pakko toteuttaa. Jos parametri on lista komentoja, arvotaan komento näiden joukosta (tällöin kannattaa mukaan ottaa myös random_add, jotta lisäyksiä tulee myös testikierroksen aikana). Ajaa toiminnallisuustestin ja vertailee tulostuksia. Lukee komennot tiedostosta in-tiedostonimi ja näyttää ohjelman tulostuksen rinnakkain tiedoston outtiedostonimi sisällön kanssa. Jokainen eroava rivi merkitään kysymysmerkillä, ja lopuksi tulostetaan vielä tieto, oliko eroavia rivejä. Tulostaa listan tunnetuista komennoista. Lopettaa ohjelman. (Tiedostosta luettaessa lopettaa vain ko. tiedoston lukemisen.)

"Datatiedostot" Kätevin tapa testata ohjelmaa on luoda "datatiedostoja", jotka add-komennolla lisäävät joukon työntekijöitä ohjelmaan. Työntekijät voi sitten kätevästi lukea sisään tiedostosta read-komennolla ja sitten kokeilla muita komentoja ilman, että työntekijät täytyisi joka kerta syöttää sisään käsin. Alla on esimerkki datatiedostosta, joka löytyy nimellä example-data.txt: # Adding people add 'Meikkis Matti' mm 'basic worker' 2000 add 'Teikkis Terttu' tt 'technical evangelist' 4000 add 'Miljoona Miikka' richbastard 'commander' 1000000 add 'Sorrettu Sami' doesall 'general utility' 1 add 'Keskiverto Keijo' kk1 'basic worker' 3000 add 'Kukalie Kirsi' kk2 'basic worker' 2500 add 'Olematon Oskari' nobody 'useless' 6000 # Adding boss relationships add_boss mm richbastard add_boss doesall mm add_boss nobody mm add_boss tt richbastard add_boss kk1 tt add_boss kk2 tt

Esimerkki ohjelman toiminnasta Alla on esimerkki ohjelman toiminnasta. Esimerkin syöte löytyy tiedostosta example-in.txt ja alla oleva tulostus tiedostosta example-out.txt. Eli voit testata esimerkin toimimista käynnistämällä ohjelman ja antamalla komennon testread 'example-in.txt' 'example-out.txt'. > clear Cleared all persons > size Number of employees: 0 > read 'example-data.txt' ** Commands from 'example-data.txt' > # Adding people > add 'Meikkis Matti' mm 'basic worker' 2000 > add 'Teikkis Terttu' tt 'technical evangelist' 4000 > add 'Miljoona Miikka' richbastard 'commander' 1000000 > add 'Sorrettu Sami' doesall 'general utility' 1 > add 'Keskiverto Keijo' kk1 'basic worker' 3000 > add 'Kukalie Kirsi' kk2 'basic worker' 2500 > add 'Olematon Oskari' nobody 'useless' 6000 > # Adding boss relationships > add_boss mm richbastard > add_boss doesall mm > add_boss nobody mm > add_boss tt richbastard > add_boss kk1 tt > add_boss kk2 tt > ** End of commands from 'example-data.txt' > size Number of employees: 7 > min id doesall : general utility Sorrettu Sami, salary 1 > max > median id kk1 : basic worker Keskiverto Keijo, salary 3000 > find 'Keskiverto Keijo' id kk1 : basic worker Keskiverto Keijo, salary 3000 > salarylist id doesall : general utility Sorrettu Sami, salary 1 id kk2 : basic worker Kukalie Kirsi, salary 2500 id kk1 : basic worker Keskiverto Keijo, salary 3000 id tt : technical evangelist Teikkis Terttu, salary 4000 id nobody : useless Olematon Oskari, salary 6000 > 1stquartile > 3rdquartile id nobody : useless Olematon Oskari, salary 6000 > change_name kk1 'Kaikenlainen Kaija'

id kk1 : basic worker Kaikenlainen Kaija, salary 3000 > alphalist id kk1 : basic worker Kaikenlainen Kaija, salary 3000 id kk2 : basic worker Kukalie Kirsi, salary 2500 id nobody : useless Olematon Oskari, salary 6000 id doesall : general utility Sorrettu Sami, salary 1 id tt : technical evangelist Teikkis Terttu, salary 4000 > change_salary tt 1500 id tt : technical evangelist Teikkis Terttu, salary 1500 > ceo > underlings richbastard id doesall : general utility Sorrettu Sami, salary 1 id nobody : useless Olematon Oskari, salary 6000 id tt : technical evangelist Teikkis Terttu, salary 1500 id kk1 : basic worker Kaikenlainen Kaija, salary 3000 id kk2 : basic worker Kukalie Kirsi, salary 2500 > # AFTER THIS NON-COMPULSORY PARTS ARE TESTED > nearest_common_boss doesall nobody > higher_lower_ranks mm Persons with higher rank (closer to ceo): 1 Persons with lower rank (further away from ceo): 4 > remove kk2 > size Number of employees: 6 > titlelist 'basic worker' id kk1 : basic worker Kaikenlainen Kaija, salary 3000 > quit