Zadání finálové úlohy

Program pro práci s rodokmenem

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:

  1. 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í).

  2. 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ů.

  3. Zobrazení stromu načteného rodokmenu.

  4. 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želkavnoučatazeť/snacha
      dětibratranci/sestřenicešvagr/švagrová
      rodičeprateta/prastrýcteta/strýc
      prarodičetchýně/tchánspoleč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).

  5. Program umožní uložení aktuálního rodokmenu do souboru ve formátu popsaném dále.

  6. 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ů.

Formát rodokmenu

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>