Tällä rästitehtävällä voit korvata toisen kierroksista 7 tai 8. Jos sinulta puuttuu minimipisteet molemmilta näistä kierroksista, sinun pitää tehdä sekä tämä tehtävä että rästitehtävä 1 tai 2. Jotta rästitehtävä korvaisi tehtäväkierroksen, siitä on saatava vähintään 300 pistettä. Vaikka saisit tehtävästä enemmän pisteitä, niin harjoitustehtäväarvosanaa määrättäessä tällä tehtävällä korvatun kierroksen pistemääräksi lasketaan kuitenkin vain korvattavan kierroksen minimipistemäärä.
Tee Eclipseen uusi projekti, jonka nimi on tehtava10_3. Luo sitten tähän projektiin moduuli kirjanpito ja kirjoita siihen ohjelma, joka lukee tiedostosta teekkarin menokirjanpidon ja tulostaa yhteenvedon tiedostossa olevista menoista alla tarkemmin kuvatulla tavalla.
Aluksi ohjelma kysyy, mistä tiedostosta menokirjanpito luetaan. Käyttäjän eri asioista maksamat summat on esitetty tiedostossa niin, että yhdellä rivillä on yhden maksun tiedot. Rivillä on ensin maksun päivämäärä, sitten menolaji (joko ruoka, asuminen, opiskelu, matkat, vaatteet tai sitten jokin mielivaltainen laji), tämän jälkeen maksun tarkempi kuvaus ja sitten maksettu summa euroina. Rivin eri osat on erotettu toisistaan kauttaviivalla. Voit katsoa mallia virheettömästä tiedostosta tiedostosta kuluja1.txt ja myös virheellisiä rivejä sisältävästä tiedostosta tiedostosta kuluja2.txt.
Ohjelmasi pitää lukea tiedoston rivit ja sen jälkeen tulostaa tiedostossa olevat maksut menolajeittain. Katso tarkemmin alla olevista esimerkkiajoista. Kuhunkin menolajiin kuuluvat maksut tulostetaan samassa järjestyksessä kuin mitä ne ovat tiedostossa. Maksuista tulostetaan ensin päivämäärä, sitten maksun tarkempi kuvaus ja sitten maksettu summa. Päivämäärälle varataan 6 merkin levyinen kenttä, maksun tarkemmalle kuvaukselle 30 merkin levyinen kenttä ja maksetulle summalle 8 merkin levyinen kenttä (tulostus kahden desimaalin tarkkuudella). Lisäksi kenttien välillä on yksi välilyönti. Päivämäärä ja maksun tarkempi kuvaus tulostetaan kentän vasempaan reunaan.
Kaikki ne maksut, joden menolajina ei ole ruoka, asuminen, opiskelu, matkat tai vaatteet, tulostetaan otsikon "MUUT MENOT" alla. Kun yhteen menolajiin kuuluvat maksut on tulostettu, tulostetaan vielä menolajiin kuuluvien maksujen summa kahden desimaalin tarkkuudella. Menolajien järjestyksen on oltava sama kuin esimerkkiajossa. Jos johonkin menolajiin ei kuulu lainkaan maksuja, tulostetaan vain heti lajin otsikon jälkeen teksti "Yhteensa 0.00 euroa." Otsikossa oleva viiva on saatu aikaan tulostamalla kymmenen tavuviivaa.
Jos ohjelma ei pysty jostain syystä lukemaan annettua tiedostoa tai annetun nimistä tiedosto ei löydy, ohjelma ilmoittaa virheestä ja lopettaa toimintansa. Jos tiedoston jollain rivillä ei ole täsmälleen neljää toisistaan kauttaviivalla erotettua osaa, ohjelma tulostaa virheilmoituksen "Virheellinen rivi:" ja tämän jälkeen virheellisen rivin. Ohjelma kuitenkin jatkaa toimintaansa tämän jälkeen lukemalla normaalisti tiedoston seuraavan rivin. Jos jollain rivillä on neljä osaa, mutta viimeinen niistä ei esitä lukua, ohjelma tulostaa virheilmoituksen "Virheellinen luku rivilla:" ja tämän jälkeen virheellisen rivin. Tämänkin jälkeen ohjelma jatkaa toimintaansa lukemalla normaalisti tiedoston seuraavan rivin. Virheilmoitukset tulostetaan siinä vaiheessa, kun tiedostoa ollaan lukemassa, ei siis silloin, kun ohjelma jo tulostaa eri menolajeihin kuuluvia menoja.
Ohjelman rakennetta ei ole tässä sen tarkemmin määrätty, vaan voit suunnitella itse esimerkiksi sen, mitä funktioita ohjelmasi sisältää. Älä kuitenkaan kirjoita koko ohjelmaa yhteen pääohjelmaan. Eri menolajeihin kuuluvia maksusuorituksia kuvaavat rivit tai niistä hajotetut listat kannattaa tallentaa omiin listoihinsa (siis esimerkiksi ruokaan liittyvät menot yhteen listaan), koska tällöin samaan menolajiin kuuluvien menojen tulostaminen peräkkäin on helppoa
Virhetilanteita käsitellessä kannattaa huomata, että try-except-rakenteita voi kirjoittaa myös sisäkkäin.
Kopioi tiedostot kuluja1.txt ja kuluja2.txt samaan hakemistoon ohjelmasi kanssa, jotta pystyisit testaamaan ohjelmaasi. Palauta Gobliniin tiedosto kirjanpito.py.
Huomautus: Yhden maksukerran tietoja olisi luontevaa käsitellä olioiden avulla. Tässä tehtävässä ei ole kuitenkaan tehty niin, koska olio-ohjelmointi ei kuulu harjoituskierrosten 7-8 esitietoihin.
[ohjelman suoritus alkaa] Mista tiedostosta kirjanpito luetaan? kuluja1.txt Menojen yhteenveto RUOKA ---------- 2.11. lounas 2.30 euroa 3.11. K-kauppa 15.70 euroa 3.11. Ravintola Cantina 7.85 euroa Yhteensa 25.85 euroa. ASUMINEN ---------- 1.11. vuokra 251.52 euroa 5.11. uudet lakanat 30.50 euroa Yhteensa 282.02 euroa. OPISKELU ---------- Yhteensa 0.00 euroa. MATKAT ---------- 4.11. matkakortin lataus 45.78 euroa Yhteensa 45.78 euroa. VAATTEET ---------- 3.11. T-paita 22.30 euroa Yhteensa 22.30 euroa. MUUT MENOT ---------- 8.11. muutama kalja 20.80 euroa 9.11. Burana 3.20 euroa Yhteensa 24.00 euroa. [ohjelman suoritus päättyy]
[ohjelman suoritus alkaa, tiedostossa virheellisia riveja] Mista tiedostosta kirjanpito luetaan? kuluja2.txt Virheellinen luku rivilla: 1.12./asuminen/vuokra/ilmaiseksi kotona Virheellinen rivi: 3.12./tietoa puuttuu Menojen yhteenveto RUOKA ---------- 2.11. lounas 2.30 euroa 3.11. K-kauppa 15.70 euroa 3.11. Ravintola Cantina 7.85 euroa 2.12. Silinteri 2.60 euroa Yhteensa 28.45 euroa. ASUMINEN ---------- 1.11. vuokra 251.52 euroa 5.11. uudet lakanat 30.50 euroa Yhteensa 282.02 euroa. OPISKELU ---------- Yhteensa 0.00 euroa. MATKAT ---------- 4.11. matkakortin lataus 45.78 euroa Yhteensa 45.78 euroa. VAATTEET ---------- 3.11. T-paita 22.30 euroa 4.12. tonttulakki 4.75 euroa Yhteensa 27.05 euroa. MUUT MENOT ---------- 8.11. muutama kalja 20.80 euroa 9.11. Burana 3.20 euroa Yhteensa 24.00 euroa. [ohjelman suoritus päättyy]
[ohjelman suoritus alkaa, tiedostoa ei pystyta lukemaan] Mista tiedostosta kirjanpito luetaan? jotain.txt Virhe tiedoston jotain.txt lukemisessa. Ohjelma paattyy. [ohjelman suoritus päättyy]
Värikoodit:
Sininen: Syöte käyttäjältä
Vihreä: Ohjelman tuloste
Punainen: Erityishuomatus: ei tulosteta