Rästitehtävä 2
Tuntitilastot (350 p)
Tällä rästitehtävällä voit korvata yhden kierroksista 4, 5 tai 6. Jos
sinulta puuttuu minimipisteet kahdelta näistä kierroksista, sinun
pitää tehdä sekä tämä tehtävä että rästitehtävä 1 tai 3. Jos sinulta
puuttuu minimipisteet kaikilta näiltä kierroksilta, tee
rästitehtävät 1, 2 ja 3. Jotta rästitehtävä korvaisi tehtäväkierroksen, siitä on
saatava vähintään 300 pistettä. Jos saat tästä rästitehtävästä vähintään
300 pistettä, niin tällä tehtävällä korvatun kierroksen pistemääräksi
lasketaan harjoitusarvosanaa määrättäessä korvattavan kierroksen
minimipistemäärä. Rästitehtävällä ei
voi nostaa hyväksytyn kierroksen pistemäärää.
Tässä tehtävässä käytetään kaksiulotteisia listoja, joista on kerrottu
tarkemmin 16.2.2011 pidetyllä luennolla.
Tee Eclipseen uusi projekti, jonka nimi on
tehtava10_2. Luo
sitten tähän projektiin moduuli tyotunnit ja kirjoita siihen ohjelma,
jonka avulla käyttäjä voi laskea tilastoja opiskelijoiden harjoitustehtäviin
käyttämistä työtunneista.
Tarkempi selostus ohjelman vaatimuksista on alempana.
Eräällä kurssilla pidetään kirjaa siitä, kuinka monta tuntia opiskelija
on käyttänyt kunkin harjoitustehtävän tekemiseen. Tässä tehtävässä
on kirjoitettava ohjelma, joka lukee harjoitustuntitilastot ja laskee
sitten yksittäiseen tehtävään käytettyjen työtuntien keskiarvon sekä kunkin
opiskelijan yhteistuntimäärän.
Kirjoita ohjelmaasi seuraavat funktiot:
- lue_tuntitiedot(tehtavalkm)
- Funktio saa parametrina harjoitustehtävien lukumäärän. Se
pyytää ja lukee käyttäjältä eri opiskelijoiden eri tehtäviin
käyttämät tuntimäärät. Yhden opiskelijan tiedot on annettu yhdellä
rivillä niin, että rivillä on opiskelijan eri tehtäviin käyttämät
tuntimäärät järjestyksessä (1. tehtävän tuntimäärä ensimmäisenä)
toisistaan välilyönnillä erotettuina. (Tuntimäärät ovat desimaalilukuja.)
Käyttäjä lopettaa tietojen antamisen tyhjällä rivillä.
Luetut tuntimäärät tallennetaan kaksiulotteiseen listaan niin, että
alilistassa on aina yhden opiskelijan tuntimäärät tehtävittäin ja suurempi
lista sisältää kaikkia opiskelijoita koskevat alilistat samassa järjestyksessä
kuin opiskelijoiden tuntitiedot on luettu. Funktio palauttaa tämän listan.
Jos jollain käyttäjän antamalla
rivillä työtuntien määrä ei ole oikea (sama kuin tehtävien lukumäärä),
ohjelma ilmoittaa virheestä ja tulostaa virheellisen rivin. Se kuitenkin
jatkaa lukemalla seuraavan rivin. Virheellisen rivin tietoja ei tallenneta
listaan eikä oteta mitenkään huomioon jatkossa.
- hae_tehtavan_tunnit(yhteislista, tehtavanro, tehtavalkm)
- Funktio saa parametrina kaikkien opiskelijoiden työtunnit
sisältävän kaksiulotteisen listan. Se muodostaa ja palauttaa
yksiulotteisen listan, joka sisältää vain yhden tehtävän työtunnit
(esimerkiksi kunkin opiskelijan 2. tehtävään käyttämät työtunnit).
Tehtävän numero (esimmäisen tehtävän numero on tässä 0) ja tehtävien
lukumäärä annetaan funktion parametreina. Funktion palauttamaan listaan
otetaan mukaan vain positiiviset työtunnit, ei siis nollia eikä
negatiivisia työtunteja. Funktion palauttaman listan pituus voi siis
olla pienempi kuin opiskelijoiden alkuperäinen määrä, jos osalla
opiskelijoista tehtävän työtuntimäärä on 0 (koska he eivät ole lainkaan
tehneet ko. tehtävää). Jos parametrina annettu tehtävän numero ei ole
sallitulla välillä (vähintään 0, korkeintaan tehtävien lukumäärä - 1),
funktio palauttaa tyhjän listan.
- laske_keskiarvo(tehtavalista)
- Funktio saa parametrina yhden tehtävän tuntimäärät sisältävän
listan. Se laskee ja palauttaa näiden tuntimäärien keskiarvon.
- tulosta_keskiarvot(yhteislista, tehtavalkm)
- Funktio saa parametrina kaikki tuntitiedot sisältävän kaksiulotteisen
listan ja tehtävien lukumäärän. Funktio laskee eri tehtävien työtuntimäärien
keskiarvot ja tulostaa ne. Funktio käyttää tässä apuna kahta edellistä
funktiota. Tulostuksessa tehtävät on numeroitu 1:stä alkaen.
Keskiarvoa laskettaessa otetaan huomioon vain nollaa suuremmat työtuntimäärät.
Jos opiskelijan tuntimäärä on 0 tai negatiivinen,
niin tätä opiskelijaa ei myöskään
lasketa opiskelijoiden lukumäärään.
Katso tarkemmin esimerkkiajosta, millainen tulostuksen pitää olla.
Tehtävien numeroille on valittu kahden merkin levyinen kenttä ja
keskiarvoille kuuden merkin levyinen kenttä. Lisäksi kenttien
välissä on piste ja välilyönti.
Keskiarvot tulostetaan kahden desimaalin tarkkuudella.
- tulosta_yhteistunnit(yhteislista)
- Funktio laskee ja tulostaa eri opiskelijoiden
kokonaistyötunnit eri tehtävistä. Funktio saa parametrina kaikki
tuntitiedot sisältävän kaksiulotteisen listan. Katso tarkemmin
esimerkkiajosta, millainen tulostuksen pitää olla. Työtunnit tulostetaan
kahden desimaalin tarkkuudella. Jos jollain opiskelijalla on jostain
tehtävästä negatiivinen määrä työtunteja, ei näitä tunteja lasketa
mukaan opiskelijan kokonaistyötunteihin. Kenttien muotoilu on sama
kuin keskiarvojen tulostuksessa.
Kirjoita lisäksi pääohjelma, joka pitää huolen siitä, että
seuraavat asiat tehdään annetussa järjestyksessä. Pääohjelma
kutsuu tarvittaessa muita funktioita toimintojen tekemiseen.
- Pyytää käyttäjältä tehtävien lukumäärän
- Pyytää käyttäjältä tiedot tehdyistä työtunneista.
- Tulostaa eri tehtävien työtuntien keskiarvot.
- Tulostaa eri opiskelijoiden kokonaistyötunnit.
Ohjelmasi ei tarvitse varautua siihen, että käyttäjä antaa lukuja
pyydettäessä esimerkiksi merkkijonoja tai tehtävien lukumäärää pyydettäessä
negatiivisen luvun.
Testaa ohjelmaasi ajamalla sitä itse monta kertaa ennen tehtävän palautusta.
Palauta Gobliniin tiedosto tyotunnit.py.
Huomautus: Ohjelman voisi helposti kirjoittaa myös ilman
funktiota hae_tehtavan_tunnit. Funktiosta on kuitenkin hyötyä
silloin, jos ohjelmaa halutaan myöhemmin laajentaa laskemaan myös
muita tehtäväkohtaisia tilastoja, esimerkiksi tehtävän työtuntien
mediaaneja.
Esimerkkejä ohjelman suorituksesta:
[ohjelman suoritus alkaa]
Ohjelma laskee tilastoja opiskelijoiden tyotunneista.
Anna tehtavien lukumaara.
4
Anna opiskelijoiden tyotunnit tehtavittain,
yhden opiskelijan tiedot samalla rivilla.
Lopeta tyhjalla rivilla.
3.5 1.2 4.5 8.0
2.1 7.9 4.0 0.0
5.1 2.6 0.0 3.9
2.1 11.7 2.6 0.0
4.5 6.1 4.1 7.2
Tyotuntien keskiarvot tehtavittain
Nro tunnit (h)
1. 3.46
2. 5.90
3. 3.80
4. 6.37
Opiskelijoiden kayttamat kokonaistyotunnit
Nro kokonaistunnit (h)
1. 17.20
2. 14.00
3. 11.60
4. 16.40
5. 21.90
[ohjelman suoritus päättyy]
[ohjelman suoritus alkaa]
Ohjelma laskee tilastoja opiskelijoiden tyotunneista.
Anna tehtavien lukumaara.
3
Anna opiskelijoiden tyotunnit tehtavittain,
yhden opiskelijan tiedot samalla rivilla.
Lopeta tyhjalla rivilla.
2.1 3.2 4.4 0.0
virheellinen rivi: 2.1 3.2 4.4 0.0
2.1 3.2
virheellinen rivi: 2.1 3.2
2.1 3.2 0.0
Tyotuntien keskiarvot tehtavittain
Nro tunnit (h)
1. 2.10
2. 3.20
3. 0.00
Opiskelijoiden kayttamat kokonaistyotunnit
Nro kokonaistunnit (h)
1. 5.30
[ohjelman suoritus päättyy]
[ohjelman suoritus alkaa]
Ohjelma laskee tilastoja opiskelijoiden tyotunneista.
Anna tehtavien lukumaara.
4
Anna opiskelijoiden tyotunnit tehtavittain,
yhden opiskelijan tiedot samalla rivilla.
Lopeta tyhjalla rivilla.
Tyotuntien keskiarvot tehtavittain
Nro tunnit (h)
1. 0.00
2. 0.00
3. 0.00
4. 0.00
Opiskelijoiden kayttamat kokonaistyotunnit
Nro kokonaistunnit (h)
[ohjelman suoritus päättyy]
Värikoodit:
Sininen: Syöte käyttäjältä
Vihreä: Ohjelman tuloste
Punainen: Erityishuomatus: ei tulosteta