Dokumentace k projektu pro prˇedmeˇty IZP a IUS
Rozdı´l kalenda´rˇnı´ch dat projekt cˇ. 2
27. za´rˇ´ı 2007
Autor: Ing. David Martinek,
[email protected] ´ stav Inteligentnı´ch Syste´mu˚ U Fakulta Informacˇnı´ch Technologiı´ Vysoke´ Ucˇenı´ Technicke´ v Brneˇ
Obsah 1
´ vod U
2
Analy´za proble´mu a princip jeho rˇesˇenı´ 2.1 Zada´nı´ proble´mu . . . . . . . . . . . . 2.2 Gregoria´nsky´ kalenda´rˇ . . . . . . . . . 2.3 Pocˇa´tek letopocˇtu . . . . . . . . . . . . 2.4 Proble´m prˇechodny´ch letopocˇtu˚ . . . . 2.5 Mozˇna´ rˇesˇenı´ vy´pocˇtu rozdı´lu dvou dat .
1
. . . . .
2 2 2 3 3 3
. . . . .
4 4 4 4 5 5
4
Popis rˇesˇenı´ 4.1 Ovla´da´nı´ programu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Volba datovy´ch typu˚ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 Vlastnı´ implementace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6 6 6 6
5
Za´veˇr
7
3
Na´vrh rˇesˇenı´ proble´mu 3.1 Volba rozsahu . . . . . . 3.2 Vy´pocˇet rozdı´lu . . . . . 3.3 Vy´pocˇet prˇechodny´ch let 3.4 Analy´za vstupnı´ch dat . . 3.5 Specifikace testu˚ . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
A Metriky ko´du
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
9
i
Kapitola 1 ´ vod U Pocˇ´ıta´nı´ s daty podle kalenda´rˇe je z pohledu algoritmizace zajı´mavy´ proble´m. Na kalenda´rˇ se lze dı´vat jako na zcela specifickou cˇ´ıselnou soustavu, v nı´zˇ jednotlive´ rˇa´dy (dny, meˇsı´ce, roky) majı´ naprosto rozdı´lny´ rozsah hodnot. Gregoria´nsky´ kalenda´rˇ, ktery´ se u na´s dnes pouzˇ´ıva´, obsahuje navı´c mnozˇstvı´ dalsˇ´ıch nepravidelnostı´ jako jsou ru˚zne´ de´lky meˇsı´cu˚ cˇi prˇestupne´ roky. Vsˇechna tato specifika je samozrˇejmeˇ nutne´ prˇi vy´pocˇtech zohlednit. Tento dokument popisuje na´vrh a implementaci aplikace pro vy´pocˇet rozdı´lu dvou kalenda´rˇnı´ch dat. Navrzˇeny´ program funguje jako konzolova´ aplikace, ktera´ ze standardnı´ho vstupu prˇecˇte dveˇ data podle gregoria´nske´ho kalenda´rˇe zadana´ v prˇesneˇ specifikovane´m forma´tu a na standardnı´ vy´stup vypı´sˇe jejich rozdı´l jako pocˇet dnu˚, ktere´ se nacha´zejı´ v tomto intervalu. Dokument se skla´da´ z neˇkolika cˇa´stı´. V kapitole 2 se veˇnuji analy´ze proble´mu˚ spojeny´ch s pouzˇ´ıva´nı´m gregoria´nske´ho kalenda´rˇe a popisem jejich mozˇny´ch rˇesˇenı´. Kapitola 3 se zaby´va´ algoritmem vy´pocˇtu prˇechodny´ch roku˚ a vlastnı´ho vy´pocˇtu rozdı´lu zadany´ch kalenda´rˇnı´ch dat. Meznı´ stavy, ktere´ byly odvozeny prˇi na´vrhu teˇchto algoritmu˚, byly pouzˇity pro na´vrh testovacı´ch hodnot aplikace, cozˇ je popsa´no v kapitole 3.5. Kapitola 4 je pak veˇnova´na konkre´tnı´ konecˇne´ implementaci.
1
Kapitola 2 Analy´za proble´mu a princip jeho rˇesˇenı´ Protozˇe kalenda´rˇnı´ aritmetika je netrivia´lnı´ proble´m, podı´va´m se na neˇj v te´to kapitole podrobneˇji. Pro pochopenı´, jak dnesˇnı´ kalenda´rˇ vypada´ a procˇ, je uzˇitecˇne´ veˇdeˇt neˇco o jeho historii. Da´le se v te´to kapitole zameˇrˇ´ım na ru˚zne´ mozˇnosti, ktere´ se pro vy´pocˇet rozdı´lu kalenda´rˇnı´ch dat nabı´zı´.
2.1
Zada´nı´ proble´mu
Cı´lem tohoto projektu je vytvorˇenı´ programu v jazyce C, ktery´ vypocˇte pocˇet dnu˚ mezi dveˇma kalenda´rˇnı´mi daty. Program musı´ zohlednit prˇestupne´ roky. Program musı´ nacˇ´ıtat oba kalenda´rˇnı´ u´daje ze standardnı´ho vstupu ve forma´tu dd.mm.rrrr-dd.mm.rrrr. Vy´sledek bude vypisova´n na standardnı´ vy´stup. Tento u´daj bude mı´t vy´znam pocˇtu dnı´ mezi zadany´mi daty, tedy pocˇet dnı´, ktere´ ubeˇhly od drˇ´ıveˇjsˇ´ıho data do data pozdeˇjsˇ´ıho. Nenı´ prˇedepsa´no v jake´m porˇadı´ musı´ by´t vu˚cˇi sobeˇ oba vstupnı´ u´daje (starsˇ´ı-noveˇjsˇ´ı, noveˇjsˇ´ı-starsˇ´ı), proto ani vy´sledna´ aplikace nebude porˇadı´ u´daju˚ striktneˇ vyzˇadovat.
2.2
Gregoria´nsky´ kalenda´rˇ
V dnesˇnı´m sveˇteˇ se aktivneˇ pouzˇ´ıva´ neˇkolik ru˚zny´ch kalenda´rˇu˚ (cˇ´ınsky´, zˇidovsky´, ...). V cˇa´stech sveˇta ovlivneˇny´ch krˇest’anstvı´m se dnes pouzˇ´ıva´ takzvany´ gregoria´nsky´ kalenda´rˇ [1]. Vznikl narˇ´ızenı´m ˇ ehorˇe XIII. a nahradil starsˇ´ı julia´nsky´ kalenda´rˇ zavedeny´ Juliem Caesarem. Gregoria´nsky´ papezˇe R kalenda´rˇ byl vyhla´sˇen 5. rˇ´ıjna 1582 podle julia´nske´ho kalenda´rˇe, cozˇ je podle gregoria´nske´ho kalenda´rˇe 15. rˇ´ıjna 1582. Novy´ kalenda´rˇ byl vytvorˇen zprˇesneˇnı´m julia´nske´ho kalenda´rˇe, ktery´ se za jedno a pu˚l tisı´ciletı´ fungova´nı´ zpozˇd’oval oproti astronomicke´mu1 roku o te´meˇrˇ deset dnı´. V nove´m kalenda´rˇi prˇibylo dalsˇ´ı pravidlo pro vy´pocˇet prˇestupny´ch let, ktere´ prˇida´va´ mezi prˇestupne´ roky i ty letopocˇty, ktere´ jsou deˇlitelne´ 400 (podle stare´ho kalenda´rˇe byly prˇestupne´ roky deˇlitelne´ cˇtyrˇmi a roky deˇlitelne´ stem prˇestupne´ nebyly). Gregoria´nsky´ kalenda´rˇ nebyl prˇijat okamzˇiteˇ. Ru˚zne´ sta´ty v Evropeˇ i ve sveˇteˇ tento kalenda´rˇ prˇijı´maly postupneˇ, takzˇe naprˇ´ıklad v Cˇecha´ch byl prˇijat na zacˇa´tku roku 1584, na Moraveˇ o pu˚l roku pozdeˇji, na Slovensku azˇ roku 1857, v protestantsky´ch sta´tech azˇ kolem roku 1700, v Rusku v roce ˇ ecku dokonce azˇ roku 1923 (viz [1]). 1918 a v R Toto historicke´ pozadı´ zava´deˇnı´ gregoria´nske´ho kalenda´rˇe zde uva´dı´m proto, aby bylo zrˇejme´, nejenom jak je tento kalenda´rˇ organizova´n, ale take´ proto, aby bylo videˇt, jake´ proble´my mohou nastat prˇi prakticky´ch vy´pocˇtech rozdı´lu dvou kalenda´rˇnı´ch u´daju˚. Zavedenı´m nove´ho kalenda´rˇe vznikl proble´m nespojitosti v pocˇ´ıta´nı´ cˇasu. Vinou ru˚zny´ch dat prˇijetı´ kalenda´rˇe v ru˚zny´ch cˇa´stech sveˇta nenı´ mozˇne´ jednodusˇe stanovit pocˇa´tecˇnı´ datum pouzˇ´ıva´nı´. Prˇesny´ vy´pocˇet je nutneˇ za´visly´ na zemeˇpisne´ poloze. Z teˇchto du˚vodu˚ jsem se rozhodl akceptovat prˇi rˇesˇenı´ vsˇechna data od pocˇa´tku letopocˇtu. 1
Astronomicky´ rok nebo take´ tropicky´ je da´n dobou obeˇhu Zemeˇ kolem Slunce. V soucˇasne´ dobeˇ to cˇinı´ 365,24219
dne.
2
X let
N1 0
365
N2 0
365
ˇ esˇenı´ s postupny´m vy´pocˇtem pocˇtu dnı´ mezi zadany´mi daty. Obra´zek 2.1: R
N2 N1 1.1.1
N2−N1 14.3.1617
23.10.2004
Obra´zek 2.2: Rˇesˇenı´ s vy´pocˇtem dnı´ od pocˇa´tku letopocˇtu.
2.3
Pocˇa´tek letopocˇtu
Krˇest’ansky´ kalenda´rˇ zacˇ´ına´ rokem prˇedpokla´dane´ho narozenı´ Jezˇ´ısˇe Krista. Spornost tohoto u´daje nenı´ pro rˇesˇenı´ te´to u´lohy podstatna´. Podstatneˇjsˇ´ı je, zˇe v dobeˇ vytva´rˇenı´ kalenda´rˇe se jesˇteˇ v matematice nepouzˇ´ıval pojem nula, takzˇe letopocˇet zacˇ´ına´ od roku 1 (to je take´ du˚vod, procˇ desetiletı´ a stoletı´ nezacˇ´ınajı´ rokem deˇlitelny´m 10 nebo 100, ale azˇ rokem na´sledujı´cı´m). Prvnı´ akceptovatelne´ datum v nasˇem letopocˇtu je tedy 1. ledna roku 1.
2.4
Proble´m prˇechodny´ch letopocˇtu˚
V gregoria´nske´m kalenda´rˇi ma´ beˇzˇny´ rok 365 dnı´, u´nor ma´ pak 28 dnı´. Protozˇe slunecˇnı´ rok je asi o cˇtvrt dne delsˇ´ı, ma´ gregoria´nsky´ kalenda´rˇ kazˇde´ cˇtyrˇi roky den navı´c – jedna´ se o prˇestupny´ rok. V tomto roce ma´ u´nor 29 dnı´ a cely´ rok ma´ potom 366 dnı´. Aby se kalenda´rˇ co nejme´neˇ odchyloval od astronomicke´ho roku, byla stanovena tato pravidla pro vy´pocˇet prˇestupny´ch let: • Prˇestupny´ je kazˇdy´ rok, ktery´ je beze zbytku deˇlitelny´ 4, • kromeˇ teˇch let, ktere´ jsou beze zbytku deˇlitelne´ 100, • s vy´jimkou teˇch let, ktere´ jsou beze zbytku deˇlitelne´ 400, ktere´ jsou take´ prˇestupne´.
2.5
Mozˇna´ rˇesˇenı´ vy´pocˇtu rozdı´lu dvou dat
Na obra´zku 2.1 je demonstrace prvnı´ mozˇnosti, jak vypocˇ´ıtat rozdı´l dat. Nejprve vypocˇteme pocˇet dnı´ od mensˇ´ıho data do konce roku, potom pocˇet dnı´ od zacˇa´tku druhe´ho roku do druhe´ho zadane´ho data. Pote´ zjistı´me, kolik let lezˇ´ı mezi zadany´mi daty a prˇepocˇ´ıta´me je na pocˇet dnu˚. Soucˇet teˇchto trˇ´ı u´daju˚ da´ pozˇadovany´ rozdı´l. Druhou mozˇnostı´ (obra´zek 2.2) je vypocˇ´ıtat u kazˇde´ho data pocˇet dnu˚ od pocˇa´tku letopocˇtu do tohoto data a tyto dva u´daje odecˇ´ıst. Prˇi blizˇsˇ´ım prozkouma´nı´ obou mozˇnostı´ se uka´zalo, zˇe prvnı´ varianta nenı´ pro vy´pocˇet rozdı´lu prˇ´ılisˇ vhodna´, protozˇe vyzˇaduje osˇetrˇenı´ prˇ´ılisˇ mnoha vy´jimecˇny´ch stavu˚. Tı´mto vy´jimecˇny´m stavem je naprˇ´ıklad situace, kdy obeˇ data lezˇ´ı ve stejne´m roce. Dalsˇ´ım zdrojem vy´jimecˇny´ch stavu˚ jsou prˇestupne´ dny v roce, ktere´ se mohou vyskytnout uvnitrˇ nebo vneˇ pocˇ´ıtany´ch intervalu˚, cozˇ vyzˇaduje osˇetrˇenı´ hned cˇtyrˇ mozˇnostı´. Druha´ varianta vy´pocˇtu je mnohem vy´hodneˇjsˇ´ı i s ohledem na zapocˇ´ıta´va´nı´ prˇestupny´ch let, protozˇe obeˇ data lze prˇed vlastnı´m odecˇtenı´m zpracovat naprosto stejny´m zpu˚sobem2 , cozˇ vede na jediny´ podprogram. Z teˇchto du˚vodu˚ jsem implementoval tuto druhou variantu. 2
Vy´pocˇet pocˇtu dnu˚ od zacˇa´tku letopocˇtu bude stejny´ pro obeˇ data, neza´visle na tom, ktere´ je starsˇ´ı.
3
Kapitola 3 Na´vrh rˇesˇenı´ proble´mu Po analy´ze proble´mu s pocˇa´tkem letopocˇtu a pocˇa´tkem gregoria´nske´ho kalenda´rˇe jsem se rozhodl pro akceptova´nı´ vsˇech dat od pocˇa´tku letopocˇtu (tedy od 1.1.1), jako by se i na neˇ tento kalenda´rˇ vztahoval. Vy´pocˇet zahrnujı´cı´ i pocˇa´tek gregoria´nske´ho kalenda´rˇe by totizˇ vyzˇadoval zada´nı´ u´daje o zemeˇpisne´ poloze mı´sta, pro ktere´ se tento vy´pocˇet prova´dı´.
3.1
Volba rozsahu
Prˇedpokla´da´m, zˇe datovy´ typ int ma´ na dnesˇnı´ch pocˇ´ıtacˇ´ıch alesponˇ 32 bitu˚. Pokud by bylo potrˇeba aplikaci prˇene´st na platformu s mensˇ´ı de´lkou slova, bude potrˇeba zvolit veˇtsˇ´ı datove´ typy nebo zmensˇit rozsah akceptovatelny´ch dat. Maxima´lnı´ hodnota typu int bez zname´nka je 4294967296. Kdyzˇ tuto hodnotu vydeˇlı´me de´lkou astronomicke´ho roku, vyjde maxima´lnı´ pocˇet let zobrazitelny´ch pomocı´ pocˇtu dnu˚ 11759231. Nakonec jsem vybral hodnotu maxima´lnı´ho akceptovatelne´ho roku 11000000, protozˇe je pro uzˇivatele dobrˇe zapamatovatelna´ a obsahuje i dostatecˇnou rezervu hodnot proti prˇ´ıpadne´mu prˇetecˇenı´.
3.2
Vy´pocˇet rozdı´lu
Princip zvolene´ho rˇesˇenı´ je na obra´zku 2.2. V tomto obra´zku ovsˇem nenı´ vyrˇesˇen proble´m se zahrnutı´m prˇechodny´ch let. Zvolil jsem takove´ rˇesˇenı´, zˇe se nejprve pocˇ´ıta´ pocˇet dnu˚ od pocˇa´tku letopocˇtu do zadane´ho data, prˇicˇemzˇ se neberou prˇestupne´ roky v u´vahu. K tomuto u´daji se prˇicˇte pocˇet prˇestupny´ch let mezi pocˇa´tkem letopocˇtu a zadany´m datem. Vy´sledkem je pocˇet dnu˚ od pocˇa´tku letopocˇtu vcˇetneˇ prˇestupny´ch let. Prˇed vlastnı´m vy´pocˇtem rozdı´lu je potrˇeba spra´vneˇ prˇehodit hodnoty, aby vy´sledek nevysˇel za´porneˇ, protozˇe vy´pocˇet probı´ha´ v bezzname´nkovy´ch cˇ´ıslech. Pozna´mka: Protozˇe jde o pocˇ´ıta´nı´ rozdı´lu dat, pocˇ´ıta´ se pocˇet dnu˚ od pocˇa´tku fiktivnı´ho roku nula. Vy´pocˇet se tı´m zjednodusˇ´ı, protozˇe nenı´ potrˇeba neusta´le odecˇ´ıtat 365 dnı´.
3.3
Vy´pocˇet prˇechodny´ch let
Pro navrzˇeny´ algoritmus je potrˇeba vzorec pro vy´pocˇet pocˇtu prˇechodny´ch let od pocˇa´tku letopocˇtu. V tomto vzorci se uplatnı´ vsˇechna trˇi pravidla pro detekci prˇestupny´ch let. Pro vy´pocˇet pocˇtu dnı´ od roku 0 do konce zadane´ho roku jsem navrhnul tento vzorec: dni = 365 ∗ rok +
4
rok rok rok − + 4 100 400
(3.1)
Podmı´nku pro detekci, zda je rok prˇestupny´, lze vytvorˇit pomocı´ operace modulo (%): prestupny = (rok%4 == 0)&&((rok%100! = 0)||(rok%400 == 0))
3.4
(3.2)
Analy´za vstupnı´ch dat
V zada´nı´ je prˇesneˇ specifikova´n forma´t vstupnı´ch dat vcˇetneˇ oddeˇlovacˇu˚ mezi jednotlivy´mi slozˇkami jednotlivy´ch dat. V jazyce C lze tento typ forma´tovany´ch dat analyzovat pomocı´ funkce scanf, takzˇe je zbytecˇne´ vymy´sˇlet specia´lnı´ algoritmus. Po zavola´nı´ funkce scanf je potrˇeba detekovat prˇ´ıpadne´ chyby rozsahu (naprˇ. datum mensˇ´ı nezˇ 1.1.1) a detekovat nesmyslne´ datumy (naprˇ. 29.2.2003, 32.18.2000, atd.)
3.5
Specifikace testu˚
Z na´vrhu rˇesˇenı´ vyply´va´ neˇkolik rizikovy´ch oblastı´, ktere´ je potrˇeba otestovat – chybny´ rozsah vstupnı´ch hodnot, chybneˇ zadane´ datum (neodpovı´da´ prˇedepsane´ syntaxi), nesmyslne´ datum a chyby prˇi vy´pocˇtu (hlavneˇ s prˇestupny´mi roky). Test 1: Chybna´ syntaxe −→ Detekce chyby. 01.01.2000+02.01.2000 01,01,2000-02,01,2000 02 . 01 . 2000 - 1 . 1 . 2000 aleluja Test 2:
Nesmyslna´ data −→ Detekce chyby.
29.02.2001-29.2.2000 01.15.2001-31.4.2000 Test 3: Data mimo povoleny´ rozsah hodnot −→ Detekce chyby. 1.15.2001-15.2.0 1.1.1-31.12.110000001 Test 4:
Spra´vnost vy´pocˇtu −→ Prˇedpokla´dana´ spra´vna´ hodnota.
02.01.2000-1.1.2000 -> 1 1.1.2000-01.01.2000 -> 0 28.02.2000-28.2.2001 -> 366 29.2.2000-28.02.2001 -> 365 29.02.2000-1.03.2001 -> 366 1.03.2000-28.02.2001 -> 364 01.03.2001-29.02.2000 -> 366 31.12.11000000-15.10.1582 -> 4017089764 31.12.11000000-1.1.1 -> 4017667499 17.00004.1978-7.3.24063 -> 8066340
5
Kapitola 4 Popis rˇesˇenı´ Prˇi implementaci jsem vycha´zel ze za´veˇru˚ popsany´ch v prˇedchozı´ch kapitola´ch. Vlastnı´ vy´pocˇet rozdı´lu dvou dat je implementova´n podle vzorcu˚ 3.1 a 3.2.
4.1
Ovla´da´nı´ programu
Program funguje jako konzolova´ aplikace, ma´ tedy pouze textove´ ovla´da´nı´. Prˇi spousˇteˇnı´ program reaguje na jediny´ parametr -h. Pokud je s tı´mto parametrem zavola´n, neprova´dı´ zˇa´dny´ vy´pocˇet, ale vypı´sˇe obrazovku s na´poveˇdou. Po spusˇteˇnı´ program ocˇeka´va´ na standardnı´m vstupu rˇa´dek s u´daji v zadane´m forma´tu. Pokud tam tento rˇeteˇzec nenalezne, nebo pokud nenı´ dodrzˇen vstupnı´ forma´t, vypı´sˇe chybove´ hla´sˇenı´. To se vypı´sˇe i v prˇ´ıpadeˇ, zˇe zadana´ data sice syntakticky odpovı´dajı´ pozˇadavku˚m, ale prˇedstavujı´ neexistujı´cı´ datum. V prˇ´ıpadeˇ korektnı´ho vstupu se vypı´sˇe vy´sledny´ pocˇet dnu˚ na jediny´ rˇa´dek. Vy´hodou takto strohe´ho ovla´da´nı´ je, zˇe program mu˚zˇe by´t pouzˇit ve skriptech (da´vkovy´ch souborech) a jı´m produkovany´ vy´sledek mu˚zˇe by´t pouzˇit jiny´m programem pro dalsˇ´ı vy´pocˇet.
4.2
Volba datovy´ch typu˚
Pro ulozˇenı´ hodnot vy´sledku jsem zvolil datovy´ typ unsigned int (viz 3.1). Pro ulozˇenı´ jednotlivy´ch dat slouzˇ´ı struktura TDate, ktera´ obsahuje trˇi polozˇky typu unsigned int pro den, meˇsı´c a rok. Datum je ve sve´ podstateˇ heterogennı´ u´tvar, takzˇe by nebylo vhodne´ ukla´dat jej naprˇ´ıklad do pole. Struktura navı´c poskytuje prostor pro prˇ´ıpadne´ budoucı´ rozsˇ´ırˇenı´ naprˇ´ıklad o cˇasovy´ u´daj.
4.3
Vlastnı´ implementace
Parametry prˇ´ıkazove´ rˇa´dky zpracova´va´ funkce doParams, ktera´ je spousˇteˇna jako prvnı´ ve funkci main. Pote´ se ze standardnı´ho vstupu prˇecˇte textovy´ rˇeteˇzec se zadany´mi daty a prˇeda´ se funkci readDates. Ta pomocı´ vola´nı´ scanf analyzuje vstupnı´ rˇeteˇzec a detekuje v neˇm prˇ´ıpadne´ chyby. V prˇ´ıpadeˇ, zˇe je vstup v porˇa´dku, naplnı´ dveˇ struktury TDate, ktere´ vra´tı´ pomocı´ parametru˚ prˇeda´vany´ch odkazem. Pro otestova´nı´ spra´vnosti zadany´ch dat se vola´ funkce isDateOk, ktera´ vracı´ logickou hodnotu. Pro vlastnı´ vy´pocˇet rozdı´lu slouzˇ´ı funkce getDiff. Tato funkce dvakra´t zavola´ funkci getDays a provede odecˇtenı´. Funkce getDays pomocı´ funkcı´ getDaysToYear, isLeapYear vypocˇte podle vy´sˇe popisovane´ho vzorce pocˇet dnı´ od roku nula. Pro vy´pocˇet pocˇtu dnı´ od pocˇa´tku roku do zadane´ho data slouzˇ´ı tabulka (pole) daysToMonth, ktera´ obsahuje dvana´ct hodnot, jezˇ prˇedstavujı´ pocˇet dnı´ od zacˇa´tku roku do zacˇa´tku˚ vsˇech dvana´cti meˇsı´cu˚.
6
Kapitola 5 Za´veˇr Program pocˇ´ıta´ s daty od zacˇa´tku letopocˇtu podle gregoria´nske´ho kalenda´rˇe. Kvu˚li vy´sˇe zmı´neˇny´m proble´mu˚m identifikacı´ jeho pocˇa´tecˇnı´ho data, nebylo do rˇesˇenı´ zahrnuto omezenı´ na data mladsˇ´ı nezˇ rok 1582 (1583, 1700, ...) – ostatneˇ zada´nı´ nic takove´ho nepozˇaduje. Tyto proble´my by mohly by´t rˇesˇeny v dalsˇ´ıch verzı´ch programu jako volitelna´ rozsˇ´ırˇenı´. Pravdeˇpodobneˇ by bylo nutne´ pomocı´ parametru zadat mı´sto, pro ktere´ se vy´pocˇet uskutecˇnı´. I tak by to ale meˇlo smysl pouze pro oblasti, kde gregoria´nsky´ kalenda´rˇ nahradil kalenda´rˇ julia´nsky´. V jiny´ch oblastech se pouzˇ´ıvaly, cˇi pouzˇ´ıvajı´ kalenda´rˇe, v nichzˇ implementovany´ forma´t za´pisu data nema´ smysl. Program byl otestova´n se vsˇemi navrzˇeny´mi testovacı´mi hodnotami a odladeˇn tak, aby vsˇechny testy probeˇhly spra´vneˇ podle prˇedpokladu˚. Program prˇesneˇ dodrzˇuje pozˇadavky kladene´ na forma´t vstupnı´ch a vy´stupnı´ch dat, takzˇe mu˚zˇe by´t bezproble´moveˇ pouzˇ´ıva´n spolu s dalsˇ´ımi programy ve skriptech nebo jiny´ch programech. Navrzˇene´ rˇesˇenı´ je bez proble´mu˚ prˇenositelne´ na vsˇechny platformy, ktere´ pouzˇ´ıvajı´ alesponˇ 32 bitove´ registry. Pro prˇenos na platformu s mensˇ´ı velikostı´ registru by bylo nutne´ bud’to zmensˇit rozsah akceptovatelny´ch dat nebo upravit datove´ typy, ktere´ se pouzˇ´ıvajı´ prˇi vy´pocˇtu. Program byl u´speˇsˇneˇ otestova´n v prostrˇedı´ operacˇnı´ch syste´mu˚ Linux a MS Windows.
7
Literatura [1] BLACKBURN, B. J.; HOLFORD-STREVENS, L.: The Oxford Companion to the Year. Oxford: Oxford University Press, 1999, ISBN 0-19-214231-3.
8
Prˇ´ıloha A Metriky ko´du Pocˇet souboru˚: 1 soubor Pocˇet rˇa´dku˚ zdrojove´ho textu: 238 rˇa´dku˚ Velikost staticky´ch dat: 3328B Velikost spustitelne´ho souboru: 9434B (syste´m Linux, 32 bitova´ architektura, prˇi prˇekladu bez ladicı´ch informacı´)
9