Soutěž dětí a mládeže v programování – 16. ročník finále 2001/2002
Napište program pro práci s rodokmeny. Postupně implementujte následující funkce:
Program umožní interaktivně pomocí grafického rozhraní upravovat a doplňovat rodokmen (tj. přidávat/rušit osoby a definovat mezi nimi vztahy manželství a rodičovství).
Načtení rodokmenu ze souboru. Formát souboru je popsán dále. Pro zjednodušení předpokládáme, že lidé, kteří spolu mají dítě, jsou manželé. Z toho také vyplývá, že jeden muž může mít postupně více manželek a jedna žena více manželů.
Zobrazení stromu načteného rodokmenu.
Program umožní v načteném rodokmenu provádění následujících operací:
procházení seznamu všech osob
procházení rodokmenu na základě následujících příbuzenských vztahů:
manžel/manželka | vnoučata | zeť/snacha |
děti | bratranci/sestřenice | švagr/švagrová |
rodiče | prateta/prastrýc | teta/strýc |
prarodiče | tchýně/tchán | společný předek |
výběr vhodného partnera. Vhodný je ten partner, který má jiné pohlaví, jehož věk se liší maximálně o interaktivně zadaný počet let a není v přímém příbuzenském vztahu (tj. rodič, prarodič, potomek, prapotomek a sourozenec).
Program umožní uložení aktuálního rodokmenu do souboru ve formátu popsaném dále.
Program umožní slučování vstupních souborů s rodokmeny.
Za úlohu můžete dostat maximálně 100 bodů, z nichž 60 bodů je vyhrazeno na ohodnocení funkčnosti programu a jeho shody se zadáním, 30 body na efektivitu a jeden bod na dokumentaci a přehlednost zdrojového kódu.
Na řešení úloh máte 4,5 hodiny čistého času. Jednotlivé části úlohy můžete řešit v libovolném pořadí. Na počítači máte k dispozici několik testovacích souborů.
Pro uložení rodokmenu se používá formát XML. Rodokmen je uložen jako textový soubor, který se skládá z elementů. Element je ohraničen počátečním a koncovým tagem. Např.:
<název>...</název>
Element může obsahovat další vnořené elementy nebo text. Pokud má element prázdný obsah, zapisuje se ve speciálním tvaru:
<název/>
Celý rodokmen je uzavřen v elementu rodokmen. Uvnitř něj jsou pak uloženy informace o jednotlivých osobách v elementu osoba. Každá osoba obsahuje následující elementy:
id – identifikátor osoby (textový řetězec o maximální délce 10 znaků);
jmeno – jméno (textový řetězec o maximální délce 32 znaků);
prijmeni – příjmení (textový řetězec o maximální délce 32 znaků);
pohlavi – pohlaví (M – muž, Z – žena);
narozeni – rok narození;
umrti – rok úmrtí;
matka – identifikátor matky;
otec – identifikátor otce.
Všechny údaje o osobě kromě jejího identifikátoru jsou nepovinné.
<rodokmen> <osoba> <id>I1</id> <jmeno>Homer</jmeno> <prijmeni>Simson</prijmeni> <pohlavi>M</pohlavi> <narozeni>1946</narozeni> <umrti/> <matka/> <otec>I6</otec> </osoba> <osoba> <id>I2</id> <jmeno>Margarette</jmeno> <prijmeni>Simson</prijmeni> <pohlavi>Z</pohlavi> <narozeni>1950</narozeni> <umrti/> <matka/> <otec/> </osoba> <osoba> <id>I3</id> <jmeno>Bart</jmeno> <prijmeni>Simson</prijmeni> <pohlavi>M</pohlavi> <narozeni>1971</narozeni> <umrti/> <matka>I2</matka> <otec>I1</otec> </osoba> ... </rodokmen>