Soutěž dětí a mládeže v programování
13.ročník 1998/99
oblastní kola

Kategorie vyšší programovací jazyky
mládež

Pátky třináctého

Koeficient: 1

Vaším úkolem je vytvořit program, který vypíše na obrazovku všechny pátky třináctého od 1. 1. 1990 do 31. 12. 2020 -- poradíme vám, že 1. 1. 1990 bylo pondělí. V programu nesmíte používat systémové funkce pro práci s datem.

Hodnocení
Vypisuje s (několika) chybami 2 body
Vypíše vše v pořádku (52 pátků) 3 body
Výstup programu je přehledný a v pořádku 1 bod
Efektivita -- cyklus přes všechny měsíce (ne přes dny) 1,5 bodu
Efektivita -- den v týdnu pro pátek 13 zjišťuje podle minulého měsíce (nepočítá vše znovu od začátku pro každý měsíc) 1,5 bodu
Dokumentace 1 bod

Počítání slov

Koeficient: 3

Napište program, který slouží k počítání slov v zadaném textovém souboru. Slovo je to, co se skládá z písmen anglické abecedy, číslic a podtržítka. Všechny ostatní znaky (i nová řádka) jsou chápány jako oddělovače. Mezi slovy může být libovolný počet oddělovačů. Uživatel si může vybrat mezi jedním z následujících způsobů výstupu:

  1. Program spočítá počet slov v souboru, počet znaků v souboru a počet řádek (i prázdný řádek je řádek). Na konci přehledně vypište všechny tři získané hodnoty.
  2. Program spočítá pro každé slovo četnost jeho výskytu v souboru a na konci vypíše abecedně setříděný seznam slov a počtu jejich výskytů.
  3. Program uživateli umožní vybrat, zda se má seznam slov při výpisu b) řadit podle abecedy nebo podle počtu výskytů jednotlivých slov.
Hodnocení
Ošetření zadání jména souboru a čtení ze souboru 1 bod
Správně počítá počty znaků, slov a řádek 2 body
Výpis slov podle abecedy 2 body
Výpis slov podle četnosti 1 bod
Efektivita -- bufferované čtení pomocí BlockRead 1 bod
Efektivita -- slova jsou uložena v dynamické struktuře (strom, seznam) 1 bod
Efektivita -- při řazení podle četnosti není celý seznam slov kopírován, jsou pouze přeuspořádány ukazatele 1 bod
Dokumentace 1 bod

Interpret grafického jazyka

Koeficient: 2

Napište program, který bude provádět jednoduché grafické příkazy. Na vstupu bude textový soubor, který obsahuje seznam příkazů a jejich parametrů. Na každém řádku bude pouze jeden příkaz. Souřadnicový systém grafického jazyka je následující: rozsah obou os od 0 do 1, napřed se zadává souřadnice x (vzdálenost od levého okraje), pak souřadnice y (vzdálenost od dolního okraje). Využijte celou plochu obrazovky, pouze v dolní části si nechte místo na jeden řádek textu -- stavovou řádku.

Možné příkazy jsou:

LINE X1 Y1 X2 Y2
vykreslí čáru z bodu [X1,Y1] do [X2,Y2]
POINT X Y
vykreslí bod na souřadnicích [X,Y]
BOX X1 Y1 X2 Y2
vykreslí prázdný rámeček z bodu [X1,Y1] do [X2,Y2]
FILLBOX X1 Y1 X2 Y2
vykreslí vyplněný rámeček z bodu [X1,Y1] do [X2,Y2]
COLOR C
nastaví barvu kreslení; čísla barev jsou shodná s barvami používanými v grafické knihovně BGI v Pascalu či C/C++
PAUSE
počká na stisk klávesy; o tom, že čeká informuje uživatele výpisem ve stavové řádce
CLEAR
smaže obrazovku (celou ji překreslí černě)

Příkazy je možné psát malými i velkými písmeny. Příkazy a parametry jsou od sebe odděleny libovolným počtem mezer. Vše se kreslí (i vyplňuje) právě nastavenou barvou (určenou příkazem COLOR). Po startu programu je nastavena bílá barva. V případě chyby vypište do stavové řádky informace o chybě (číslo řádky a chybný příkaz), počkejte na stisk klávesy a ukončete běh programu. V grafickém programu se mohou vyskytovat prázdné řádky a komentářové řádky (začínají znakem '%' nebo ';'), které se ignorují. Umožněte zadání názvu vstupního souboru jako parametru příkazové řádky.

Ukázkový program:

% Toto je ukázkový program

