title: "Kierros 7, tehtävä 1: Lukujen lukeminen tiedostosta - Eväsleivät" description: Kierros 7, tehtävä 1 instructions: |

Lukujen lukeminen tiedostosta - Eväsleivät (50 p)

Tässä tehtävässä harjoitellaan seuraavia asioita:

Näitä aiheita käsitellään kurssimateriaalin luvussa 7 (kappaleet 7.1 ja 7.3)

Alkuvalmistelut

Tee Eclipsessä uusi projekti, jonka nimi on tehtava7_1. Luo sitten tähän projektiin moduuli, jonka nimi on esimerkiksi "hintavertailu".

Tehtävän kuvaus

Tekstitiedostoon on kerätty lähikauppojen eväsleipien hintoja. Alla on annettu kurssimateriaalin esimerkin mallin mukaan kirjoitettu koodi, joka lukee tiedostosta hintoja yksi kerrallaan ja laskee näiden hintojen keskiarvon. Muokkaa koodia siten, että se laskeekin ja tulostaa keskiarvon sijaan sen, kuinka moni hinnoista riittää käyttäjän eväsleipäbudjettiin eli on pienempi tai yhtäsuuri kuin käyttäjän antama arvo. Jos tiedostossa ei ole annettu yhtään hintaa, ohjelma tulostaa tekstin

Yksikaan tuote ei sovi X euron budjettiin.
jossa X tulostetaan kahden desimaalin tarkkuudella.

Tiedoston rakenne

Euroina annetut hinnat on tallennettu tekstitiedostoon niin, että kukin hinta (yksi desimaaliluku) on tallennettu omalle rivilleen. Rivillä ei ole mitään muuta tietoa. Voit katsoa mallia tiedoston muodosta tiedostoista hinnat1.txt, hinnat2.txt ja vähän virheellisestä tiedostosta hinnat3.txt. Tallenna nämä tiedostot samaan projektiin (hakemistoon) ohjelmakoodisi kanssa ohjelmasi testaamista varten. (Ohjelmasi pitää kuitenkin toimia myös muilla tiedostoilla kuin näillä kolmella.)

Valmiina annettu ohjelma

Kopioi seuraava ohjelma mooduuliisi ja muokkaa sitä tehtävänannon ohjeiden mukaisesti:

    def main():
        name = input("Minka nimisesta tiedostosta lahtotiedot luetaan?\n")
        total = 0.0
        count = 0
        try:
            pricefile = open(name, "r")
            for line in pricefile:
                line = line.rstrip()
                price = float(line)
                total += price
                count += 1
            pricefile.close()
            if count == 0:
                print("Tiedostossa ei ollut yhtaan hintaa.")
            else:
                avg = total / count
                print("Hintojen keskiarvo on", avg)
        except OSError:
            print("Tiedoston {:s} lukemisessa tuli virhe. Ohjelma paattyy.".format(name))
        except ValueError:
            print("Tiedostossa {:s} on virheellinen luku. Ohjelma paattyy".format(name))

    main()
    

Virheiden käsittely

Jos tiedoston lukemisessa tapahtuu virhe (esimerkiksi haluttua tiedostoa ei ole olemassa), ohjelma ilmoittaa virheestä tiedoston lukemisessa ja lopettaa toimintansa. Jos tiedoston jollain rivillä on jotain muuta kuin yksi desimaaliluku, ohjelma tulostaa ilmoituksen virheellisestä rivistä ja lopettaa toimintansa. Katso tarkemmin ohjelman kolmannesta ja neljännestä suoritusesimerkistä, millaisia virheilmoitusten pitää olla eri tilanteissa.

Käytännössä virheiden käsittely menee oikein, jos et muuta siitä huolehtivaa osaa valmiina annetussa ohjelmassa.

Ohjelman tulostus

Ole tarkka siitä, että ohjelmasi tulostus on suunnilleen alla olevan mallin mukainen (kirjainten kokoa, rivinvaihtoja, välilyöntejä, pisteitä, pilkkuja, huuto- ja kysymysmerkkejä ei tarkisteta).

Palauttaminen

Ennen ohjelman palautusta A+:aan testaa ohjelmaasi ajamalla sitä itse ja käyttämällä eri luettavia tiedostoja (voit tehdä niitä helposti myös itse Eclipsessä valitsemalla projektin tehtava7_1 ja sen jälkeen valikosta File->New->File. Anna tallennettaessa sellainen tiedoston nimi, joka päättyy .txt). Palauta A+:aan tiedosto hintavertailu.py.

Esimerkkejä ohjelman suorituksesta:

    [ohjelman suoritus alkaa]
    Minka nimisesta tiedostosta lahtotiedot luetaan?
    hinnat1.txt
    Mika on budjettisi evasleivalle euroissa?
    3.8
    5 tuotetta sopii 3.80 euron budjettiin.
    [ohjelman suoritus päättyy]
    

    [ohjelman suoritus alkaa, yksikään hinnoista ei ole alle pyydetyn hinnan]
    Minka nimisesta tiedostosta lahtotiedot luetaan?
    hinnat2.txt
    Mika on budjettisi evasleivalle euroissa?
    2.50
    Yksikaan tuote ei sovi 2.50 euron budjettiin.
    [ohjelman suoritus päättyy]
    

    [ohjelman suoritus alkaa, tiedostossa virheitä]
    Minka nimisesta tiedostosta lahtotiedot luetaan?
    hinnat3.txt
    Mika on budjettisi evasleivalle euroissa?
    4.6
    Tiedostossa hinnat3.txt on virheellinen luku. Ohjelma paattyy.
    [ohjelman suoritus päättyy]
    

    [ohjelman suoritus alkaa, tiedostoa ei löydy tai sen lukeminen ei onnistu]
    Minka nimisesta tiedostosta lahtotiedot luetaan?
    tuntematon.txt
    Tiedoston tuntematon.txt lukemisessa tuli virhe. Ohjelma paattyy.
    [ohjelman suoritus päättyy]
    

Värikoodit:
Sininen: Syöte käyttäjältä
Vihreä: Ohjelman tuloste
Punainen: Erityishuomautus: ei tulosteta


Last modified: Sat Aug 10 10:55:17 EEST 2019