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>