Rästitehtävä 3

Ruoka-ainetilanne (400 p)

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ä. 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ää.

Tee Eclipseen uusi projekti, jonka nimi on tehtava10_3. Luo sitten tähän projektiin moduuli ruokavarasto ja kirjoita siihen ohjelma, joka lukee yhdestä tiedostosta käyttäjän kaapeissa ja muissa varastoissa olevat ruoka-aineet ja niiden määrät. Tämän jälkeen ohjelma lukee käyttäjän antamista tiedostoista reseptejä ja päättelee kunkin reseptin kohdalla, riittävätkö käyttäjän ruoka-aineet reseptin valmistamiseen ja jos eivät riitä, niin mitä ruoka-aineita ja paljonko käyttäjän pitää vielä hankkia.

Sekä varastotiedot että reseptit on tallennettu tiedostoon, jossa yhdellä rivillä on yhden ruoka-aineen tiedot. Kappaleittain käytettävistä ruoka-aineista (esim. kananmunat) riville on tallennettu määrä ja ruoka-aineen nimi. Muista tuotteista (esim. sokeri tai kerma) on tallennettu ruoka-aineen määrä grammoina (kokonaisluku), yksikkö g ja ruoka-aineen nimi. Samalla rivillä olevat eri tiedot on erotettu toisistaan kaksoispisteella. Voit katsoa mallia ruoka-ainetiedostosta kaapissa1.txt ja reseptitiedostosta makaronilaatikko.txt. Huomaa, että jos ruoka-aineen määrää ei lasketa kappaleittain, niin se on virheettömässä tiedostossa ilmoitettu aina grammoina. Vaikka käytännössä ei tehdäkään näin, niin sama yksikkö helpottaa tehtävän ratkaisun kirjoittamista, kun ei tarvitse tutkia vaadittavia yksikkömuunnoksia. Reseptitiedostoissa on vain luettelo tarvittavista ruoka-aineista ja niiden määristä, ei valmistusohjetta.

Ohjelma kysyy ensin, mistä tiedostosta ruoka-ainetiedot luetaan. Se lukee ko. tiedoston ja tallentaa tiedot sanakirjaan, jossa avaimena on kunkin ruoka-aineen nimi ja siihen liittyvänä arvona ruoka-aineen määrä varastossa. Jos sama ruoka-aine esiintyy tiedostossa useaan kertaan, ohjelma laskee yhteen sen eri määrät.

Seuraavaksi ohjelma pyytää käyttäjältä reseptitiedoston nimeä. Se lukee tiedoston ja kertoo, riittävätkö varastossa olevat ruoka-aineet reseptin toteuttamiseen. Jos jokin ruoka-aine puuttuu kokonaan, ohjelma ilmoittaa, paljonko sitä pitää hankkia lisää. Voit olettaa, että sama ruoka-aine on reseptitiedostossa vain yhteen kertaan. Katso tarkemmin esimerkkiajoista, millainen ohjelman tulostuksen pitää olla. Kun ohjelma on käsitellyt yhden reseptitiedoston, se pyytää käyttäjältä seuraavan reseptitiedoston nimen. Seuraavaa reseptiä käsitellessä ei oteta huomioon aikaisempiin resepteihin kuluvia ruoka-aineita. Ohjelma ei siis tutki, riittävätkö ruoka-aineet kaikkiin käyttäjän antamiin resepteihin, vaan se tutkii jokaista reseptiä erikseen. Ohjelma päättyy, kun käyttäjä antaa reseptitiedoston nimeä kysyttäessä tyhjän merkkijonon. Tällöin ohjelma vielä tulostaa "Ohjelman suoritus paattyy."

Virhetilanteiden käsittely

Ohjelman on selviydyttävä seuraavista virhetilanteista:

Katso esimerkkiajoista tarkemmin, millainen ohjelman tulostuksen pitää olla eri virhetilanteissa. Ruoka-aineiden riittävyyttä tutkitaan samalla kuin reseptitiedostoja luetaan, joten virheilmoitukset tiedoston sisällöstä ja ilmoitukset puuttuvista ruoka-aineista voivat vuorotella. Ilmoitukset puuttuvista ruoka-aineista tulostetaan samassa järjestyksessä kuin ne esiintyvät reseptitiedostossa. Ohjelman ei tarvitse tarkistaa tiedostosta luettujen lukujen järkevyyttä muuten kuin että ne ovat kokonaislukuja. Esimerkkejä virheellisestä ruoka-ainetiedostosta voit katsoa tiedostosta kaapissa2.txt ja reseptitiedostosta voit katsoa tiedostosta virheresepti.txt.

