Tisk kalendáře

Zadání

Vytvořte funkci pro tisk měsíčního kalendáře se dny správně zarovnanými do týdnů.

def tisk_kalendare(mesic, rok):
    pass

Funkce má dva celočíselné parametry: číslo měsíce (1 až 12) a rok (předpokládá se platnost gregoriánského kalendáře). Nemá explicitní návratovou hodnotu, výstup provedený na konzoli má například pro leden 2000 tvar (tj. po volání funkce tisk_kalendare(1, 2000))

--------------------
leden 2000

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

Kalendář je na začátku i konci oddělen vodorovnou čarou, titulek označuje jméno měsíce a rok, následuje prázdný řádek a výpis dní zarovnaný do sloupců odpovídajících dnům v týdnu (neděle zcela vpravo).

Jak postupovat

Jedná se již o trochu komplexnější problém, než jakými jsme dosud zabývali, rozhodně však máte znalosti a schopnosti jej vyřešit. Je potřeba si nejprve úlohu rozmyslet a rozvrhnout si práci. Rozhodně by nebylo dobré vtěsnat veškerý kód do těla jedné funkce, naopak rozdělením do několika menších funkcí získáte možnost postupně vyřešit a vyzkoušet drobnější úlohy a následně bude váš program mnohem přehlednější1).

Je pravděpodobné, že v tomto programu využijete již známé funkce pro určení čísla juliánského dne pro zadané datum (můžete si ji stáhnout na této stránce) a pro zjištění přestupného roku (prestupny_rok.py). Zamyslete se, zda je vhodné vytvořit i další pomocné funkce, např. pro převod čísla měsíce do textového formátu, pro zjištění počtu dní v daném měsíci a dalších.

Naprogramujte nejprve pomocné funkce a vyzkoušejte, zda pracují správně. Obyčejně se doporučuje, aby velikost jedné funkce nepřesáhla 40 až 50 řádků (aby bylo možné zobrazit ji ve vašem editoru najednou). Také vhodné pojmenování funkcí (stejně jako u proměnných) vede k lepší srozumitelnosti kódu. Je možné, že v kódu většího rozsahu i vy oceníte možnost vysvětlivky formou komentáře či dokumentačního řetězce. Říkali jsme si, že na pořadí funkci ve zdrojovém souboru nezáleží (hlavní program je obyčejně umístěn až na konci).

S pomocí správně zvolených pomocných funkcí by vytvoření funkce tisk_kalendare nemělo být tak obtížné. Ověřte, zda vaše řešení správně pracuje v různých situacích (měsíc začíná jiným dnem než pondělím2), měsíc končí nedělí3), správně uvažuje únor v přestupných letech apod.).

Pokud je všechno v pořádku a chyby jsou odstraněny, pak lze pomocí jednoduchého cyklu vytisknou kalendář třeba na celý rok.

for i in range(12):
    tisk_kalendare(i + 1, 2018)
print('Hodně úspěchů v roce 2018 s Pythonem!')
1)
Hovořili jsme o tom při zavádění funkcí, nyní si to můžete v praxi ověřit.
2)
prázdné místo nerozhodí požadované formátování
3)
např. prosinec 2017 - na výstupu není nadbytečný prázdný řádek