Stel een maandkalender op voor een gegeven maand in een gegeven jaar. Hierbij is het niet toegelaten om gebruik te maken van modules uit The Python Standard Library.

maandkalender

Opgave

  1. Schrijf een functie schrikkeljaar die voor een gegeven jaar $$j$$ (dat als integer argument aan de functie moet doorgegeven worden) een Booleaanse waarde teruggeeft die aangeeft of $$j$$ een schrikkeljaar is of niet. Schrikkeljaren zijn jaren die deelbaar zijn door 4. Hou echter rekening met het feit dat enkel eeuwjaren die deelbaar zijn door 400 (zoals 2000) schrikkeljaren zijn, terwijl eeuwjaren die niet deelbaar zijn door 400 (zoals 1700, 1800, 1900) geen schrikkeljaren zijn.

  2. Schrijf een functie weekdag die voor een gegeven dag $$d$$, maand $$m$$ en jaar $$j$$ aangeeft op welke weekdag deze dag valt. Dit kan op de volgende manier berekend worden:
    \[ \begin{array}{rcl} j_0 & = & j - \frac{(14 - m)}{12} \\ x   & = & j_0 + \frac{j_0}{4} - \frac{j_0}{100} + \frac{j_0}{400} \\ m_0 & = & m + 12 \left(\frac{14 - m}{12}\right) - 2 \\ d_0 & = & (d + x + \frac{31m_0}{12})\!\!\!\mod 7 \end{array} \]
    Hierbij stellen alle breuken gehele delingen voor (quotiënt) en staat mod voor de modulo operator (rest na gehele deling). De waarde $$d_0$$ moet door de functie teruggegeven worden, waarbij de waarde 0 staat voor zondag, 1 voor maandag, 2 voor dinsdag, enzoverder. De argumenten $$d$$, $$m$$ en $$j$$ moeten als optionele integer argumenten aan de functie doorgegeven worden. Als standaardwaarden gebruik je de waarden die overeenkomen met 2 februari 2012.

  3. Gebruik de functies schrikkeljaar en weekdag om een functie kalender te schrijven, die de maandkalender voor een gegeven maand in een gegeven jaar (beide worden als integer argumenten aan de functie doorgegeven) uitschrijft. De eerste regel van de kalender bevat de nederlandstalige naam van de maand (met kleine letters), gevolgd door een spatie en het jaartal, waarbij de volledige tekst gecentreerd wordt uitgeschreven over 20 posities. De volgende regel bevat de opeenvolgende weekdagen, telkens afgekort tot twee kleine letters, startend met zondag en gescheiden door spaties. Daarna volgen op verschillende regels alle dagen van de maand, netjes uitgelijnd onder de juiste weekdag waarop deze dagen vallen. De dagen worden telkens rechts uitgelijnd over twee posities uitgeschreven, met een spatie tussen de verschillende dagen zoals dat ook voor de weekdagen in de hoofding gebruikt werd. De uitvoer van de kalender bevat geen lege regels, en er staan nooit spaties op het einde van een regel.

Voorbeeld

>>> schrikkeljaar(2000)
True
>>> schrikkeljaar(2011)
False
>>> schrikkeljaar(2012)
True
>>> schrikkeljaar(2100)
False
>>> weekdag(2, 8, 1953)
0
>>> weekdag(21, 1, 2012)
6
>>> weekdag()
4
>>> weekdag(j=2011)
3
>>> kalender(1, 2012)
    januari 2012
zo ma di wo do vr za
 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
>>> kalender(2, 2012)
   februari 2012
zo ma di wo do vr za
          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
>>> kalender(2, 2013)
   februari 2013
zo ma di wo do vr za
                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