Zadání soutěžní úlohy

Finále ICP'96 - INVEX Brno 1996

Formátovač tabulek

Napište program, který bude sloužit k formátování tabulek. Program bude mít jméno xxtab (kde xx je vaše startovní číslo) a bude mít následující parametry:

        xxtab [-n] popis_tabulky zformátovaná_tabulka
 
-n
je nepovinný parametr, který určuje délku řádky pro formátování. Délka řádky n je přirozené číslo. Pokud není uvedena, předpokládá se její standardní velikost 80.
popis_tabulky
je jméno textového souboru, který obsahuje popis tabulky. Formát popisu tabulky je popsán dále.
zformátovaná_tabulka
je jméno textového souboru, kam se zapíše již zformátovaná tabulka.

Popis formátu tabulek

Každý textový soubor obsahuje definici pouze jedné tabulky. Tabulka se skládá z jednotlivých buněk, které jsou zapisovány po jednotlivých řádcích. Každá taková řádka je uvozena značkou <TR>.

Každá řádka může obsahovat definice jednotlivých buněk. Ty jsou uvozeny značkami <TH> nebo <TD>. První z nich (<TH>) navíc zajistí, že obsah buňky tabulky bude horizontálně i vertikálně vycentrován.

Při formátování tabulek budou k nakreslení rámečků používány znaky '+', '|' a '-'. Mezi vertikálními linkami rámečku a textem buňky musí být alespoň jedna mezera.

Libovolný počet po sobě následujících mezer, tabulátorů a konců řádků ve vstupním souboru se interpretuje jako jedna mezera. Mezery obklopující značky se ignorují.

K zápisu znaků '<', '>' a '&' se musí použít speciální způsob zápisu:

Znak Zápis
< &lt;
> &gt;
& &amp;

Pro větší názornost si předvedeme malou ukázku:

Popis tabulky Zformátovaná tabulka
<TR><TH>Year<TH>Income per   head
<TR><TD>1987<TD>3
<TR><TD>1988<TD>3.5
<TR><TD>1989<TD>3.2
+------------------------+
| Year | Income per head |
|------+-----------------|
| 1987 | 3               |
|------+-----------------|
| 1988 | 3.5             |
|------+-----------------|
| 1989 | 3.2             |
+------------------------+

Poznámka: Všimněte si, že několik mezer mezi slovy "per" a "head" bylo nahrazeno jednou mezerou.


Úkoly