% úhlopříčka
LINE 0 0 1 1

% nakreslíme zelené obdélníky
COLOR 2
FILLBOX 0 1 0.5 0.5
FILLBOX 0.5 0.5 1 0
PAUSE

% obdélníky orámujeme žlutě
COLOR 14
BOX   0   1 0.5 0.5
BOX 0.5 0.5   1   0
PAUSE

Tento program nakreslí bíle úhlopříčku, pak vykreslí dva zelené obdélníky přes čtvrtinu plochy obrazovky (vlevo nahoře a vpravo dole), počká na stisk klávesy, obdélníky orámuje žlutě, počká znovu na stisk klávesy a skončí.

Hodnocení
Načítá vstupní soubor, umí převzít název z příkazové řádky 1 bod
Program rozpoznává bezchybně všechny příkazy, ignoruje velikost písmen 1 bod
Program dokáže vykreslit obrázek dodaný se zadáním 1 bod
Program vykresluje bezchybně 2 body
Program detekuje chybu ve vstupním souboru, reaguje jinak než havárií 1 bod
Efektivita -- vstupní soubor se čte pouze jednou 1,5 bodu
Efektivita -- přizpůsobivost rozlišení obrazovky (nepředpokládá 640x480) 1,5 bodu
Dokumentace 1 bod

Násobení velkých čísel

Koeficient: 1,5

Napište program, který přesně vynásobí maximálně stociferná čísla.

Hodnocení
Správné načtení čísel (nejlepe jako řetězce) 1 bod
Rozdělení čísla na vhodné části (číslice, dvojice číslic, atd.) 2 body
Správné vynásobení jednotlivých částí 2 body
Výpis výsledku 1 bod
Efektivita 3 body
Dokumentace 1 bod

Kategorie vyšší programovací jazyky
starší žáci

Pátky třináctého

Koeficient: 1,5

Vaším úkolem je vytvořit program, který vypíše na obrazovku všechny pátky třináctého od 1. 1. 1990 do 31. 12. 2020 -- poradíme vám, že 1. 1. 1990 bylo pondělí. V programu nesmíte používat systémové funkce pro práci s datem.

Hodnocení
Vypisuje s (několika) chybami 2 body
Vypíše vše v pořádku (52 pátků) 3 body
Výstup programu je přehledný a v pořádku 1 bod
Efektivita -- cyklus přes všechny měsíce (ne přes dny) 1,5 bodu
Efektivita -- den v týdnu pro pátek 13 zjišťuje podle minulého měsíce (nepočítá vše znovu od začátku pro každý měsíc) 1,5 bodu
Dokumentace 1 bod

Počítání slov

Koeficient: 2

Napište program, který slouží k počítání slov v zadaném textovém souboru. Slovo je to, co se skládá z písmen anglické abecedy, číslic a podtržítka. Všechny ostatní znaky (i nová řádka) jsou chápány jako oddělovače. Mezi slovy může být libovolný počet oddělovačů. Program spočítá počet slov v souboru, počet znaků v souboru a počet řádek (i prázdný řádek je řádek). Na konci přehledně vypište všechny tři získané hodnoty.

Hodnocení
Ošetření zadání jména souboru 1 bod
Čtení ze souboru 2 body
Správně počítá znaky, slova a konce řádek 3 body
Efektivita -- bufferované čtení pomocí BlockRead 3 body
Dokumentace 1 bod

Interpret grafického jazyka

Koeficient: 3

Napište program, který bude provádět jednoduché grafické příkazy. Na vstupu bude textový soubor, který obsahuje seznam příkazů a jejich parametrů. Na každém řádku bude pouze jeden příkaz. Souřadnicový systém grafického jazyka je následující: rozsah obou os od 0 do 1, napřed se zadává souřadnice x (vzdálenost od levého okraje), pak souřadnice y (vzdálenost od dolního okraje). Využijte celou plochu obrazovky, pouze v dolní části si nechte místo na jeden řádek textu -- stavovou řádku.

Možné příkazy jsou:

LINE X1 Y1 X2 Y2
vykreslí čáru z bodu [X1,Y1] do [X2,Y2]
POINT X Y
vykreslí bod na souřadnicích [X,Y]
BOX X1 Y1 X2 Y2
vykreslí prázdný rámeček z bodu [X1,Y1] do [X2,Y2]
FILLBOX X1 Y1 X2 Y2
vykreslí vyplněný rámeček z bodu [X1,Y1] do [X2,Y2]
COLOR C
nastaví barvu kreslení; čísla barev jsou shodná s barvami používanými v grafické knihovně BGI v Pascalu či C/C++
PAUSE
počká na stisk klávesy; o tom, že čeká informuje uživatele výpisem ve stavové řádce
CLEAR
smaže obrazovku (celou ji překreslí černě)

