Vaša konzolová aplikácia napísaná v jazyku C bude fungovať v týchto krokoch:
stdout
).0
z funkcie main
).
Obrázky, s ktorými budeme pracovať pochádzajú z databázy MNIST. Neurónová sieť, ktorú budeme používať bola natrénovaná na tejto databáze a má úspešnosť rozpoznávania približne 90 %. MNIST je rozsiahla zbierka obrázkov rukou písaných číslic. Obsahuje číslice 0-9. Jedná sa o rozsiahlu databázu: 60 000 trénovacích obrázkov a 10 000 testovacích obrázkov.
Rozmer každého obrázku je 28 x 28 pixelov. Každý obrázok je reprezentovaný odtieňmi šedej farby (tzv. grayscale), t.j. pixely sú v rozsahu $\langle0,255\rangle$.
Obrázok budeme v zadaní reprezentovať pomocou 1D poľa (prepísané pixely po riadkoch zľava doprava). Na načítanie a vypísanie obrázku sú k dispozícii dodané funkcie load_image
a print_image
. Jednotlivé hodnoty pixelov treba reprezentovat pomocou dátového typu double
.
Obrázky sú uložené v TXT súboroch. Každý obrázok má pixely usporiadané do 28 riadkov. V každom riadku je 28 hodnôt. Hodnoty sú od seba oddelené medzerami. Jeden obrázok má 784 pixelov. Hodnoty pixelov obrázku sú normalizované z pôvodného rozsahu $\langle0,255\rangle$ do rozsahu
$\langle0,1\rangle$ (je to vhodnejšia
reprezentácia pre neurónovú sieť). Obrázok vieme jednoducho načítať do poľa pomocou presmerovania štandardného vstupu (stdin
). Vyhneme sa tak ručnému kopírovaniu/prilepovaniu veľkého množstva údajov do terminálu (je to nepraktické a náchylné na chyby).
Na rozpoznávanie obrázkov budeme používať 2-vrstvovú neurónovú sieť. Vstupom do siete bude obrázok (načítané 1D pole pixelov) a výstupom bude určenie triedy (resp. menovka), do ktorej obrázok patrí, t.j. číslo 0 až 9. Všetky neuróny budú využívať aktivačnú funkciu Swish. Táto funkcia popísaná aj v zadaní č. 1.
Naša neurónová sieť bude obsahovať 2 vrstvy:
Kompletná architektúra siete, s ktorou budeme v zadaní pracovať je znázornená na obrázku 6. Vstupný obrázok s rozmermi 28x28 je reprezentovaný 1D poľom, ktoré má 784 hodnôt pixelov (červené štvorce na obrázku). Sieť obsahuje 10 neurónov (modré kruhy na obrázku) v data processing vrstve. Každý neurón je zodpovedný za klasifikáciu príslušného typu číslice. Do každého neurónu vstupujú všetky pixely obrázku, t.j. vytvoríme tak plne prepojenú sieť. Každý neurón si na základe svojich vstupov vypočíta výstupnú hodnotu, tzv. aktiváciu. Následne sú aktivácie všetkých 10 neurónov v data processing vrstve poslané na vstup do funkcie Softmax, ktorá sa nachádza v klasifikačnej vrstve. Tá vypočíta pole pravdepodobností klasifikácie pre jednotlivé triedy číslic. Funkcia Findmax následne nájde číslicu, ktorá má najvyššiu pravdepodobnosť klasifikácie.
Neurón je základným stavebným prvkom neurónovej siete. Jeho úlohou je spracovať vstupné signály a výsledok spracovania poslať do svojej aktivačnej funkcie. Výstup z aktivačnej funkcie je konečným výstupom neurónu. Do každého neurónu vstupuje v našom prípade spolu 785 hodnôt = 784 hodnôt pixelov obrázku + 1 bias hodnota. Bias hodnota je špeciálna konštanta každého neurónu (každý neurón má práve 1 bias hodnotu), ktorá pomáha sieti lepšie predpovedať výsledky.
Každý pixel obrázku vstupujúci do neurónu v data processing vrstve je vynásobený svojou váhou. Každý neurón má svoje vlastné váhy. Vedomosti našej natrénovanej neurónovej siete sú uložené práve vo váhach a bias hodnotách. Keď poznáme hodnoty všetkých pixelov obrázku, všetky váhy neurónu a jeho bias hodnotu, vypočítame tzv. vážený súčet. Vážený súčet je vizualizovaný na obrázku 7.
Výsledok váženého súčtu pošleme na vstup aktivačnej funkcie Swish. Swish funkcia je definovaná predpisom:
$ f(x) = \dfrac{x}{1+e^{-bx}}$. V tomto zadaní bude platiť $b=0.5$
Na obrázku 8 vidíme kompletnú schému činnosti neurónu.
Váhy a bias hodnoty sú uložené v 1D poliach v dodanom zdrojovom súbore data.c
.
Váhy sú uložené v poli s názvom weights
a bias hodnoty sú v poli s názvom
bias
.
Počet váh je 784 x 10 = 7840 (pre každý neurón 784 váh). Počet bias hodnôt je 10 (pre každý neurón jedna).
Na obrázku 9 vidíme spôsob, akým treba sprístupňovať váhy zvoleného neurónu. V poli weights
majú jednotlivé neuróny svoje váhy uložené za sebou. Prvých 784 hodnôt poľa tak predstavuje váhy neurónu s
indexom 0, ďalších 784 hodnôt predstavuje váhy neurónu s indexom 1 a pod.
weights
(veľký obrázok).Funkcia Softmax slúži na výpočet pravdepodobnosti klasifikácie pre každý typ číslice. Máme 10 neurónov v data processing vrstve. Každý neurón si vypočíta svoju aktiváciu (t.j. výstup z aktivačnej funkcie). Získame tak pole 10 hodnôt (na obrázku 10 je označené ako $z$). Toto pole odovzdáme do funkcie Softmax. Tá každému prvku v poli vypočíta jeho pravdepodobnosť klasifikácie, t.j. vytvorí nové výstupné pole. Matematický predpis funkcie Softmax pre $i$-ty prvok z poľa $z$ je uvedený pod textom.
$softmax(\textbf{z})_{i} = \dfrac{e^{(z_{i} - max(\textbf{z}))}}{\sum_{j=0}^{K}e^{(z_{j} - max(\textbf{z}))}}$
kde $max(\textbf{z})$ je hodnota najväčšieho prvku z poľa $z$ a $K=9$ je index posledného neurónu.
Dôležitá poznámka: v tomto zadaní používame numericky stabilnú funkciu Softmax (pre viac informácií si treba prečítať články Safe Softmax a Numerical Stability of Softmax).
Funkcia Findmax slúži na nájdenie indexu najväčšieho prvku v poli. Vstupom je pole 10 hodnôt (výstup z funkcie Softmax). Výstupom je index najväčšieho prvku. Ak pole obsahuje viacero najväčších prvkov (duplicity), tak funkcia vráti index, ktorý je najbližšie k 0.
V tomto zadaní budete pracovať s projektom, ktorý sa skladá z 6 súborov:
data.h
functions.h
data.c
functions.c
z2.c
CMakeLists.txt
Hlavičkové súbory
data.h
- Obsahuje potrebné makrá a deklarácie polí pre váhy a bias
hodnoty.
functions.h
- Obsahuje deklarácie pomocných funkcií:
Zdrojové súbory
data.c
- Obsahuje definície polí pre váhy a bias hodnotyfunctions.c
- Obsahuje definície funkcií, ktoré sú zadeklarované v data.h
z2.c
- Hlavný súbor zadania, do ktorého sú vložené všetky potrebné
hlavičkové súbory. Je to miesto pre vašu prácu. Tento súbor po vypracovaní ako
jediný odovzdávate
// z2.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "functions.h" // Swish funkcia a pomocne funkcie -- NEMENIT !!!
#include "data.h" // Makra, vahy a bias hodnoty -- NEMENIT !!!
int main(void) {
return 0;
}
Dôležitá poznámka 1: je zakázané meniť obsah súborov data.h
, data.c
, functions.h
a functions.c
.
Testovací server použije pri testovaní presne tie verzie súborov, ktoré sú dodané spolu so zadaním. Ak si tieto súbory upravíte, je vysoká šanca, že vám server váš zdrojový kód neskompiluje.
Dôležitá poznámka 2: Nemeňte usporiadanie súborov a štruktúru adresárov projektu. Súbory ponechajte v adresároch include
a src
. Nemeňte názov adresárov. Súbor CMakeLists.txt
musí byť na rovnakej úrovni ako adresáre include
a src
.
Dôležitá poznámka 3: Nemeňte importovanie hlavičkových súborov data.h
a functions.h
. Žiadnym spôsobom nemeňte cestu k týmto hlavičkovým súborom (ak použijete napr. vlastnú absolútnu/relatívnu cestu k týmto súborom, tak testovací server túto cestu nerozpozná). Ak tieto cesty zmeníte, server váš zdrojový kód neskompiluje.
Projektový konfiguračný súbor CMakeLists.txt
pre CLion
Spolu s projektovými súbormi máte k dispozícii hlavný konfiguračný súbor CLion projektu, ktorý je správne
nastavený a netreba ho meniť. V prípade, že nemáte nainštalovanú verziu programu CMake 3.28 a vyššiu, prepíšte
číslo verzie na vyhovujúcu
hodnotu. Po spustení CLion-u si otvorte projekt kliknutím na tlačidlo Open File or Project a zvoľte si koreňový
adresár projektu (t.j. adresár, v ktorom je uložený
súbor CMakeLists.txt
). CLion projekt automaticky rozpozná. Projekt
skompilujte. Ak všetko prebehne bez chýb, môžete pracovať na zadaní.
cmake_minimum_required(VERSION 3.28)
project(z2 C)
set(CMAKE_C_STANDARD 11)
add_compile_options( -Wall -Wextra -Wuninitialized -pedantic -g )
add_executable(z2 src/functions.c src/data.c src/z2.c)
target_include_directories(z2 PRIVATE include)
target_link_libraries(z2 -lm)
Poznámka: ak by bol problém s kompiláciou projektu v operačnom systéme Windows, skúste vymazať riadok:
target_link_libraries(z2 -lm)
Budeme rozlišovať 7 režimov činnosti. Aplikácia sa rozhodne, do ktorého režimu vstúpi po načítaní prvej číselnej hodnoty zo štandardného vstupu. Platné sú len čísla 1-7. Ostatné hodnoty sa budú ignorovať.
Režim 1 - Výpis načítaného obrázku číslice
Spustíme skompilovaný program v termináli. Používateľ zadá číslo 1 (vstup do režimu 1). Nasleduje aspoň 1 biely
znak (medzera alebo nový riadok). Zadáme pixely obrázku (784 číselných hodnôt oddelených medzerou). Následne program vypíše načítaný obrázok. Na načítanie a výpis obrázku použite dodané funkcie load_image
a print_image
.
Okrem obrázku sa nič iné nevypíše. Následne program štandardne skončí s návratovou hodnotou 0.
print_image
) (veľký obrázok).Režim 2 - Výpis konkrétnej váhy pre zvolený neurón
Spustíme skompilovaný program v termináli. Používateľ zadá číslo 2 (vstup do režimu 2). Nasleduje aspoň 1 biely
znak (medzera alebo nový riadok). Zadáme index neurónu (platné indexy neurónov sú 0 až 9), ktorého váhu chceme vypísať. Zadáme súradnicu váhy: riadok a stĺpec (riadky aj stĺpce číslujeme od 0). Týmto špecifikujeme konkrétnu váhu v poli weights
. Následne program vypíše danú váhu (jedno číslo s 2 zobrazenými desatinnými miestami).
Okrem danej váhy sa nič iné nevypíše. Následne program štandardne skončí s návratovou hodnotou 0.
Na obrázku 16 je vizualizácia súradníc v obrázku a vyhľadania konkrétnej váhy v poli weights
. V tomto príklade chceme vypísať váhu, ktorá patrí pixelu so súradnicami riadok=9 a stĺpec=16 a neurónu s indexom 2. Nezabudnite, že pole weights
je jednorozmerné a jednotlivé váhy sú uložené za sebou. Úlohou teda je správne namapovanie súradnice v 2D obrázku do 1D poľa weights
.
weights
(veľký obrázok).Režim 3 - Výpis váženého súčtu pre všetky neuróny a zvolený obrázok
Spustíme skompilovaný program v termináli. Používateľ zadá číslo 3 (vstup do režimu 3). Nasleduje aspoň 1 biely znak (medzera alebo nový riadok). Zadáme pixely obrázku (784 číselných hodnôt oddelených medzerou). Následne program vypíše tabuľku, v ktorej bude vypočítaná hodnota váženého súčtu pre každý neurón v data processing vrstve. Tabuľka bude mať 10 riadkov a 2 stĺpce. Prvý stĺpec predstavuje indexy neurónov (od 0 po 9). Druhý stĺpec predstavuje hodnotu váženého súčtu pre daný neurón. Stĺpce tabuľky majú šírku 8 znakov. Počet zobrazených desatinných miest pre čísla v druhom stĺpci je 2. Čísla sú zarovnané doprava. Okrem danej tabuľky sa nič iné nevypíše. Následne program štandardne skončí s návratovou hodnotou 0.
Režim 4 - Výpis vypočítaných hodnôt funkcie Softmax
Spustíme skompilovaný program v termináli. Používateľ zadá číslo 4 (vstup do režimu 4). Nasleduje aspoň 1 biely znak (medzera alebo nový riadok). Zadáme postupnosť 10 hodnôt (ľubovoľné čísla oddelené medzerami). Zadané pole hodnôt odovzdáme na vstup funkcie Softmax. Funkcia Softmax z daného poľa vypočíta pole pravdepodobností, ktoré bude mať taký istý počet prvkov ako vstupné pole. Pole pravdepodobností obsahuje hodnoty v intervale $\langle0,1\rangle$. Súčet prvkov v tomto poli je 1. Pole pravdepodobností sa vypíše do jedného riadku. Číselné hodnoty budú oddelené 1 medzerou. Okrem výstupu z funkcie Softmax sa nič iné nevypíše. Následne program štandardne skončí s návratovou hodnotou 0.
Režim 5 - Výpis indexu najväčšieho prvku v poli (Findmax)
Spustíme skompilovaný program v termináli. Používateľ zadá číslo 5 (vstup do režimu 5). Nasleduje aspoň 1 biely znak (medzera alebo nový riadok). Zadáme postupnosť 10 ľubovoľných čísiel. Každé číslo je oddelené aspoň 1 medzerou. Toto pole hodnôt sa pošle na vstup funkcie Findmax, ktorá v ňom nájde index najväčšieho prvku. Ak by sa v poli vyskytovalo maximum viacnásobne, funkcia vráti index, ktorý je bližšie k 0. Následne daný index vypíšeme. Okrem výstupu z funkcie Findmax sa nič iné nevypíše. Následne program štandardne skončí s návratovou hodnotou 0.
Režim 6 - Výpis výsledku klasifikácie obrázku číslice
Spustíme skompilovaný program v termináli. Používateľ zadá číslo 6 (vstup do režimu 6). Nasleduje aspoň 1 biely znak (medzera alebo nový riadok). Zadáme pixely obrázku (784 číselných hodnôt oddelených medzerou). Následne prebehne klasifikácia číslice, t.j. načítané vstupné pixely sa pošlú na vstup neurónovej siete, ktorá ich spracuje v zmysle schémy na obrázku 6, t.j. spracujú sa najprv v data processing vrstve, následne v klasifikačnej vrstve a nakoniec funkcia Findmax určí menovku číslice. Menovka číslice sa vypíše ako jediná. Následne program štandardne skončí s návratovou hodnotou 0.
Režim 7 - Výpis úspešnosti klasifikácie číslic
Spustíme skompilovaný program v termináli. Používateľ zadá číslo 7 (vstup do režimu 7). Nasleduje aspoň 1 biely znak (medzera alebo nový riadok). Následne zadáme sériu údajov oddelených medzerami podľa uvedeného zoznamu.
Po zadaní vstupných údajov sa všetky zadané obrázky klasifikujú a vypíše sa výsledok v nasledovnom tvare.
accuracy i1-c1-p1 i2-c2-p2 i3-c3-p3 ... iK-cK-pK
Bližší popis výstupu:
accuracy
predstavuje úspešnosť klasifikácie vyjadrenú v percentách. Vypočítame ju ako podiel správne klasifikovaných číslic a všetkých číslic, ktoré sme klasifikovali. Zobrazia sa 2 desatinné miesta. Následne program štandardne skončí s návratovou hodnotou 0.
Poznámka k vstupu: v tomto príklade sa do obrázku nezmestí celý vstup do programu. Po zadaní $K=5$ a postupnosti 7,7,1,2,3 nasledujú pixely 5 obrázkov, ktoré majú spolu 3 920 pixelov (784 x 5). Pixely obrázkov sú zadané ako jedna súvislá postupnosť hodnôt oddelených bielymi znakmi (medzera alebo nový riadok). Vzhľadom na komfort používania programu odporúčame všetky scenáre testovať pomocou presmerovania štandardného vstupu z TXT súboru, v ktorom sú uložené vstupné údaje (neodporúčame manuálne kopírovať a vkladať do terminálu).
K dispozícii máte balík s testovacími súbormi pomocou, ktorých si viete otestovať funkcionalitu vášho programu v jednotlivých scenároch. Navyše balík obsahuje vzorku číslic (PNG aj TXT formát) z MNIST databázy na testovacie účely a taktiež zopár pomocných skriptov, ktoré slúžia na manipuláciu so súbormi.
Balík je distribuovaný ako ZIP súbor s názvom z2_testing.zip
, ktorý obsahuje tieto adresáre:
mnist-png
- adresár s obrázkami číslic 0-9 v PNG formáte.mnist-txt
- adresár s obrázkami číslic 0-9 v TXT formáte.scripts_and_extra
- adresár s pomocnými skriptami na zobrazovanie a konverziu súborovstdin
- adresár, ktorý obsahuje TXT súbory, v ktorých sú uložené vstupy do programu pre všetky testovacie prípady a scenáre (odporúčame skompilovaný program spúšťať pomocou presmerovania štandardného vstupu z týchto súborov)stdout
- adresár, ktorý obsahuje správne výstupy pre všetky testovacie prípady vo všetkých scenárochAko spustiť program s presmerovaním štandardného vstupu z TXT súboru
Štandardný vstup programu vieme v termináli jednoducho presmerovať pomocou operátora <
. Použitím tohto operátora sa vstup bude čerpať z dodaného textového súboru a nie z klávesnice. Príklad spustenia programu s presmerovaním štandardného vstupu v Linux termináli je uvedený pod textom.
./my_program < input.txt
Uvádzame príklad ako testovať váš program pomocou dodaných TXT súborov pre jednotlivé scenáre. V príklade je program testovaný pre náhodne vybrané testovacie prípady v scenári 1. Program z2
predstavuje skompilované zadanie č. 2 a predpokladáme, že sa nachádza v adresári stdin
.
./z2 < scenar_1/example_001_0_1.txt
./z2 < scenar_1/example_005_4_1852.txt
./z2 < scenar_1/example_008_7_16.txt
Uvádzame aj príklad ako si rýchlo v Linux termináli otestovať, či váš program vypísal očakávaný výstup pre zvolený testovací scenár a prípad. Využijeme na to presmerovanie štandardného vstupu a príkaz diff
na porovnanie obsahu dvoch textov. Budeme predpokladať, že skompilovaný program sa nachádza na rovnakej úrovni ako adresáre stdin
a stdout
. V tomto príklade testujeme, či náš program správne funguje v testovacom prípade 2 v rámci scenára 4. Ak sa po spustení tohto príkazu nič nevypíše, signalizuje to, že výstup nášho programu sa nelíši od správneho výstupu.
./z2 < stdin/scenar_4/example_002.txt | diff - stdout/scenar_4/example_002.txt --ignore-trailing-space
Poznámka: pokročilí programátori a nadšenci si môžu proces testovania a porovnávania výstupov programu so správnym výstupom automatizovať pomocou Python, Linux shell skriptov resp. Powershell skriptov a pod. Ideálny nástrojom na porovnávanie obsahu dvoch TXT súborov je príkaz diff
. Viac informácií nájdete na tomto odkaze.
V tomto zadaní netreba ošetrovať vstupy ani žiadne iné chybové situácie. Váš skompilovaný program bude testovaný len s platnými a zmysluplnými vstupnými údajmi.
Odovzdávací systém otestuje a vyhodnotí nasledovné oblasti funkcionality vášho programu. Na získanie bodov za konkrétny testovací scenár je nutné, aby testom prešli všetky testovacie prípady v danom scenári.
Scenár 1
Výpis načítaného obrázku číslice
|
0,5 b |
Scenár 2
Výpis konkrétnej váhy pre zvolený neurón
|
1,0 b |
Scenár 3
Výpis váženého súčtu pre všetky neuróny a zvolený obrázok
|
2,0 b |
Scenár 4
Výpis vypočítaných hodnôt funkcie Softmax
|
1,5 b |
Scenár 5
Výpis indexu najväčšieho prvku v poli (Findmax)
|
1,0 b |
Scenár 6
Výpis výsledku klasifikácie načítaného obrázku číslice
|
3,0 b |
Scenár 7
Výpis úspešnosti klasifikácie číslic
|
1,0 b |
Súčet | 10,0 b |
Všetky testovacie príklady na stiahnutie
Poznámka: predpokladáme, že váš testovaný program sa nachádza na rovnakej adresárovej úrovni ako priečinok stdin
.
Vstup
./z2 < stdin/scenar_1/example_001_0_1.txt
Výstup
........................................................
........................................................
........................................................
........................................................
..................................WWWWWWWW..............
................................WWWWWWWWWWWW............
..............................WWWWWWWWWWWWWWWW..........
..........................WWWWWWWWWWWWWWWWWWWW..........
......................WWWWWWWWWWWWWWWWWWWWWWWW..........
....................WWWWWWWWWWWWWWWWWWWWWWWWWW..........
..................WWWWWWWWWWWWWWWWWWWWWWWWWWWW..........
................WWWWWWWWWW..WWWWWWWW..WWWWWWWW..........
..............WWWWWWWWWWWW..WWWWWW......WWWWWW..........
..............WWWWWWWW......WW..........WWWWWW..........
............WWWWWW......................WWWWWW..........
..........WWWWWWWW......................WWWWWW..........
..........WWWWWWWW....................WWWWWWWW..........
..........WWWWWWWW..................WWWWWWWW............
..........WWWWWWWW................WWWWWWWWWW............
..........WWWWWWWW..............WWWWWWWWWW..............
..........WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW................
............WWWWWWWWWWWWWWWWWWWWWWWW....................
..............WWWWWWWWWWWWWWWWWW........................
..................WWWWWWWWWWWW..........................
........................................................
........................................................
........................................................
........................................................
Vstup
./z2 < stdin/scenar_1/example_002_1_1366.txt
Výstup
........................................................
........................................................
........................................................
........................................................
........................................................
..........................WWWWWWWW......................
........................WWWWWWWWWWWW....................
..........................WWWWWWWWWW....................
..............................WWWWWW....................
..............................WWWWWW....................
..............................WWWW......................
............................WWWWWW......................
............................WWWWWW......................
............................WWWWWW......................
............................WWWWWW......................
............................WWWWWW......................
............................WWWWWW......................
..........................WWWWWW........................
..........................WWWWWW........................
..........................WWWWWW........................
........................WWWWWWWW........................
........................WWWWWWWW........................
........................WWWWWW..........................
........................WWWWWW..........................
........................WWWW............................
........................................................
........................................................
........................................................
Vstup
./z2 < stdin/scenar_1/example_003_2_1656.txt
Výstup
........................................................
........................................................
........................................................
........................................................
..................WWWWWWWWWWWW..........................
..................WWWWWWWWWWWWWW........................
....................WWWWWWWWWWWW........................
........................WWWWWWWWWW......................
..........................WWWWWWWW......................
..........................WWWWWWWW......................
........................WWWWWWWWWW......................
......................WWWWWWWWWW........................
......................WWWWWWWW..........................
....................WWWWWWWW............................
....................WWWWWWWW............................
..................WWWWWWWWWW............................
................WWWWWWWWWW..............................
..............WWWWWWWWWW..............WWWWWWWWWWWWWW....
..............WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW..
..............WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW..
..............WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW..
......................WWWWWWWWWW........................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
Vstup
./z2 < stdin/scenar_1/example_004_3_158.txt
Výstup
........................................................
........................................................
........................................................
........................WWWWWWWWWWWWWWWW................
......................WWWWWWWWWWWWWWWWWW................
....................WWWWWWWWWWWWWWWWWWWWWW..............
....................WWWW..........WWWWWW................
..................................WWWWWW................
................................WWWWWWWW................
..............................WWWWWWWW..................
........................WWWWWWWWWWWW....................
......................WWWWWWWWWWWW......................
......................WWWWWWWWWWWWWW....................
........................WWWWWWWWWWWWWW..................
................................WWWWWWWW................
..................................WWWWWW................
..................................WWWWWWWW..............
............WWWWWWWW..............WWWWWWWW..............
..........WWWWWWWWWWWWWWWWWW....WWWWWWWWWW..............
............WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW..............
............WWWWWWWWWWWWWWWWWWWWWWWWWW..................
..............WWWWWWWWWWWWWWWWWWWWWW....................
................WWWWWWWWWWWWWWWW........................
........................................................
........................................................
........................................................
........................................................
........................................................
Vstup
./z2 < stdin/scenar_1/example_005_4_1852.txt
Výstup
........................................................
........................................................
........................................................
........................................................
........................................................
..............................WWWWWW....................
..............................WWWWWW....................
..............................WWWWWW....................
..............WWWWWW..........WWWWWWWW..................
..............WWWWWW..........WWWWWWWW..................
..............WWWWWW..........WWWWWWWW..................
..............WWWWWW..........WWWWWWWW..................
..............WWWWWWWW........WWWWWWWW..................
..............WWWWWWWW......WWWWWWWWWW..................
................WWWWWWWW....WWWWWWWW....................
................WWWWWWWWWWWWWWWWWWWW....................
..................WWWWWWWWWWWWWWWWWWWW..................
......................WWWWWWWWWWWWWWWW..................
..........................WWWWWWWWWW....................
............................WWWWWWWW....................
............................WWWWWWWW....................
............................WWWWWWWW....................
............................WWWWWWWW....................
............................WWWWWW......................
............................WWWWWW......................
........................................................
........................................................
........................................................
Vstup
./z2 < stdin/scenar_1/example_006_5_105.txt
Výstup
........................................................
........................................................
........................................................
........................................................
........................................................
............................WWWWWWWWWWWW................
....................WWWWWWWWWWWWWWWWWWWW................
..............WWWWWWWWWWWWWWWWWWWWWWWWWW................
..............WWWWWWWWWWWWWW............................
..............WWWWWWWWWW................................
....................WWWW................................
..................WWWWWW..WWWWWWWW......................
....................WWWWWWWWWWWWWWWW....................
....................WWWWWWWWWW..WWWWWW..................
....................WWWWWWWW......WWWWWW................
....................WWWWWW........WWWWWW................
....................WWWWWW........WWWWWW................
......................WW..........WWWWWWWW..............
..................................WWWWWWWW..............
..................................WWWWWW................
..................................WWWWWW................
..................WWWW..........WWWWWWWW................
..................WWWWWWWW..WWWWWWWWWW..................
..................WWWWWWWWWWWWWWWWWW....................
......................WWWWWWWWWWWW......................
........................................................
........................................................
........................................................
Vstup
./z2 < stdin/scenar_1/example_007_6_1111.txt
Výstup
........................................................
........................................................
........................................................
..............................WWWWWW....................
............................WWWWWWWW....................
..........................WWWWWWWWWW....................
..........................WWWWWWWW......................
........................WWWWWWWWWW......................
........................WWWWWWWW........................
......................WWWWWWWW..........................
......................WWWWWWWW..........................
....................WWWWWWWWWW..........................
....................WWWWWWWWWWWWWWWW....................
..................WWWWWWWWWWWWWWWWWWWW..................
..................WWWWWWWWWWWWWWWWWWWWWW................
..................WWWWWWWWWWWW....WWWWWWWW..............
..................WWWWWWWWWWWW......WWWWWW..............
..................WWWWWWWW........WWWWWWWW..............
..................WWWWWW........WWWWWWWWWW..............
..................WWWWWW........WWWWWWWWWW..............
..................WWWWWWWWWWWWWWWWWWWWWW................
....................WWWWWWWWWWWWWWWWWW..................
......................WWWWWWWWWWWW......................
........................................................
........................................................
........................................................
........................................................
........................................................
Vstup
./z2 < stdin/scenar_1/example_008_7_16.txt
Výstup
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
............WWWW........................................
............WWWWWW......................................
............WWWWWWWWWW................WWWW..............
............WWWWWWWWWWWWWWWW......WWWWWWWWWW............
............WWWWWW..WWWWWWWWWWWWWWWWWWWWWW..............
............WWWWWW........WWWWWWWWWW..WWWW..............
..............WWWW....................WWWW..............
..............WWWWWW..................WWWW..............
..............WWWWWW..................WWWW..............
..............WWWWWW..................WWWW..............
................WWWW................WWWWWW..............
....................................WWWWWW..............
......................................WWWW..............
......................................WWWW..............
......................................WWWW..............
....................................WWWWWW..............
....................................WWWWWW..............
....................................WWWWWW..............
....................................WWWW................
....................................WWWW................
........................................................
Vstup
./z2 < stdin/scenar_1/example_009_8_1604.txt
Výstup
........................................................
........................................................
........................................................
........................................................
........................................................
................WWWWWWWWWWWWWW..........................
..............WWWWWWWWWWWWWWWWWW........................
............WWWWWW........WWWWWWWW......................
............WWWWWW............WWWW......................
..............WWWWWW..........WWWW......................
..............WWWWWWWW........WWWWWWWWWW................
................WWWWWWWW......WWWWWWWW..................
..................WWWWWWWW..WWWWWWWW....................
......................WWWWWWWWWW........................
........................WWWWWWWW........................
......................WWWWWWWWWWWWWW....................
....................WWWWWW....WWWWWW....................
....................WWWWWW......WWWWWW..................
....................WWWW..........WWWWWW................
....................WWWW............WWWWWW..............
....................WWWWWW............WWWW..............
....................WWWWWW............WWWW..............
......................WWWWWW........WWWWWW..............
......................WWWWWWWWWWWWWWWWWWWW..............
..........................WWWWWWWWWWWWWW................
........................................................
........................................................
........................................................
Vstup
./z2 < stdin/scenar_1/example_010_9_1725.txt
Výstup
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................WWWWWWWWWWWWWW..................
....................WWWWWWWWWWWWWWWWWWWW................
..................WWWWWWWWWWWWWWWWWWWWWW................
................WWWWWWWWWWWWWWWWWWWWWWWW................
................WWWWWWWWWW..........WWWW................
................WWWWWWWWWWWWWW........WW................
..................WWWWWWWWWWWWWWWW......................
..................WWWWWWWWWWWWWWWWWW....................
......................WW......WWWWWW....................
............................WWWWWW......................
............................WWWWWW......................
..........................WWWWWWWW......................
..........................WWWWWWWW......................
..........................WWWWWWWW......................
..........................WWWWWWWW......................
........................WWWWWWWW........................
..........................WWWWWW........................
..........................WWWWWW........................
..........................WWWWWW........................
..........................WWWWWW........................
........................................................
Vstup
./z2 < stdin/scenar_3/example_001_0_1283.txt
Výstup
0 50.15
1 34.39
2 42.77
3 42.78
4 42.24
5 47.86
6 43.17
7 42.71
8 44.25
9 44.30
Vstup
./z2 < stdin/scenar_3/example_002_1_1538.txt
Výstup
0 42.05
1 55.41
2 52.34
3 48.10
4 40.56
5 45.52
6 47.21
7 42.15
8 51.98
9 45.62
Vstup
./z2 < stdin/scenar_3/example_003_2_134.txt
Výstup
0 71.30
1 68.63
2 87.15
3 76.53
4 70.48
5 69.15
6 77.40
7 59.14
8 77.14
9 72.41
Vstup
./z2 < stdin/scenar_3/example_004_3_1359.txt
Výstup
0 28.88
1 30.71
2 31.62
3 35.97
4 28.50
5 33.37
6 29.43
7 27.96
8 33.91
9 32.39
Vstup
./z2 < stdin/scenar_3/example_005_4_1530.txt
Výstup
0 44.98
1 44.01
2 47.07
3 41.33
4 56.89
5 47.46
6 51.98
7 46.28
8 46.67
9 48.46
Vstup
./z2 < stdin/scenar_3/example_006_5_1131.txt
Výstup
0 29.47
1 34.61
2 30.85
3 32.07
4 25.78
5 35.94
6 30.36
7 30.43
8 33.84
9 29.70
Vstup
./z2 < stdin/scenar_3/example_007_6_1600.txt
Výstup
0 40.05
1 47.33
2 46.80
3 42.09
4 41.34
5 43.57
6 51.58
7 36.50
8 45.28
9 40.67
Vstup
./z2 < stdin/scenar_3/example_008_7_1719.txt
Výstup
0 19.85
1 19.83
2 22.43
3 21.34
4 18.38
5 21.46
6 18.18
7 20.87
8 20.80
9 19.16
Vstup
./z2 < stdin/scenar_3/example_009_8_1870.txt
Výstup
0 77.63
1 76.76
2 83.86
3 80.10
4 69.67
5 75.53
6 79.29
7 68.95
8 89.14
9 79.55
Vstup
./z2 < stdin/scenar_4/example_001.txt
Výstup
0.00 0.00 0.00 0.00 0.00 0.01 0.00 0.00 0.99 0.00
Vstup
./z2 < stdin/scenar_4/example_002.txt
Výstup
0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Vstup
./z2 < stdin/scenar_4/example_003.txt
Výstup
1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Vstup
./z2 < stdin/scenar_4/example_004.txt
Výstup
0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00
Vstup
./z2 < stdin/scenar_4/example_005.txt
Výstup
0.00 0.00 0.00 0.75 0.00 0.00 0.00 0.00 0.00 0.25
Vstup
./z2 < stdin/scenar_4/example_006.txt
Výstup
0.00 0.03 0.94 0.00 0.00 0.00 0.00 0.00 0.03 0.00
Vstup
./z2 < stdin/scenar_4/example_007.txt
Výstup
0.00 0.00 0.00 0.76 0.00 0.00 0.00 0.02 0.03 0.19
Vstup
./z2 < stdin/scenar_4/example_008.txt
Výstup
0.00 0.00 0.10 0.25 0.00 0.00 0.00 0.25 0.40 0.00
Vstup
./z2 < stdin/scenar_4/example_009.txt
Výstup
0.28 0.00 0.00 0.00 0.00 0.41 0.00 0.00 0.09 0.22
Vstup
./z2 < stdin/scenar_7/example_001-0c2c5c9c.txt
Výstup
0.00 0-0-8 1-2-7 2-5-9 3-9-7
Vstup
./z2 < stdin/scenar_7/example_003-77c123.txt
Výstup
80.00 0-7-7 1-7-8 2-1-1 3-2-2 4-3-3
Vstup
./z2 < stdin/scenar_7/example_004-81430c9c.txt
Výstup
66.67 0-8-8 1-1-1 2-4-4 3-3-3 4-0-8 5-9-7
Vstup
./z2 < stdin/scenar_7/example_005-984613c1c26c.txt
Výstup
66.67 0-9-9 1-8-8 2-4-4 3-6-6 4-1-1 5-3-5 6-1-2 7-2-2 8-6-4
Vstup
./z2 < stdin/scenar_7/example_006-0c561c893c4c.txt
Výstup
50.00 0-0-8 1-5-5 2-6-6 3-1-2 4-8-8 5-9-9 6-3-5 7-4-1
Vstup
./z2 < stdin/scenar_7/example_007-1c3c5c7c9c987.txt
Výstup
37.50 0-1-2 1-3-5 2-5-9 3-7-8 4-9-7 5-9-9 6-8-8 7-7-7
Vstup
./z2 < stdin/scenar_7/example_009-012345.txt
Výstup
100.00 0-0-0 1-1-1 2-2-2 3-3-3 4-4-4 5-5-5
Nasledujúce zdroje vám môžu pomôcť pri programovaní zadania. Odporúčame si tieto zdroje preštudovať. Na prístup k niektorým zdrojom potrebujete byť prihlásení vo vašom univerzitnom Google STU konte.
Prednášky
Jazyk C
Funkcie printf
a scanf
Zdroje použité pri tvorbe zadania a prezentácie