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 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 |
|---|---|
< |
< |
> |
> |
& |
& |
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.
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.
<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 | +-----------------------+ |
<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ě.
Řá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.
<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). | +------------------------------------------------------------------------------+ |
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 |