Příkazy je možné psát malými i velkými písmeny. Příkazy a parametry jsou od sebe odděleny libovolným počtem mezer. Vše se kreslí (i vyplňuje) právě nastavenou barvou (určenou příkazem COLOR). Po startu programu je nastavena bílá barva. V případě chyby vypište do stavové řádky informace o chybě (číslo řádky a chybný příkaz), počkejte na stisk klávesy a ukončete běh programu. V grafickém programu se mohou vyskytovat prázdné řádky a komentářové řádky (začínají znakem '%' nebo ';'), které se ignorují. Umožněte zadání názvu vstupního souboru jako parametr příkazové řádky.

Ukázkový program:

% Toto je ukázkový program

% úhlopříčka
LINE 0 0 1 1

% nakreslíme zelené obdélníky
COLOR 2
FILLBOX 0 1 0.5 0.5
FILLBOX 0.5 0.5 1 0
PAUSE

% obdélníky orámujeme žlutě
COLOR 14
BOX   0   1 0.5 0.5
BOX 0.5 0.5   1   0
PAUSE

Tento program nakreslí bíle úhlopříčku, pak vykreslí dva zelené obdélníky přes čtvrtinu plochy obrazovky (vlevo nahoře a vpravo dole), počká na stisk klávesy, obdélníky orámuje žlutě, počká znovu na stisk klávesy a skončí.

Hodnocení
Načítá vstupní soubor, umí převzít název z příkazové řádky 1 bod
Program rozpoznává bezchybně všechny příkazy, ignoruje velikost písmen 1 bod
Program dokáže vykreslit obrázek dodaný se zadáním 1 bod
Program vykresluje bezchybně 2 body
Program detekuje chybu ve vstupním souboru, reaguje jinak než havárií 1 bod
Efektivita -- vstupní soubor se čte pouze jednou 1,5 bodu
Efektivita -- přizpůsobivost rozlišení obrazovky (nepředpokládá 640x480) 1,5 bodu
Dokumentace 1 bod

Odpočítávání

Koeficient: 1

Napište program, který průběžně zobrazuje kolik dní, hodin, minut a sekund zbývá do začátku roku 2000.

Hodnocení
Zobrazení správného časového údaje 4 body
Kvalita grafického zobrazení 2 body
Efektivita -- časový údaj se přepisuje jen jednou za sekundu 3 body
Dokumentace 1 bod

Kategorie vizuální nástroje

Dáma

Vytvořte program pro hraní stolní deskové hry Dáma, která se hraje podle následujících pravidel.

Hraje se na klasické šachovnici (8 x 8 polí). Kameny se pohybují pouze po černých polích a pouze ve směru od hráče (to neplatí pro dámu). Má-li hráč možnost vzít soupeři kámen, musí tak učinit (platí i pro vícenásobné braní) a to i dámou. Vyhrává hráč, který soupeři vzal všechny hrací kameny.

Vaším úkolem je zobrazit hrací pole (šachovnici) a hrací kameny. Program umožní hrát dámu dvěma hráčům. Výběr kamene a tah může hráč provést myší nebo klávesnicí. Program umožní odebrání kamenů po skoku a vytvoření dámy při dosažení protějšího konce šachovnice hracím kamenem.

Doplňte program tak, aby bylo možné zapnout kontrolu správnosti tahu kamenem.

Po splnění předchozího úkolu doplňte program tak, aby uměl simulovat jednoho hráče.

Hodnocení
Zobrazení hracího pole 1 bod
Zobrazení hracích kamenů 1 bod
Umožnění tahu kamenem (označení kamene a cílové pozice) 1 bod
Kontrola správnosti tahu (nápověda hráči o možném tahu) 1 bod
Vytvoření dámy 1 bod
Možnost hry druhého hráče počítačem 1 bod
Efektivita 3 body
Dokumentace 1 bod

Za každou úlohu je možno přidělit maximálně 10 bodů, které se poté násobí koeficientem úlohy. 6 bodů je vyhrazeno pro ohodnocení funkčnosti programu, 3 body přísluší pro efektivitu a jeden pro dokumentaci. V dokumentaci se 1/4 bodu hodnotí přehledná úprava zdrojového textu, 1/4 bodu vhodné názvy identifikátorů a 1/2 bodu přísluší pro dobře okomentovaný program.