(P) Kansalaisopisto¶
Tavoite:
Kertaan STL:n säiliöiden, iteraattorien ja tiedostojen lukemisen toimintaa.
Harjoittelen myös struct
-rakenteen käyttämistä (ks. materiaalin kohta 4.3
Tieto vs kontrolli).
Erityisesti harjoittelen valitsemaan oikean tietorakenteen STL:n
tietorakenteiden joukosta.
(Riittää valita niiden STL-säiliöiden joukosta, joita on käsitelty kurssin
materiaalissa.)
Ohjeita:
Luo uusi projekti: student/07/education_center/
.
Toteuta ohjelma, joka lukee käynnistyessään kurssikeskuksen (kansalaisopiston) kursseihin liittyviä tietoja tiedostosta, tallentaa ne sopivaan tietorakenteeseen ja antaa käyttäjälle mahdollisuuden tehdä hakuja kyseiseen tietorakenteeseen.
Tärkeää
Ennen kuin aloitat, lue huolellisesti koko tehtävänanto. Huomaa erityisesti kohdat Ohjelman toteuttaminen osissa (vaaditut commitit) sekä Erityisvaatimukset.
Kohdasta Arviointi huomaa erityisesti, että ohjelman pitää ensin läpäistä kaikki automaattitestit. Muuten työ ei mene assistenttien arvioitavaksi, eikä siitä saa pisteitä.
Huomautus
Tämän projektin saa (mutta ei ole pakko) tehdä parityönä. Jos et ole vielä luonut ryhmää tai haluat vaihtaa työparia, niin pääset luomaan uuden ryhmän klikkaamalla vasemman reunan valikosta löytyvää linkkiä “Luo uusi ryhmä”. Ryhmän luomisen jälkeen sivun alaosan palautuslaatikkossa on näkyvissä kaksi vaihtoehtoa: “Palauta yksin” / “Palauta ryhmässä”. Ole tarkkana, että valitset oikean vaihtoehdon, koska valintaa ei voi myöhemmin perua. Palautuslaatikkoon tulee vain jommankumman jäsenen Git-repositorion osoite. Kirjoittakaa kooditiedoston kommentteihin molempien nimet ym. muut tiedot.
Ryhmää voi etsiä Kooditorion Discord-linkin kautta (ks. Aikataulu & linkit).
Alkukommentti ja palautteen kieli¶
Samoin kuin ensimmäisessä projektissa, tässäkin projektissa vaaditaan alkukommentti. Tällä kertaa alkukommenttia ei anneta valmiina, vaan sinun pitää kirjoittaa se itse. Mallia voit katsoa ensimmäisen projektin tehtävänannosta (4.5 (P) Binairo).
Palautteen kieli valitaan palautuslaatikossa (tämän sivun lopussa). Palautteen kielenä on oletuksena suomi, mutta voit vaihtaa sen, jos haluat assistenttien antaman palautteen englanniksi. Kielivalinta määräytyy sen perusteella, minkä kielivalinnan olet tehnyt viimeisimmän palautuksen palautuslaatikossa.
Jos teette parityötä, muistakaa lisätä molempien henkilökohtaiset tiedot.
Ohjelman käsittelemä tieto¶
Ajatellaan seuraavan kaltaista informaatiota kurssitarjonnasta ja ilmoittautumismääristä eri paikkakunnilla:
Lempäälä
Languages
English 20
Exercise
Hiit 10
Pilates 5
Yoga 3
Handcraft
Hammering full
Music
Karaoke full
Pirkkala
Handcraft
Weawing 2
Exercise
Hiit full
Languages
German 3
Music
Karaoke 1
Cooking
Christmas food 3
Vesilahti
Dance
Zumba 8
Information technology
Excel full
Handcraft
Weawing full
Hammering 10
Dressmaking 4
Cooking
Baking full
Music
Guitar 3
Exercise
Fitness boxing 7
Languages
English 3
Nokia
Exercise
Hiit 1
Dance
Zumba 2
Yllä olevassa esimerkissä eri paikkakunnilla voi olla samoja kursseja, mutta niiden osallistujamäärät voivat vaihdella, ja eri paikkakunnilla ei välttämässä ole saatavilla kaikkia kursseja.
Edellä olevan listan tiedot voidaan esittää csv-tiedostona, jonka rivit ovat muotoa:
<paikkakunta>;<teema>;<kurssin_nimi>;<osallistujien_määrä>
jossa <osallistujien_määrä>
voi olla positiivinen kokonaisluku tai
literaalinen merkkijono “full
”.
Kurssi on täynnä, jos sille on ilmoittautunut 50 osallistujaa.
Voit olettaa, että <paikkakunta>
koostuu vain yhdestä sanasta.
Sen sijaan <teema>
ja <kurssin_nimi>
voivat koostua useista sanoista.
Yllä käytetty esimerkki näyttäisi syötetiedostoksi kuvattuna siis esimerkiksi seuraavalta:
Lempaala;Languages;English;14
Pirkkala;Handcraft;Weawing;2
Pirkkala;Exercise;Hiit;full
Vesilahti;Dance;Zumba;8
Pirkkala;Languages;German;3
Vesilahti;Information technology;Excel;full
Lempaala;Exercise;Hiit;10
Vesilahti;Handcraft;Weawing;full
Lempaala;Handcraft;Hammering;full
Vesilahti;Cooking;Baking;full
Pirkkala;Music;Karaoke;1
Vesilahti;Handcraft;Hammering;10
Vesilahti;Handcraft;Dressmaking;4
Lempaala;Exercise;Pilates;5
Lempaala;Exercise;Yoga;3
Lempaala;Languages;English;20
Pirkkala;Cooking;Christmas food;3
Lempaala;Music;Karaoke;full
Vesilahti;Music;Guitar;3
Vesilahti;Exercise;Fitness boxing;7
Vesilahti;Languages;English;3
Nokia;Exercise;Hiit;1
Nokia;Dance;Zumba;2
Kenttiä on rivillä neljä kappaletta, ja mikään
kenttä ei saa olla tyhjä tai muodostua pelkistä välilyöntimerkeistä.
Viimeisen kentän on oltava positiivista kokonaislukua esittävä
merkkijono tai sana “full
”.
Huomaa, kuinka rivien ei tarvitse csv-tiedostossa olla missään erityisessä järjestyksessä. Syötetiedostossa ei myöskään käytetä skandinaavisia kirjaimia.
Mikäli syötetiedostossa on saman paikkakunnan samalle kurssille esitetty tiedot useammin kuin kerran, voimaan jää se tieto joka tuli vastaan tiedostossa viimeisimpänä. Esimerkiksi yllä olevassa syötetiedossa Lempäälän English-kurssi esiintyy kaksi kertaa. Ensimmäisellä rivillä osanottajamäärä on 14 ja tiedoston loppupäästä löytyvällä rivillä 20. Osanottajamäärä 20 jää voimaan siksi, että se oli jäljempänä, ei siksi että se oli luvuista suurempi.
Ohjelman toiminta¶
Kun ohjelma käynnistyy, se lukee käyttäjältä syötetiedoston nimen:
Input file: courses.input
Mikäli syötetiedostoa ei saa avattua luettavaksi, tulostetaan käyttäjälle teksti:
Error: the input file cannot be opened
Tämän jälkeen ohjelman suoritus päättyy ilman mitään muita tulosteita
paluuarvoon EXIT_FAILURE
.
Mikäli syötetiedosto saadaan avattua, mutta tiedosto ei ole määritelmän
mukainen, esimerkiksi kenttiä ei ole neljää tai kentästä puuttuu arvo,
tulostetaan käyttäjälle virheilmoitus
Error: empty field
,
ja lopetetaan ohjelman suoritus paluuarvoon EXIT_FAILURE
.
Esimerkiksi:
Input file: courses-not-enough-fields.input
Error: empty field
Ohjelma jäsentelee tiedostosta lukemansa rivit ja tallentaa eri paikkakuntien kurssitiedot sopivaan sisäiseen tietorakenteeseen. Tietorakenne on ohjelmoijan itsensä päätettävissä, kunhan se noudattaa kaikkia kohdassa “Erityisvaatimukset” asetettuja lisäehtoja.
Kun tiedosto on luettu, ohjelma aloittaa varsinaisen suorituksensa.
Aina kun käyttäjältä odotetaan syötettä, tulostetaan rivin alkuun >
(> ja välilyönti):
>
Tähän kehotteeseen ohjelman käyttäjä voi syöttää seuraavia käskyjä:
quit
- Ohjelman suoritus päätty paluuarvoonEXIT_SUCCESS
ilman, että ohjelma tulostaa mitään.
locations
- Tulostaa aakkosjärjestyksessä allekkain kaikki tunnetut paikkakunnat. Esimerkiksi:> locations Lempaala Nokia Pirkkala Vesilahti >
themes_in_location <paikkakunta>
- Tulostaa aakkosjärjestyksessä allekkain kaikki annetun paikkakunnan teemat. Esimerkiksi:> themes_in_location Vesilahti Cooking Dance Exercise Handcraft Information technology Languages Music >
courses <paikkakunta> <teema>
- Komento tulostaa kurssin nimen mukaisessa aakkosjärjestyksessä kaikki kyseisen paikkakunnan kurssit, jotka löytyvät kyseiseltä paikkakunnalta ja kyseisestä teemasta sekä osallistujamäärät. Esimerkiksi:> courses Lempaala Exercise Hiit --- 10 enrollments Pilates --- 5 enrollments Yoga --- 3 enrollments >Tai jos kurssi on täynnä, tulostus näyttää seuraavalta:
> courses Vesilahti "Information technology" Excel --- full >Yllä olevassa esimerkissä näkyy myös, että useasta sanasta koostuva parametri pitää ympäröidä lainausmerkeillä. Ainoastaan teema on sellainen parametri, joka voi koostua useasta sanasta. (Myös kurssin nimi voi koostua useasta sanasta, mutta sitä ei käytetä minkään komennon parametrina.)
Vaikka teema ei koostuisikaan useasta sanasta, se voidaan silti ympäröidä lainausmerkeillä. Esimerkiksi:
> courses Nokia "Dance" Zumba --- 2 enrollments >
available
- Komento tulostaa näytölle kaikkien paikkakuntien kaikista kursseista ne, joille voi vielä ilmoittautua eli jotka eivät ole täynnä. Kursseista tulostetaan paikkakunta, teema ja nimi. Tulostettavassa listassa kurssit ovat aakkosjärjestyksessä ensin paikkakunnan, sitten teeman ja lopuksi kurssin nimen mukaan.Esimerkki valaisee asiaa parhaiten:
> available Lempaala : Exercise : Hiit Lempaala : Exercise : Pilates Lempaala : Exercise : Yoga Lempaala : Languages : English Nokia : Dance : Zumba Nokia : Exercise : Hiit Pirkkala : Cooking : Christmas food Pirkkala : Handcraft : Weawing Pirkkala : Languages : German Pirkkala : Music : Karaoke Vesilahti : Dance : Zumba Vesilahti : Exercise : Fitness boxing Vesilahti : Handcraft : Dressmaking Vesilahti : Handcraft : Hammering Vesilahti : Languages : English Vesilahti : Music : Guitar >
courses_in_theme <teema>
- Komento tulostaa kaikilta paikkakunnilta annettuun teemaan kuuluvat kurssit aakkosjärjestyksessä. Esimerkiksi:> courses_in_theme Exercise Fitness boxing Hiit Pilates Yoga >
favorite_theme
Komento tulostaa suosituimman teeman. Kuhunkin teemaan kuuluvien kurssien osanottajamäärät lasketaan siis yhteen ja tulostetaan tämä suurin osanottajamäärä sekä teema (tai teemat), joilla on suurin osanottajamäärä. Esimerkiksi:> favorite_theme 116 enrollments in themes --- Handcraft >Komennossa oletetaan, että jos kurssi on täynnä, sillä on 50 osallistujaa.
Katsotaan vielä lisäesimerkki tapauksesta, jossa suurin osanottajamäärä on useammalla teemalla. Jos syötetiedoston sisältö olisi:
Lempaala;Languages;English;14 Pirkkala;Handcraft;Weawing;2 Vesilahti;Handcraft;Hammering;12 Lempaala;Exercise;Pilates;5 Lempaala;Exercise;Yoga;3komento tulostaisi:
> favorite_theme 14 enrollments in themes --- Handcraft --- Languages >Jos syötetiedosto ei ole tyhjä, niin jokin teema on suosituin. Tyhjän tiedoston tapauksessa komento tulostaa:
> favorite_theme No enrollments >
Kun käyttäjän syöttämä komento on suoritettu, ohjelma tulostaa
kehotteen uudelleen.
Tätä jatketaan kunnes käyttäjä syöttää käskyn quit
.
Virhetilanteet¶
Mikäli käyttäjän syöte on virheellinen, tulostetaan virheeseen liittyvä virheilmoitus, minkä jälkeen ohjelma palaa odottamaan käyttäjän syötettä. Ohjelman suoritus ei siis pääty käyttäjän virheelliseen syötteeseen.
Käyttäjän syöttäessä tuntemattoman komennon, tulostetaan virheilmoitus:
> jotakin
Error: Unknown command: jotakin
> joku_komento parametri
Error: Unknown command: joku_komento
>
Mikäli komennolle annetaan väärä määrä parametreja, tulostetaan virheilmoitus
Error: error in command <komento>
kuten alla:
> courses Lempaala
Error: error in command courses
>
Komennolle themes_in_location
on mahdollista antaa paikkakunta, jota
ei löydy.
Tällöin käyttäjälle tulostetaan virheilmoitus:
> themes_in_location joku_paikkakunta
Error: unknown location
>
Komennolle courses_in_theme
on mahdollista antaa teema, jota ei löydy.
Tällöin käyttäjälle tulostetaan virheilmoitus:
> courses_in_theme joku_teema
Error: unknown theme
>
Komentoon courses
liittyy kaksi erillistä virheilmoitusta.
Mikäli käyttäjän syöttämää paikkakuntaa ei löydetä, tulostetaan
virheilmoitus Error: unknown location name
ja mikäli annettua tekijää
ei löydetä, tulostetaan virheilmoitus Error: unknown theme
kuten alla:
> courses joku_paikkakunta Exercise
Error: unknown location name
> courses Lempaala joku_teema
Error: unknown theme
> courses joku_paikkakunta joku_teema
Error: unknown location name
Jos sekä paikkakunta että teema ovat tuntemattomia, annetaan ilmoitus tuntemattomasta paikkakunnasta, kuten näkyy yllä olevan esimerkin viimeisestä kohdasta.
Erityisvaatimukset¶
Seuraavia vaatimuksia on noudatettava, mikäli haluaa työstä hyväksytyn arvosanan:
Syötetiedoston saa lukea vain kerran ohjelman suorituksen aikana.
Minkä STL-tietorakenteen tai tietorakenteiden yhdistelmän valitsetkin työhösi, sinun on käytettävä ainakin yhtä
map
-rakennetta. Tämänmap
-rakenteen on oltava osana sitä rakennetta, johon tiedostosta luettu informaatio talletetaan myöhempiä hakuja varten.Kun tallennat tiedostosta luettuja kurssien tietoja STL-rakenteeseesi, sinun on käytettävä niiden tallentamiseen seuraavaa
struct
-rakennetta:struct Course { string name; string theme; int enrollments; };Tämän
struct
-rakenteen on siis oltava sen STL-rakenteen alkiotyyppinä, jonne kurssien tietoja talletetaan.Voit käyttää ohjelmassasi myös vastaavaa suomenkielistä
struct
-rakennetta.
Vihjeitä¶
- Voit käyttää syötetiedoston ja käyttäjän antamien syötteiden paloitteluun viikkoharjoituksissa toteutettua
split
-funktiota. Toteutus on annettu myös koodipohjassa tehtävään 6.1.2 Vektorin alkioiden summa.- Muistathan, missä järjestyksessä
map
- jaset
-rakenteiden alkiot käydään iteraattorilla läpi.
Ohjelman toteuttaminen osissa¶
Ohjelman toteutus muodostuu pääpiirteiltään kolmesta osasta:
- tietorakenteen valinta ja tiedoston lukeminen tietorakenteeseen
- käyttöliittymä
- hakualgoritmit.
Mieti tarkasti, missä järjestyksessä nuo kannattaa toteuttaa, jotta voit toteuttaa ja testata ne yksi kerrallaan, ennen kuin siirryt seuraavaan vaiheeseen. Vähimmäisvaatimuksena versionhallinnan käyttämiselle on, että nämä kolme osaa on toteutettu omina committeinaan, mutta parempi tietenkin olisi että committeja olisi enemmän.
Yllä luetellut commitit saa jakaa useampaan osaan.
Arviointi¶
Jotta työ päätyisi assistenttien arvioitavaksi, sen pitää ensin läpäistä automaattitestit. Automaattitestit eivät hyväksy ohjelmaa, jonka kääntäminen tuottaa varoituksia. Jos saat automaattitesteistä 0 pistettä, myös lopullinen pistemääräsi on 0, eikä työ mene assistenttien arvioitavaksi.
Assistentti arvioi ja pisteyttää automaattitestit läpäisseistä (=1 p) sekä tehtävänannon erikoisvaatimukset täyttävistä töistä viimeisen määräajan puitteissa tehdyn commitin seuraavien arviointikriteerien mukaan:
- Ratkaisun yleisperiaate: 0-30 pistettä:
- Tehtävän osaamistavoitteet on saavutettu.
- Ohjelmakoodi on jaettu funktioita, luokkia ja/tai metodeita käyttäen loogisiksi kokonaisuuksiksi, jotka ovat sopivan pituisia.
- Jos luokkia ja olioita on käytetty, ne on toteutettu olio-ohjelmoinnin periaatteita noudattaen (ks. 4-kierroksen Tyyliseikoista kohta Olio-ohjelmointi).
- Tietorakenne ei sisällä toisteista eikä turhaa tietoa. Valittuja tietorakenteita on käytetty järkevästi.
- Ohjelmakoodi ei sisällä turhaa toisteisuutta eikä muutakaan turhaa.
- Ohjelmakoodi ei sisällä tarpeettomia rajoitteita tai oletuksia tai muita väkinäisiä ratkaisuita.
- Ohjelmarakenteet on toteutettu helposti ymmärrettäviksi.
- Ohjelmakoodissa ei ole käytetty globaaleja muuttujia (globaalit
const
-vakiot ovat OK). - Ohjelman toimintaa ei lopeteta
exit
-funktiota käyttäen.
- Ohjelmointityyli: 0-10 pistettä:
- Muuttujat ja funktiot nimetty selkeästi ja kuvaavasti. Nimeämisessä on käytetty vain yhtä kieltä, ei esim. suomea ja englantia sekaisin.
- Ohjelmassa on käytetty nimettyjä vakioita taikalukujen sijasta.
- Ohjelmakoodi on asemoitu siististi.
- Koodirivien pituus on enintään 80 merkkiä.
- Jokaisen tiedoston alussa on kommentti, josta käy ilmi tiedoston tarkoitus, työn tekijä(t) ja muut tarvittavat tiedot. (ks. 1-projektin tehtävänanto kierrokselta 4).
- Jokaisen funktion/metodin alussa (otsikkotiedostossa jos sellainen on) on kommentti, joka kuvaa sen toiminnan, paluuarvon ja parametrit.
- Kommentteja on muutenkin tarpeellisissa kohdissa.
- Kommentit liittyvät toteutettuun ohjelmaan eivätkä johonkin sen vanhempaan versioon.
- Kaikki kommentit on kirjoitettu samalla kielellä (fi/en), mutta kommentoinnissa saa käyttää eri kieltä kuin muuttujien ym. nimissä.
- Kaikki muuttujat on alustettu.
- Kääntäjä ei anna koodia käännettäessä varoituksia.
- Versionhallinnan käyttö: 0-10 pistettä:
- Committeja on riittävä määrä.
- Commit-viestien sisältö on selkeä ja kuvaava.
Huomautus arvioinnista
Automaattitesteillä tarkistetaan, toimiiko ohjelma. Assistentit taas kiinnittävät huomiota tyyliseikkoihin ym. yllä lueteltuihin kriteereihin. Periaatteessa on siis mahdollista, että täysin toimivasta ohjelmasta saa nolla pistettä, jos ohjelma ei täytä yllä lueteltuja vaatimuksia.
Erityisesti tyylivaatimuksista on kerrottu tämän kierroksen aikaisemmassa materiaaliosiossa.
Huomautus arvosteltavan työn versiosta
Arvosteluun otetaan ohjelman se versio, josta on tehty viimeisin onnistunut Plussa-palautus (määräaikaan mennessä). Onnistuneella palautuksella tarkoitetaan palautusta, joka on läpäissyt automaattitestit.
Ensimmäisen onnistuneen Plussa-palautuksen jälkeen haluat todennäköisesti vielä korjailla koodisi tyyliä (esim. lisätä kommentteja), jos vain palautusaikaa on vielä jäljellä.
Muista lopuksi kuitenkin tämä: Kun olet palauttanut viimeisen version Gittiin, palauta se vielä kerran Plussaan.
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.