Kierros 5, tehtävä 2

Kalenteri (200 p)

Tässä tehtävässä harjoitellaan erityisesti seuraavia asoita:

Tee Eclipseen uusi projekti, jonka nimi on tehtava5_2 ja tähän projektiin moduuli kalenteri. Kirjoita moduuliin ohjelma, joka tulostaa yhden kuukauden kalenterin alla olevan mallin mukaisesti:

Toukokuu
ma ti ke to pe la su
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

Käyttäjä kertoo, minkä kuukauden kalenteri tulostetaan, montako päivää tässä kuukaudessa on, sekä mikä on kuukauden ensimmäisen päivän viikonpäivä. Viikonpäivä ilmaistaan numeroin siten, että 1 tarkoittaa maanantaita ja 7 sunnuntaita. Ohjelmalla ei siis tarvitse olla itsellään tietoa eri kuukausien päivien lukumäärästä, vaan tarvittava tieto saadaan käyttäjältä.

Kirjoita ohjelmaan seuraava funktio:

Kirjoita lisäksi pääohjelma, joka pyytää käyttäjältä tarvittavat tiedot ja kutsuu tulosta_kalenteri-funktiota.

Vinkkejä kalenterin tulostamiseen

Ensimmäiseksi kannattaa tulostaa kuukauden nimi ja viikonpäivät sisältävä otsikkorivi omille riveilleen. Tämän jälkeen kannattaa tulostaa tyhjiä paikkoja tarvittava määrä sen mukaan, mistä viikonpäivästä kuukausi alkaa. Huomaa, että voit tulostaa samalle riville asioita usealla eri print-käskyllä, jos kirjoitat print-käskyn loppuun (yhdellä kerralla tulostettavien asioiden jälkeen) pilkun. Tällöin print-käsky lisää tulostettavan asian jälkeen yhden välilyönnin, mutta ei rivinvaihtoa. (Sopivan välilyöntimäärän tulostamisen voi hoitaa myös sopivalla merkkijonon "kertolaskulla", mutta koska merkkijono-operaatioita ei ole käyty kurssilla läpi siinä vaiheessa, kun tätä tehtävää on tarkoitus tehdä, on tulostus neuvottu tässä ja tehty esimerkkiratkaisussa ilman kertolaskuoperaatiota.)

Itse päivien numeroiden tulostamisen voi tehdä esimerkiksi kahdessa sisäkkäisessä silmukassa, joista sisempi tulostaa yhden viikon kaikki päivät (jälleen kannattaa käyttää apuna pilkkua print-operaation yhteydessä) ja ulompi pitää huolen siitä, että kaikki kuukauden viikot tulevat tulostettua. Apuna voi käyttää kahta eri kokonaislukumuuttujaa, joista toinen pitää kirjaa siitä, missä viikonpäivässä ollaan menossa, ja toinen kirjaa siitä, missä kuukauden päivässä ollaan menossa.

Toinen vaihtoehto on käyttää vain yhtä toistokäskyä ja tutkia aina jakojäännöksen avulla, koska on aika vaihtaa riviä. (Rivinvaihdon saa aikaiseksi kirjoittamalla print-käskyn ilman mitään muuta tulostettavaa.)

Kuukauden viimeisen päivän jälkeen tulostetaan rivinvaihto. Viimeistä riviä ei siis "täydennetä" lisäämällä viimeisen päivän jälkeen ylimääräisiä välilyöntejä.

Tehtävän palautus

Ohjelmasi voi olettaa, että käyttäjä antaa sille järkevän kuukauden päivien lukumäärän. Jos käyttäjän antama kuukauden aloitusviikonpäivä ei ole välillä 1-7, ohjelman on tulostettava virheilmoitus "Viikonpaivan on oltava valilla 1-7." ja lopetettava toimintansa. Ohjelman ei tarvitse varautua muihin virheellisiin syötteisiin. Muista huolehtia siitä, että ohjelmasi tulostaa rivinvaihdon myös viimeisen viikon jälkeen.

Testaa jälleen ohjelmaasi ajamalla sitä itse Eclipsessä useilla eri arvoilla ja tarkistamalla, että kalenteri näyttää oikealta. Kun ohjelmasi näyttää toimivan oikein, palauta Gobliniin tiedosto kalenteri.py.

Esimerkkejä ohjelman suorituksesta:

[ohjelman suoritus alkaa]
Ohjelma tulostaa yhden kuukauden kalenterin.
Anna kuukauden nimi.
Toukokuu
Montako paivaa kuukaudessa on?
31
Mika on 1. paivan viikonpaiva (1 = ma, 7 = su)?
6
Toukokuu
ma ti ke to pe la su
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
[ohjelman suoritus päättyy]

[ohjelman suoritus alkaa]
Ohjelma tulostaa yhden kuukauden kalenterin.
Anna kuukauden nimi.
Syyskuu
Montako paivaa kuukaudessa on?
30
Mika on 1. paivan viikonpaiva (1 = ma, 7 = su)?
3
Syyskuu
ma ti ke to pe la su
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
[ohjelman suoritus päättyy]

[ohjelman suoritus alkaa]
Ohjelma tulostaa yhden kuukauden kalenterin.
Anna kuukauden nimi.
Tammikuu
Montako paivaa kuukaudessa on?
31
Mika on 1. paivan viikonpaiva (1 = ma, 7 = su)?
0
Viikonpaivan on oltava valilla 1-7.
[ohjelman suoritus päättyy]

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