Huomaa, että try-except-rakenteita voi kirjoittaa myös sisäkkäin samaan tapaan kuin sisäkkäisiä if-käskyjä.

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.

Kopioi tiedostot kaapissa1.txt, kaapissa2.txt, makaronilaatikko.txt, jauhelihakeitto.txt, taytekakku.txt ja pikaruoka.txt ja virheresepti.txt samaan hakemistoon ohjelmasi kanssa, jotta pystyisit testaamaan ohjelmaasi. Palauta Gobliniin tiedosto ruokavarasto.py.

Esimerkkejä ohjelman suorituksesta:

[ohjelman suoritus alkaa]
Ohjelma tarkistaa, riittavatko varastosi reseptin toteuttamiseen.
Mista tiedostosta varastotiedot luetaan?
kaapissa1.txt
Anna tarkistettavan reseptin tiedosto.
pikaruoka.txt
Varaston tuotteet riittavat reseptin toteuttamiseen.
Anna tarkistettavan reseptin tiedosto.
makaronilaatikko.txt
Hankittava viela 400 g makaroni
Hankittava viela 450 g maito
Hankittava viela 1 sipuli
Anna tarkistettavan reseptin tiedosto.
taytekakku.txt
Hankittava viela 200 g sokeri
Hankittava viela 5 g leivinjauhe
Hankittava viela 200 g kuohukerma
Hankittava viela 2 banaani
Anna tarkistettavan reseptin tiedosto.
jauhelihakeitto.txt
Hankittava viela 1 keittojuurespakaste
Hankittava viela 100 g jauheliha
Hankittava viela 1 g basilika
Anna tarkistettavan reseptin tiedosto.

Ohjelman suoritus paattyy.
[ohjelman suoritus päättyy]

[ohjelman suoritus alkaa, tiedostoissa virheellisia riveja]
Ohjelma tarkistaa, riittavatko varastosi reseptin toteuttamiseen.
Mista tiedostosta varastotiedot luetaan?
kaapissa2.txt
Rivilla virheellinen yksikko: 2:dl:maito
Virheellinen rivi: 1
Virheellinen rivi: 
Virheellinen rivi: 100:g:mustikka:varmaan pilaantunut
Anna tarkistettavan reseptin tiedosto.
pikaruoka.txt
Hankittava viela 80 g pikanuudeli
Hankittava viela 300 g vesi
Anna tarkistettavan reseptin tiedosto.
virheresepti.txt
Rivilla virheellinen yksikko: 2:dl:sokeria
Virheellinen maara rivilla: vahan:suolaa
Hankittava viela 500 g maito
Virheellinen rivi: 200:g:kermaa:hapan kay
Virheellinen rivi: 
Anna tarkistettavan reseptin tiedosto.

Ohjelman suoritus paattyy.
[ohjelman suoritus päättyy]

[ohjelman suoritus alkaa, ruoka-ainetiedostoa ei pystyta lukemaan]
Ohjelma tarkistaa, riittavatko varastosi reseptin toteuttamiseen.
Mista tiedostosta varastotiedot luetaan?
kaapissa.txt
Varastotietoja sisaltavan tiedoston luku ei onnistu.
[ohjelman suoritus päättyy]

[ohjelman suoritus alkaa, yhtä reseptitiedostoa ei pystyta lukemaan]
Ohjelma tarkistaa, riittavatko varastosi reseptin toteuttamiseen.
Mista tiedostosta varastotiedot luetaan?
kaapissa1.txt
Anna tarkistettavan reseptin tiedosto.
jotain.txt
Reseptitiedoston luku ei onnistu.
Anna tarkistettavan reseptin tiedosto.
pikaruoka.txt
Varaston tuotteet riittavat reseptin toteuttamiseen.
Anna tarkistettavan reseptin tiedosto.

Ohjelman suoritus paattyy.
[ohjelman suoritus päättyy]

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