Python-perusteet - Viikkotehtävä 1
Tässä tehtävässä käydään läpi Python-ohjelmointikielen perusteita ja erityisesti tietorakenteita. Samalla opitaan yksinkertaisen CGI-ohjelman tekeminen users.jyu.fi-palvelimella.
Käy ensin läpi nämä luentomateriaalit:
- Kurssin järjestelyt, Python-perusteet, CGI-perusteet
- Pythonin ja CGI-ohjelmoinnin perusteet
- Python 2.7 tutorial
Kaikille tasoille yhteiset vaatimukset:
- Ohjelma toteutetaan selaimella käytettävänä CGI-ohjelmana eli sivua ladattaessa saadaan selaimeen näkyville tehtävissä vaaditut tulostukset
- Käytetään vain Python 2.7-ohjelmointikieltä.
- Ainoat sallitut Python-kirjastot ovat:
- Koodin oleelliset osat on oltava kommentoitu.
- Tiedostojesi merkistönä on käytettävä UTF-8-merkistöä.
- CGI-ohjelma ei saa tallentaa mitään tiedostoihin tai tietokantaan
- CGI-ohjelman täytyy toimia users.jyu.fi-palvelimella. Muille palvelimille sijoitetut vastaukset eivät kelpaa.. Älä edes yritä tehdä ohjelmaasi muissa ympäristöissä. Kts. CGI/SSI-tekniikat users.jyu.fi-palvelimella
Taso 1
Kirjoita Python-ohjelma, joka tekee seuraavat asiat:
- Ohjelma osaa ladata osoitteessa http://appro.mit.jyu.fi/tiea2120/vt/vt1/2019/data.json määritellyn json-tietorakenteen ja muuntaa sen pythonin tietorakenteeksi. Voit tutkia tietorakenteen sisältöä osoitteessa http://jsoneditoronline.org/?url=http%3A%2F%2Fappro.mit.jyu.fi%2Ftiea2120%2Fvt%2Fvt1%2F2019%2Fdata.json
- Kirjoita funktio, joka tulostaa kaikkien tietorakenteen sisältämien kilpailujen ja niiden sisältämien joukkueiden nimet. Kilpailujen nimet on tulostettava kukin omalle
rivilleen.
Kunkin joukkueen nimi on tulostettava omalle rivilleen neljän välilyönnin verran sisennettynä. Älä tulosta mitään ylimääräistä. Funktion on toimittava riippumatta
tietorakenteessa olevien kilpailujen ja joukkueiden määrästä.
Fillarirogaining Kintturogaining Jäärogaining Dynamic Duo Hullut fillaristit Kaakelin putsaajat Kahden joukkue Kotilot Mudan Ystävät Onnenonkijat Pelättimet Pällit Rennot 1 Rennot 2 Retkellä v 13 RogRog Siskokset Sopupeli susi jo syntyessään Toinen jalka haudassa Toipilas Tollot Tähdenlento Vara 1 Vara 2 vara 3 Vara 4 - Kirjoita yleiskäyttöinen funktio, joka osaa lisätä data-tietorakenteeseen funktiolle parametrina tuodun joukkueen halutun kilpailun pyydettyyn sarjaan. Esim. lisaaJoukkue(data, joukkue, u"Jäärogaining", u"4h"). Jos parametrina annettua kilpailua (sama kilpailun nimi) tai sarjaa (sama nimi) ei löydy annetusta datasta niin funktio ei tee mitään. Funktion pitää toimia millä tahansa sarjoilla eikä vain niillä, jotka löytyvät nyt annetusta rakenteesta
- Lisää edellä luomallasi funktiolla data-tietorakenteeseen yksi uusi joukkue Jäärogainingin 4h-sarjaan seuraavilla tiedoilla:
{ "nimi": annetaan osoiterivillä parametrina, "jasenet": [ u"Tommi Lahtonen", u"Matti Meikäläinen" ], "id": 99999, "leimaustapa": [ u"GPS" ], "rastit": [] } - Ohjelma tulostaa aakkosjärjestyksessä jäärogainingin kaikkien joukkueiden nimet. Mukana on oltava myös itse lisätty joukkue. Järjestämisessä isoilla ja pienillä kirjaimilla ei ole merkitystä.
Vinkki: sort. Älä kirjoita omaa järjestysalgoritmia!
- Tee ohjelmastasi CGI-ohjelma, joka toimii osoitteessa http://users.jyu.fi/~omatunnus/cgi-bin/tiea2080/vt1/vt1.cgi.
- Käytä text/plain-tyyppiä.
- Ohjelmalle voidaan antaa parametrina rakenteeseen lisättävän joukkueen nimi. Esim. http://users.jyu.fi/~omatunnus/cgi-bin/tiea2080/vt1/vt1.cgi?nimi=Pällit
- Jos nimiparametria ei anneta, niin ohjelma käyttää joukkuetta lisättäessä nimeä "Pällit"
- Ohjelma ei saa kaatua vaikka parametreina lukisi mitä tahansa
Taso 3
Laajenna Taso 1 -ohjelmaa seuraavilla ominaisuuksilla ja muutoksilla:
- Lisää ohjelmaan funktio, joka osaa poistaa annetusta kilpailusta nimen perusteella joukkueen. Funktio ottaa parametrina datan, kilpailun nimen, sarjan nimen ja poistettavan joukkueen nimen. Esim. poistaJoukkue(data, u"Jäärogaining", u"8h", u"Vara 1");. Jos annettua kilpailua, sarjaa tai joukkuetta ei löydy niin funktio ei tee mitään.
- Poista funktiollasi joukkueet joiden nimet ovat: "Vara 1", "Pelättimet" ja "Vapaat".
- Ohjelma tulostaa kilpailuttain joukkueiden nimet ja pisteet pisteiden mukaisessa laskevassa suuruusjärjestyksessä. Ts. Eniten pisteitä saanut joukkue tulostetaan ensimmäisenä.
Tulostuksen on näytettävä seuraavanlaiselta. Huomaa, että alla ovat oikeat pistemäärät!
Kahden joukkue (295 p) Onnenonkijat (273 p) RogRog (236 p) Kaakelin putsaajat (218 p) Toipilas (211 p) Dynamic Duo (206 p) ...
Huom. ohjelmasi on tehtävä myös ensin ykköstason tulostukset.
- Pisteet lasketaan seuraavalla tavalla:
- Tietorakenteessa on listattu kaikki joukkueiden käymät rastit. Rakenteesta löytyy aika jolloin rastilla on käyty ja rastin tunniste (id).
Data ei ole "tasalaatuista" eli siinä esiintyy rasteja joille ei ole vastinetta rastit-rakenteessa. Nämä pitää osata käsitellä jotenkin järkevästi eli vähintään hypätä yli eikä ohjelma saa kaatua tai laskenta sekoilla.
- Käy läpi tietorakenne ja etsi kunkin joukkueen käymät rastit
- Joukkue saa kustakin rastista pisteitä rastin koodin ensimmäisen merkin verran. Esim. jos rastin koodi on 9A niin joukkue saa yhdeksän (9) pistettä. Jos rastin koodin ensimmäinen merkki ei ole kokonaisluku niin kyseisestä rastista saa nolla (0) pistettä. Esim. rasteista LÄHTÖ ja F saa 0 pistettä.
- Esim. Dynamic Duon oikea pistemäärä on 206.
- Tietorakenteessa on listattu kaikki joukkueiden käymät rastit. Rakenteesta löytyy aika jolloin rastilla on käyty ja rastin tunniste (id).
- Lisää ykköstasolla vaadittu joukkue jäärogainingiin ykköstasolla vaadituilla tiedoilla ja nimellä "Pällit"
- Mahdollista Jäärogainingiin lisättävän joukkueen kaikkien muiden tietojen paitsi rastien antaminen osoiterivin parametreina.
Esim. http://users.jyu.fi/~omatunnus/cgi-bin/tiea2080/vt1/vt1.cgi?nimi=Pällit&id=99999&leimaustapa=GPS&jasenet=Tommi%20Lahtonen&jasenet=Matti%20Meikäläinen
- Huom. Myös leimaustapoja täytyy voida antaa useampia kuin yksi samaan tapaan kuin jäseniäkin.
- Jos nimeä tai id:tä ei anneta niin lisäämistä ei tehdä vaan annetaan virheilmoitus, että joukkuetta ei voida lisätä
- Jos leimaustapaa tai jäseniä ei anneta niin näihin tallennetaan tyhjät listat. Rasteihin tallennetaan aina tyhjä lista.
- id on tarkistettava eli kahdella joukkueella ei saa olla samaa id:tä. id täytyy olla kokonaisluku. Jos annetaan jo olemassa oleva id niin joukkuetta ei lisätä vaan annetaan virheilmoitus
Taso 5
Toteuta taso 3:n mukainen ohjelma seuraavilla laajennuksilla:
- Toteuta ensin kaikki edellistasojen tulostukset ja toiminnot
- Tulosta joukkueiden nimet, pisteet, kuljettu matka ja käyttämä aika laskevassa suuruusjärjestyksessä pisteiden mukaan
eli eniten pisteitä saanut joukkue ensimmäisenä.
Tasapisteissä vähemmän aikaa käyttänyt joukkue tulostetaan ensin.
Huom. ohjelmasi pitää tulostaa myös aiempien tasojen vaatimat tulostukset. - Laske kuinka pitkän matkan kukin joukkue on kulkenut eli laske kunkin rastivälin pituus ja laske yhteen kunkin joukkueen kulkemat rastivälit. Jos rastille ei löydy sijaintitietoa (lat ja lon) niin kyseistä rastia ei lasketa matkaan mukaan. Vinkki: Getting distance between two points based on latitude/longitude.
- Laske joukkueen käyttämä aika eli vähennä joukkueen viimeisestä rastileimausajasta ensimmäisen leimauksen aika. Tulosta aika muodossa: tunnit:minuutit:sekunnit. Vinkki: timedelta
- Tulostuksen on näytettävä seuraavanlaiselta:
Kahden joukkue, 295 p, 55 km, 08:05:38 Onnenonkijat, 273 p, 49 km, 07:52:32 RogRog, 236 p, 40 km, 07:59:57 Kaakelin putsaajat , 218 p, 39 km, 07:49:28 Toipilas, 211 p, 41 km, 07:32:59 Dynamic Duo , 206 p, 43 km, 07:49:45 ...
- Käsittele sivun osoitteessa annettavissa parametreissa myös kilpailun nimi ja sarja eli parametreilla voi määrätä mihin kilpailuun joukkue täytyy lisätä.
Esim. seuraava lisäisi joukkueen Fillarirogainingin 8h-sarjaan: http://users.jyu.fi/~omatunnus/cgi-bin/tiea2080/vt1/vt1.cgi?nimi=Pällit&id=99999&leimaustapa=GPS&jasenet=Tommi%20Lahtonen&jasenet=Matti%20Meikäläinen&kilpailu=Fillarirogaining&sarja=8h
- Jos annettua kilpailua ei löydy niin annetaan virheilmoitus väärästä kilpailusta
- Jos annettua sarjaa ei löydy niin luodaan automaattisesti uusi sarja, jonka kesto on 8 ja loppuaika ja alkuaika ovat null.

Käyttäjien kommentit