Následující úkoly plňte v pořadí, v jakém jsou uvedeny. Při nevyřešení nižší úlohy nebude ta s vyšším číslem hodnocena.

  1. Napište program tak, že bude zvládat formátování podle výše uvedených pravidel. Text buňky se bude zarovnávat pouze do jedné řádky (tj. bez zalamování delšího textu do více řádek). V případě, že se tabulka do vymezeného prostoru nevejde, na obrazovku se vypíše hlášení 'Error: Table is too long to fit line.'.
  2. Doplňte program tak, aby u značek <TD> a <TH> šlo použít volitelný atribut ALIGN, který určuje způsob zarovnání obsahu buňky. Může mu být přiřazena jedna z následujících hodnot:
    left zarovnání vlevo
    right zarovnání vpravo
    center zarovnání na střed

    Ukázka:

    Popis tabulky Zformátovaná tabulka
    
    <TR><TH>foo<TH ALIGN=RIGHT>bar
    <TR><TD ALIGN=CENTER>fooa<TD ALIGN=LEFT>bara
    <TR><TD>foob<TD>barb
    <TR><TD>abrakadabra<TD ALIGN=LEFT>zig-zag
      
    
    +-----------------------+
    |     foo     |     bar |
    |-------------+---------|
    |     fooa    | bara    |
    |-------------+---------|
    | foob        | barb    |
    |-------------+---------|
    | abrakadabra | zig-zag |
    +-----------------------+
      
  3. Doplňte program tak, aby u značek <TD> a <TH> šlo použít další volitelné atributy COLSPAN a ROWSPAN. Těmto atributům může být přiřazeno přirozené číslo, které určuje kolik buněk v horizontálním nebo vertikálním směru bude sloučeno do jediné buňky.

    Ukázka:

    Popis tabulky Zformátovaná tabulka
    
    <TR><TH ROWSPAN=2>Year<TH COLSPAN=2>Sales
    <TR>                  <TH>Product A<TH>Product B
    <TR><TD>1994          <TD>4 600    <TD>2 100
    <TR><TD>1995          <TD>4 900    <TD>1 900
    <TR><TD>1996          <TD>5 750    <TD>3 160
        
    
    +------------------------------+
    |      |         Sales         |
    | Year |-----------------------|
    |      | Product A | Product B |
    |------+-----------+-----------|
    | 1994 | 4 600     | 2 100     |
    |------+-----------+-----------|
    | 1995 | 4 900     | 1 900     |
    |------+-----------+-----------|
    | 1996 | 5 750     | 3 160     |
    +------------------------------+
      

    Poznámka: Nezapomeňte, že značka <TH> slouží k zápisu buňky, která se centruje i vertikálně.

  4. Doplňte program tak, aby v případě širokých tabulek zalomil obsah buňky tabulky do několika řádků tak, aby se tabulka na vymezený prostor vešla. Šířku jednotlivých sloupců tabulky program zvolí automaticky tak, aby bylo množství textu k ploše buňky co nejrovnoměrnější.

    Řádka se může zalomit v místě mezery mezi slovy. Pokud taková vhodná mezera neexistuje je možno rozdělení provést v místě znaku '-'. Pokud se nepovede text buněk rozdělit do řádků tak, aby se tabulka vešla na stanovenou šířku řádky, vypíše se chybové hlášení.

    Ukázka:

    Popis tabulky
    <TR><TH>Name<TH>Symbol<TH>Definition
    <TR><TD>meter<TD>m    <TD>The meter is the unit of lenght;
                              it is equal to distance which light
                              overcome in 1/299 792 458 seconds in
                              vacuum.
    <TR><TD>kilogram<TD>kg<TD>The kilogram is the unit of mass;
                              it is equal to the mass of the
                              international prototype of kilogram (a
                              cylinder of platinum-iridium).
    
    Zformátovaná tabulka
              1         2         3         4         5         6         7
    01234567890123456789012345678901234567890123456789012345678901234567890123456789
    
    +------------------------------------------------------------------------------+
    |   Name   | Symbol |                       Definition                         |
    +----------+--------+----------------------------------------------------------+
    | meter    | m      | The meter is the unit of lenght; it is equal to          |
    |          |        | distance which light overcome in 1/299 792 458 seconds   |
    |          |        | in vacuum.                                               |
    +----------+--------+----------------------------------------------------------+
    | kilogram | kg     | The kilogram is the unit of mass; it is equal to the     |
    |          |        | mass of the international prototype of kilogram (a       |
    |          |        | cylinder of platinum-iridium).                           |
    +------------------------------------------------------------------------------+
      

    Poznámka: Pravítko nad tabulkou je vytištěno pouze pro vaši orientaci a pro zdůraznění, že tabulka nezabírá více než pro ni vymezený prostor (tj. 80 znaků). Pravítko není součástí zformátované tabulky.

  5. Doplňte program tak, aby u značek <TD> a <TH> šlo použít volitelný atribut VALIGN, který určuje způsob vertikálního zarovnání obsahu buňky. Může mu být přiřazena jedna z následujících hodnot:
    top zarovnání nahoru
    bottom zarovnání dolů
    middle zarovnání na střed

    Ukázka:

    Popis tabulky
    <TR><TH>Name<TH>Symbol<TH>Definition
    <TR><TD VALIGN=BOTTOM>meter<TD VALIGN=MIDDLE ALIGN=RIGHT>m
             <TD ALIGN=CENTER>The meter is the unit of lenght;
                              it is equal to distance which light
                              overcome in 1/299 792 458 seconds in
                              vacuum.
    <TR><TD VALIGN=MIDDLE>kilogram<TD>kg
              <TD ALIGN=RIGHT>The kilogram is the unit of mass;
                              it is equal to the mass of the
                              international prototype of kilogram (a
                              cylinder of platinum-iridium).
    
    Zformátovaná tabulka
              1         2         3         4         5         6         7
    01234567890123456789012345678901234567890123456789012345678901234567890123456789
    
    +------------------------------------------------------------------------------+
    |   Name   | Symbol |                       Definition                         |
    +----------+--------+----------------------------------------------------------+
    |          |        |     The meter is the unit of lenght; it is equal to      |
    |          |      m |  distance which light overcome in 1/299 792 458 seconds  |
    | meter    |        |                       in vacuum.                         |
    +----------+--------+----------------------------------------------------------+
    |          | kg     |     The kilogram is the unit of mass; it is equal to the |
    | kilogram |        |       mass of the international prototype of kilogram (a |
    |          |        |                           cylinder of platinum-iridium). |
    +------------------------------------------------------------------------------+
      

Další poznámky

U značek a jejich atributů nezáleží na velikosti písmen.

Váš program a všechny jeho moduly ukládejte do adresáře C:\ICP. Moduly, která váš program používá, pojmenujte tak, aby začínaly vaším startovním číslem.

Na začátek programu uveďte v komentáři vaše startovní číslo, seznam všech modulů, které program používá a napište, které úkoly váš program splňuje.

V adresáři C:\ICP neleznete několik souborů s příponou tbl. Tyto soubory obsahují popisy několika tabulek a můžete na nich zkoušet váš formátovač.

Jako pomůcka je povolen anglický slovník a příručky popisující programovací jazyk, jeho prostředí (IDE) a standardní knihovny. Nejsou povoleny knihy, které obsahují popisy různých metod, algoritmů a datových struktur.

Za úlohu můžete získat maximálně 100 bodů. 60 z nich je určeno na ohodnocení funkčnosti jednotlivých úloh (viz tabulka), 30 na hodnocení efektivity (elegantní a rychlé algoritmy a šikovné datové struktury). Posledních deset bodů můžete získat za dokumentaci (popis algoritmu, komentáře, vhodné pojmenovávání proměnných, přehledný zápis programu).

Úloha Maximální počet bodů za funkčnost
1 20
2 5
3 10
4 15
5 10

Propozice finále - Způsob hodnocení - Výsledková listina