Harjoitustyö 3 - Millosemeni Tampereen kaupunki tarjoaa avoin data -sivuillaan Tampereen joukkoliikenteen aikataulut, reitit sekä rajapinnan joukkoliikenteen reaaliaikaiseen seurantaan. Näinpä erilaisille alustoille on syntynyt käteviä joukkoliikennepalveluita. Sinun tehtäväsi on toteuttaa pieni nopeimman reitin hakuapuri, jolla voi hakea nopeinta reittiä annettujen pysäkkien välille tietyllä lähtöajalla. Reaaliaikaisia nettihakuja ei tässä aleta toteuttamaan, joten kurssi tarjoaa valmiin kiinteän aikatauludatan. Bussien aikatauludata Huom! Alla oleva kuvaus on yksityiskohdiltaan vielä alustava, pieniä muutoksia voi tulla. Jokaisella linjalla on yksilöllinen tunnus (route_id) ja nimi (route_name) (nimi voi periaatteessa olla samakin kahdella linjalla). Lisäksi linja sisältää listan linjan pysäkeistä ja tiedon siitä, kuinka monta minuuttia päätepysäkiltä lähdön jälkeen ko. pysäkiltä lähdetään. Jokaisella ajettavalla bussivuorolla oma vuorotunnuksensa (bus_id), tieto ajettavasta linjasta ja lähtöaika linjan päätepysäkiltä. Jokaisella pysäkillä on tunnus (stop_id) sekä nimi (stop_name). Useammalla pysäkillä voi olla sama nimi, joten ne yksilöidään tunnuksen perusteella. Kurssi on puolestasi jäsentänyt datasta olennaiset osat tiedostoon, jota pääohjelma käsittelee. Näin tiedoston lukeminen ja tulkitseminen on kurssin vastuulla, ja tiedot syötetään harjoitustyönä tehtävään tietorakenteeseen sen jäsenfunktioita kutsumalla (kuten aiemmissakin harjoitustöissä). Jos haluat tietää lisää Tampereen avoimen data todellisista joukkoliikenteen rajapinnoista, lisätietoa (ja itse rajapinnat) löytyvät osoitteesta http://developer.publictransport.tampere.fi/. Linjan vaihtaminen Matka voi vaatia usean linjan käyttöä eli linja-autoa on mahdollista vaihtaa. Vaihdon pitää olla mahdollinen suorittaa eli bussista A voidaan vaihtaa bussiin B vain, jos bussin A lähtöaika pysäkiltä on sama tai aikaisempi kuin bussin B lähtöaika samalta pysäkiltä (eli tässä työssä nolla-ajassa vaihtaminen onnistuu). Pysäkiltä toiselle kävelyä vaativia vaihtoja ei tehdä vaan vaihtaminen tapahtuu aina yhdellä pysäkillä. Vaihdon yhteydessä linjan busseista valitaan aina ensiksi lähtevä (eli esim. ei ole sallittua jättää menemättä bussiin ja sitten nousta vasta seuraavaan saman linjan bussiin).
Reitin tulostus Kahden pysäkin välinen reitti tulostetaan seuraavasti: Jokaisesta reitin linjasta tulostetaan ensin linjan nimi ja sen jälkeen 2 sanavälillä sisennettynä jokaisesta käytetystä pysäkistä lähtöaika pysäkiltä, pysäkin id ja nimi. Viimeisenä tulostetaan se linjan pysäkki, jolla jäädään bussista pois. Tämän pysäkin osalta tulostetaan pysäkille saapumisaika ja rivin alkuun -> merkitsemään poistumista. Jos reitillä vaihdetaan linjasta toiseen, tulostetaan reitin linjat ylläolevaan tapaan järjestyksessä. Esimerkki tulostuksesta on ohjeen esimerkkiajossa. Ohjelman toiminta Ohjelman tunnistamat komennot on esitelty parametereineen ja kuvauksineen taulukossa 1. Taulukko 1: Ohjelman ymmärtämät komennot Komento Kuvaus R tiedosto Lukee tarvittavat reitti- ja pysäkkitiedot annetusta tiedostosta. B <stop_id> Tulostaa pysäkiltä <stop_id> lähtevät linjaautovuorot tunnusjärjestyksessä. T <hh:mm> <stop_id1> Tulostaa nopeimman reitin (reitin, joka <stop_id2> on perillä mahdollisimman aikaisin) lähtöpysäkiltä <stop_id1> määränpäähän <stop_id2>. Matka alkaa <hh:mm> ja matka on tehtävä saman vuorokauden aikana. Reitin tulostuksen kuvaus on muualla työohjeessa. P <stop_id> Tulostaa pysäkin <stop_id> nimen annetun tunnuksen perusteella. C Tulostaa pysäkkien, linjojen ja bussien lukumäärät. E Q Tyhjentää tietorakenteen. Lopettaa ohjelman. Kurssin koodi tulostaa pakolliset lisenssitiedot. 2
Valmiit osat Harjoitustyössä opetellaan graafirakenteen hyödyntämistä käytännössä. Tässäkin työssä tietorakennetoteutus tehdään luokkana, jolla on valmiiksi annettu rajapinta. Toteuta tietorakenteesi annettuihin.hh ja.cc -päätteisiin tiedostoihin. Pohjat tiedostoille saat versionhallinnasta. Valmiina tarjotaan pääohjelma, joka toteuttaa syötteen käsittelemisen, tietorakenteen luomisen sekä tietorakenteen jäsenfunktioiden kutsumisen. Sen tehtävä on testata toteutettua toiminnallisuutta. Pääohjelmaa ei saa muuttaa. Omia.hh- ja.cc-tiedostoja saa lisätä, mutta pitäkää huoli siitä, että ohjelman voi kääntää kääntämällä kaikki hakemiston.cc-tiedostot yhteen. Määritelty rajapinta annetaan valmiina C++:lla. Rajapinnan funktioiden toteutukset ja tarvittavat jäsenmuuttujat on toteutettava itse. Julkista rajapintaa ei saa muuttaa. Valmiit osat ovat saatavilla opiskelijan harjoitustöitä varten saamassa gitrepositoriossa. Lisäksi versionhallinnassa annetaan ohjelman testaamiseen käytettävä testiaineisto, jota vastaan harjoitustyön toiminnallisuutta arvioidaan. Suositeltavaa on myös tehdä omia testimateriaalejasi. Testitiedoston datan formaatti julkaistaan git-tietovarastossa samalla kuin valmiit koodit. Virhetilanteet Pääohjelma huolehtii virhetilanteista sikäli kun ne liittyvät komentojen parametreihin. Osa virheilmoituksista on käytännön syistä tulostettava tietorakenteen puolella, nämä on kuvattu seuraavassa. Virhekoodit on määritelty.hh-tiedostossa vakioina. Jos annettujen pysäkkien välillä ei ole linja-autoyhteyttä annetun ajankohdan jälkeen saman vuorokauden aikana, tulostetaan NO_ROUTE. Jos annettuja pysäkkejä ei ole olemassakaan, tulostetaan NO_SUCH_STOP. Tarvittaessa muitakin virhetilanteita saa havaita (jos sellaisia havaitsee), tulostusten formaatti on vapaa. Olennaista on, että testeissä tulostukset ovat odotettuja. 3
Esimerkki ohjelman toiminnasta Huom, tässä tulostuksessa esim. 13: Hermia - Ylöjärvi Matkatie on kaikki linjan nimeä. > R tyoohje-esimerkki.txt > C 91 stops, 2 routes, 142 buses. > P 3735 TTY > B 3735 13: Hermia - Ylöjärvi Matkatie > P 523 Linja-autoasema > B 523 10: Kaukajärvi - Keskustori N > T 13:10 3735 523 13: Hermia - Ylöjärvi Matkatie 13:14 3735, TTY 13:15 3733, Hervannan valtaväylä 13:16 3731, Vaajakatu 13:17 3737, Tieteenkatu 7 13:18 3519, Tieteenkatu 13:19 3569, Ammattikoulu 13:20 3587, Kierikankatu 13:21 3585, Lukonmäenkatu ->13:23 3549, Nuijatie 10: Kaukajärvi - Keskustori N 13:24 3549, Nuijatie 13:25 3117, Pullerikinahde 13:26 3562, Sotilaankatu 13:27 3589, Steiner-koulu 13:28 3088, Uotilantie 13:29 3085, Siirtolapuutarha 13:30 3083, Kuoppamäentie 29 13:31 3081, Seurakuntatalo 13:32 3069, Jokipohjantie 23 13:33 3067, Riihitie 13:34 3065, Nekalantie 55 13:35 3063, Nekalantie 29 13:36 3061, Lokintaival 13:37 3557, Iidesaukio 4
13:39 601, Tietotalo ->13:41 523, Linja-autoasema > P 1 Error: No such stop! > T 12:12 8 523 Error: No route! > Q This program uses bus data from Tampereen kaupunkiliikenne (TKL) Rajoitteet C++11:n standardikirjastoa saa ja pitää käyttää. Kielen ulkopuolisia valmiita kirjastoja ei saa käyttää. Koodatkaa hyvin! 5