Kierros 6, tehtävä 2
Lottopallojen laadunvalvonta (200 p)
Tässä tehtävässä harjoitellaan
erityisesti seuraavia asioita:
Tee Eclipseen uusi projekti, jonka nimi on
tehtava6_2, ja siihen moduuli lottopallot.
Kirjoita siihen seuraavan kuvauksen mukainen ohjelma.
Yritys valmistaa lottopalloja. Kukin lottopallo on numeroitu.
Pallojen valmistuksen jälkeen
pallot punnitaan, ja lasketaan niiden painojen keskiarvo
ja keskihajonta. Sellaiset pallot, joiden paino poikkeaa yli
yhden keskihajonnan verran keskiarvosta, hylätään ja niiden tilalle
valmistetaan uudet pallot. (Jos pallojen painot poikkeavat
liikaa toisistaan, lottoarvonta ei ole reilu, vaan jokin luku
voi esiintyä arvontatuloksessa selvästi toisia useammin.)
Sinun tehtävänäsi on kirjoittaa ohjelma, joka pyytää käyttäjältä eri
pallojen painot (oikeastaan massat, mutta ohjelmassa puhutaan painoista
puhekielen käytännön mukaisesti) ja ilmoittaa sitten, mitkä
palloista pitää hylätä.
Tämä ohjelma ei enää käsittele korvaavien pallojen valmistusta ja
niiden laadunvalvontaa.
Kirjoita ohjelmaasi seuraavat funktiot:
- lue_painot()
- Funktio kysyy ensin käyttäjältä, kuinka monta lottopalloa tutkitaan.
Sen jälkeen se luo listan, jossa on paikat pallojen painoille, kysyy
kunkin pallon painon ja tallentaa sen omalle paikalleen listaan.
1. pallon paino tallennetaan listaan paikalle 0, 2. pallon paino paikalle
1 jne. Funktio palauttaa arvonaan tämän listan.
- laske_keskiarvo(luvut)
- Funktio laskee parametrina saadussa listassa olevien lukujen
keskiarvon ja palauttaa sen. Jos lista on tyhjä (siinä on 0 alkiota),
funktio palauttaa arvon 0.0.
- laske_keskihajonta(lukulista, keskiarvo)
- Funktio laskee ensimmäisenä parametrina annetun listan
lukujen keskihajonnan, kun lukujen keskiarvo on annettu toisena
parametrina. Funktio palauttaa arvonaan lasketun keskihajonnan.
Jos lista on tyhjä, funktio palauttaa arvon 0.0.
Keskihajonta saadaan vähentämällä listan jokaisesta alkiosta keskiarvo,
korottamalla näin saatu erotus toiseen potenssiin, laskemalla
näiden toiseen potenssiin korotettujen erotusten summa, jakamalla
summa alkioiden määrällä ja ottamalla lopuksi jakolaskun tuloksesta
neliöjuuri.
- etsi_huonot(painolista, keskiarvo, keskihajonta)
- Funktio saa ensimmäisenä parametrina lottopallojen painot
sisältävän listan,
toisena parametrina painojen keskiarvon ja kolmantena parametrina
painojen keskihajonnan. Funktio käy painot läpi ja lisää
erilliseen listaan (jonka se aluksi luo) niiden pallojen numerot,
jotka ovat liian kevyitä tai liian painavia. Funktio palauttaa
arvonaan tämän huonojen pallojen listan. Pallo on liian kevyt,
jos sen paino on vähemmän kuin keskiarvo - keskihajonta. Pallo
on liian painava, jos sen paino on enemmän kuin keskiarvo + keskihajonta.
Huomaa, että huonojen pallojen listaan lisätään pallojen numerot
(pallon paikka painolistassa + 1), ei niiden painoja.
- tulosta_poistettavat(huonot_pallot)
- Funktio saa arvonaan liian kevyiden ja liian painavien pallojen
numerot sisältävän listan. Jos lista on tyhjä, funktio tulostaa
"Kaikki pallot kelpaavat!". Jos taas listassa on alkioita, funktio
tulostaa "Seuraavat pallot ovat liian kevyita tai painavia:" ja tämän
jälkeen huonojen pallojen numerot kunkin omalla rivillään. Funktion
ei tarvitse palauttaa mitään arvoa.
Kirjoita lisäksi pääohjelma, joka kutsuu edellä kuvattuja funktioita
sopivasti niin, että ohjelma toimii edellä kuvatulla tavalla
esimerkkiajon mukaisesti. Kirjoita pääohjelma niin, että se myös
tulostaa painojen keskiarvon ja keskihajonnan niiden laskemisen
jälkeen. Keskiarvo ja keskihajonta tulostetaan kolmen desimaalin
tarkkuudella.
Muista jälleen testata ohjelmaasi ajamalla sitä itse Eclipsessä ennen kuin
palautat sen Gobliniin. Ohjelman ei tarvitse varautua virheellisiin
syötteisiin. Se ei saa kuitenkaan kaatua, jos käyttäjä antaa lottopallojen
määräksi nollan.
Palauta Gobliniin tiedosto lottopallot.py.
Esimerkkejä ohjelman suorituksesta:
[ohjelman suoritus alkaa]
Kuinka monta lottopalloa tutkitaan?
10
Anna 1. pallon paino (grammaa).
11.8
Anna 2. pallon paino (grammaa).
12.5
Anna 3. pallon paino (grammaa).
14.0
Anna 4. pallon paino (grammaa).
10.2
Anna 5. pallon paino (grammaa).
12.6
Anna 6. pallon paino (grammaa).
12.8
Anna 7. pallon paino (grammaa).
13.46
Anna 8. pallon paino (grammaa).
10.03
Anna 9. pallon paino (grammaa).
13.10
Anna 10. pallon paino (grammaa).
12.87
Painojen keskiarvo on 12.336 g.
Painojen keskihajonta on 1.240 g.
Seuraavat pallot ovat liian kevyita tai painavia:
3
4
8
[ohjelman suoritus päättyy]
[ohjelman suoritus alkaa]
Kuinka monta lottopalloa tutkitaan?
4
Anna 1. pallon paino (grammaa).
11.8
Anna 2. pallon paino (grammaa).
12.2
Anna 3. pallon paino (grammaa).
12.2
Anna 4. pallon paino (grammaa).
11.8
Painojen keskiarvo on 12.000 g.
Painojen keskihajonta on 0.200 g.
Kaikki pallot kelpaavat!
[ohjelman suoritus päättyy]
[ohjelman suoritus alkaa]
Kuinka monta lottopalloa tutkitaan?
0
Painojen keskiarvo on 0.000 g.
Painojen keskihajonta on 0.000 g.
Kaikki pallot kelpaavat!
[ohjelman suoritus päättyy]
Värikoodit:
Sininen: Syöte käyttäjältä
Vihreä: Ohjelman tuloste
Punainen: Erityishuomatus: ei tulosteta