Algoritmit ja tietorakenteet TM01S / Kevät 2004 Tehtävä 2. Vaihe 1. (Toteutus "mustaan laatikkoon" eli Ohjelman jakaminen eri tiedostoihin) Jaa tehtävän 1 ohjelma eri tiedostoihin: time.h, time.c ja prosessiajat.c. Käännä erikseen time.c ja "hävitä" sitten time.c. Rakenna sovellus (prosessiajat.exe) käyttäen vain ajan interfacea (time.h) ja sen toteutusta mustana laatikkona (time.obj). Vaihe 2. (Sovellus on riippumaton komponentin toteutuksesta) Näimme tunnilla myös, että yksi tämän komponenttiajattelun eduista on se, että komponenttia käyttävät ohjelman osat ovat riippu- mattomia komponentin sisäisestä toteutuksesta (tässä esimerkissä ajan sisäisestä esitystavasta). Osoita tämä asia itsellesi muutta- malla ajan sisäiseksi esitysmuodoksi aika minuutteina keskiyöstä. Tämän saat aikaan määrittelemällä tietotyypin Time uudelleen muodossa typedef int Time otsikkotiedossa time.h ja kirjoittamalla uudet toteutukset ajan funktioille. On hyödyllistä pitää tallessa molemmat toteutukset, koska sovellusten kannalta ne ovat täysin vaihtokelpoisia. Tämän takia kannattaa siis tallentaa uuden määrittelyn sisältävä header toiseen tiedostoon, esimerkiksi tiedostoon time2.h ja ajan uusien funktioiden toteutukset tiedostoon time2.c (jolloin uusi objektitiedosto on sitten time2.obj). Laita sitten entinen sovelluksesi toimimaan tällä uudella aikakomponentilla. Älä muuta aikaisemmin tekemääsi main funktiota ollenkaan. Ainoat asia, jotka tarvitaan, jotta uusi aika- komponentti saadaan mukaan sovellukseen ovat seuraavat kaksi asiaa: 1) main-funktion sisältävään (sovellus-) tiedostoon incluudataan tiedosto time2.h tiedoston time.h sijasta ja se käännetään. 2) Linkataan sovellukseen uusi toteutus eli tiedosto time2.obj tiedoston time.obj sijasta. Huomautus 1. Halutaan myös, että käyttäjille aika on edelleen tunteja ja minuutteja ts. käyttäjä syöttää ajan tunteina ja minuutteina ja kun aika esitetään näytössä, se on tutussa muodossa tunteina ja minuutteina. Huomatus 2. Avainasia jolla sovellus pidetään riippumattomana komponentin sisäisestä toteutuksesta on se, että interface säilyy (ja sovellus käyttää komponenttia vain interfacen kautta). Älä siis muuta ajan funktioiden prototyyppejä. Ylimääräinen tehtävä (ei pakollinen) Vaihe 3. (Komponentin uudelleenkäytettävyys erilaisessa sovelluksessa) Käytä adt aikaa (ilman minkäänlaista muutosta) ja rakenna uusi sovellus. Nyt voit vapaasti käyttää kumpaa tahansa ajan toteutusta, koska sillä ei ole mitään vaikutusta itse sovellukseen. Uuden sovelluksen pitää toimia seuraavalla tavalla. Pitkän matkan juoksussa kilpailijoiden maksimimäärä on 10. Kun kaikki juoksijat ovat tulleet maaliin, heidän juoksuaikansa syötetään järjestelmään siinä järjestyksessä kuin heidän nimensä ovat osanottajalistassa. Tämän takia ajat eivät ole suuruus- järjestyksessä. Kirjoita ohjelma, joka ensin lukee nämä juoksuajat ja sen jälkeen etsii pienimmän ajan (voittajan ajan) ja suurimman ajan (viimeisen kilpailijan ajan). Lopuksi ohjelma tulostaa kaikki ajat ja ja suurimman ja pienimmän ajan erotuksen. Huomautus. Muista edelleen käyttää vain ajan interfacea äläkä siis riko ns. hyvän ohjelmointitavan sääntöä. Voit myös tehdä tästä ohjelmasta edistyneemmän version, joka järjestää ajat suuruusjärjestykseen.