PROG-2 logo
Neprihlásený používateľ

Špecifikácia zadania


Cieľom zadania je napísať program v jazyku C, ktorý bude klasifikovať obrázky rukou písaných číslic pomocou jednoduchej 2-vrstvovej neurónovej siete. Neurónová sieť je už vopred natrénovaná a jej váhy sú dodané spolu so zadaním. Obrázky, s ktorými budeme pracovať pochádzajú s verejne známej MNIST databázy. Okrem klasifikácie obrázkov bude výsledný program schopný vykonávať základné operácie v rámci neurónovej siete: načítanie/zobrazenie obrázku, zobrazovanie váh, počítanie váženého súčtu neurónu (tzv. weighted sum), počítanie hodnoty aktivačnej funkcie, počítanie funkcie Softmax a hľadanie maxima v poli hodnôt. Navyše, jednou z úloh zadania bude aj vyhodnotenie úspešnosti klasifikácie viacerých obrázkov. Pri tvorbe zadania sme sa inšpirovali existujúcou prácou od Andrewa Cartera: MNIST Neural Network in C. V zadaní si precvičíte matematické výrazy, funkcie, polia a prácu s projektom, ktorý sa skladá z viacerých hlavičkových a zdrojových súborov.

Úloha

Vaša konzolová aplikácia napísaná v jazyku C bude fungovať v týchto krokoch:

  1. Spustenie skompilovaného programu v termináli.
  2. Zadanie režimu činnosti (číslo 1-7).
  3. Načítanie vstupov pre zvolený režim.
  4. Vykonanie zvoleného režimu. V nasledovnom zozname sú uvedené všetky režimy:
    • Režim 1: Výpis načítaného obrázku číslice.
    • Režim 2: Výpis konkrétnej váhy pre zvolený neurón.
    • Režim 3: Výpis váženého súčtu pre všetky neuróny a zvolený obrázok.
    • Režim 4: Výpis vypočítaných hodnôt funkcie Softmax.
    • Režim 5: Výpis indexu najväčšieho prvku v poli (Findmax).
    • Režim 6: Výpis výsledku klasifikácie obrázku číslice.
    • Režim 7: Výpis úspešnosti klasifikácie číslic.
  5. Výpis výsledkov režimu (údaje sa vypíšu na stdout).
  6. Ukončenie programu (štandardným návratovým kódom 0 z funkcie main).


Obrázok 1: Fázy činnosti programu (veľký obrázok).

Obrázky rukou písaných číslic

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 2: Rozmer obrázku je 28 x 28 pixelov (veľký obrázok).

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ázok 3: Reprezentácia obrázku pomocou 1D poľa (veľký obrázok).

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


Obrázok 4: Pixely obrázku uložené v TXT súbore (súbor má 28 riadkov a každý riadok má 28 pixelov) (veľký obrázok).

Neurónová sieť

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.


Obrázok 5: Zjednodušený pohľad na neurónovú sieť na klasifikáciu obrázku (veľký obrázok).

Architektúra siete

Naša neurónová sieť bude obsahovať 2 vrstvy:

  • Data processing vrstva - obsahuje 10 neurónov (pretože klasifikujeme 10 rôznych typov číslic). Každý neurón používa aktivačnú funkciu Swish (viď zadanie č. 1)
  • Klasifikačná vrstva - obsahuje 1 neurón s aktivačnou funkciou Softmax.

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.


Obrázok 6: Architektúra neurónovej siete, ktorú používame v zadaní (veľký obrázok).
Ako funguje neurón

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.


Obrázok 7: Schéma znázorňujúca výpočet váženého súčtu vstupov do neurónu (tzv. weighted sum) (veľký obrázok).

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.


Obrázok 8: Schéma znázorňujúca všetky interné operácie neurónu (veľký obrázok).
Váhy a bias hodnoty

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.


Obrázok 9: Sprístupňovanie váh jednotlivých neurónov v poli weights (veľký obrázok).
Funkcia Softmax

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


Obrázok 10: Vizualizácia vstupov a výstupov Softmax funkcie (veľký obrázok).
Funkcia Findmax

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.


Obrázok 11: Vizualizácia vstupov a výstupov Findmax funkcie (veľký obrázok).

Projekt

V tomto zadaní budete pracovať s projektom, ktorý sa skladá z 6 súborov:

Hlavičkové súbory
  • data.h
  • functions.h
Zdrojové súbory
  • data.c
  • functions.c
  • z2.c
Projektový konfiguračný súbor
  • 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í:
    • Swish funkcia
    • funkcia na načítanie hodnôt do poľa zo štandardného vstupu (slúži napr. na načítanie obrázku)
    • funkcia na výpis načítaného obrázku číslice

Zdrojové súbory

  • data.c - Obsahuje definície polí pre váhy a bias hodnoty
  • functions.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)

Režimy činnosti

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.


Obrázok 12: Príklad spustenia režimu 1 v termináli (veľký obrázok).



Obrázok 13: Príklad výstupu režimu 1 (vypísaná číslica 3 pomocou dodanej funkcie 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.


Obrázok 14: Príklad spustenia režimu 2 v termináli (zadal sa neurón s indexom 3, súradnica váhy je riadok=20 a stĺpec=26) (veľký obrázok).



Obrázok 15: Príklad výstupu režimu 2 (vypísala sa konkrétna váha, ktorá prislúcha neurónu s indexom 3 a váhou, ktorá je určená pre pixel so súradnicami riadok=20 a stĺpec=26) (veľký obrázok).


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.


Obrázok 16: Vizualizácia súradníc váhy v obrázku a vyhľadania konkrétnej váhy v poli 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.


Obrázok 17: Príklad spustenia režimu 3 v termináli (veľký obrázok).



Obrázok 18: Príklad výstupu režimu 3 (tabuľka má 2 stĺpce so šírkou 8 znakov, zarovnanie textu je doprava a počet zobrazených desatinných miest v druhom stĺpci je 2) (veľký obrázok).


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.


Obrázok 19: Príklad spustenia režimu 4 v termináli (veľký obrázok).



Obrázok 20: Príklad výstupu režimu 4 (veľký obrázok).


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.


Obrázok 21: Príklad spustenia režimu 5 v termináli (veľký obrázok).



Obrázok 22: Príklad výstupu režimu 5 (veľký obrázok).


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.


Obrázok 23: Príklad spustenia režimu 6 v termináli (veľký obrázok).



Obrázok 24: Príklad výstupu režimu 6 (neurónová sieť zadaný obrázok klasifikovala ako číslicu 3) (veľký obrázok).


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.

  • Parameter $K$, ktorý určuje koľko obrázkov chceme klasifikovať.
  • Postupnosť $c_{1}, c_{2}, c_{3}, ... c_{K}$ správnych menoviek obrázkov, ktoré ideme klasifikovať. Menovky sú reprezentované celými číslami.
  • Postupnosť $img_{1}, img_{2}, img_{3}, ... img_{K}$ obrázkov, ktoré sú určené na klasifikáciu. Každý obrázok je reprezentovaný ako postupnosť 784 hodnôt pixelov.

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.
  • hodnoty $i_{1}, i_{2}, i_{3} ... i_{K}$ predstavujú indexy obrázkov, ktoré sme klasifikovali
  • hodnoty $c_{1}, c_{2}, c_{3} ... c_{K}$ predstavujú správne menovky prislúchajúce k jednotlivým obrázkom (z angl. correct labels)
  • hodnoty $p_{1}, p_{2}, p_{3} ... p_{K}$ predstavujú menovky, ktoré jednotlivým obrázkom pridelila neurónová sieť (z angl. predicted labels).

Následne program štandardne skončí s návratovou hodnotou 0.


Obrázok 25: Príklad spustenia režimu 7 v termináli (v uvedenom príklade chceme vypočítať úspešnosť klasifikácie 5 obrázkov, ktorých správne menovky boli 7,7,1,2,3) (veľký obrázok).


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


Obrázok 26: Príklad výstupu režimu 7 (neurónová sieť dosiahla úspešnosť 80,00 % pretože nesprávne klasifikovala obrázok s indexom 1, ktorému pridelila menovku 8 namiesto správnej menovky 7) (veľký obrázok).

Ako testovať váš program?

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úborov
  • stdin - 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ároch

Obrázok 27: Štruktúra balíka s testovacími súbormi (veľký obrázok).


Ako 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.

Chybové situácie

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.

Hodnotenie zadania

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.

Testovacie scenáre
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

Testovacie príklady

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.

Výpis načítaného obrázku číslice

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 Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

Výpis konkrétnej váhy pre zvolený neurón

Vstup

./z2 < stdin/scenar_2/example_001_n0.txt

Výstup

0.39

Vstup Výstup

Vstup

./z2 < stdin/scenar_2/example_002_n1.txt

Výstup

0.17

Vstup Výstup

Vstup

./z2 < stdin/scenar_2/example_003_n2.txt

Výstup

0.94

Vstup Výstup

Vstup

./z2 < stdin/scenar_2/example_004_n3.txt

Výstup

0.73

Vstup Výstup

Vstup

./z2 < stdin/scenar_2/example_005_n4.txt

Výstup

1.02

Vstup Výstup

Vstup

./z2 < stdin/scenar_2/example_006_n5.txt

Výstup

0.21

Vstup Výstup

Vstup

./z2 < stdin/scenar_2/example_007_n6.txt

Výstup

0.39

Vstup Výstup

Vstup

./z2 < stdin/scenar_2/example_008_n7.txt

Výstup

0.31

Vstup Výstup

Vstup

./z2 < stdin/scenar_2/example_009_n8.txt

Výstup

0.86

Vstup Výstup

Vstup

./z2 < stdin/scenar_2/example_010_n9.txt

Výstup

0.33

Vstup Výstup

Výpis váženého súčtu pre všetky neuróny a zvolený obrázok

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 Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

Vstup

./z2 < stdin/scenar_3/example_010_9_1599.txt

Výstup

       0   38.88
       1   47.37
       2   43.72
       3   46.96
       4   46.83
       5   46.94
       6   41.22
       7   49.38
       8   49.86
       9   51.87

Vstup Výstup

Výpis vypočítaných hodnôt funkcie Softmax

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 Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

Vstup

./z2 < stdin/scenar_4/example_010.txt

Výstup

0.00 0.83 0.01 0.01 0.00 0.11 0.00 0.00 0.00 0.04

Vstup Výstup

Výpis indexu najväčšieho prvku v poli (Findmax)

Vstup

./z2 < stdin/scenar_5/example_001.txt

Výstup

2

Vstup Výstup

Vstup

./z2 < stdin/scenar_5/example_002.txt

Výstup

2

Vstup Výstup

Vstup

./z2 < stdin/scenar_5/example_003.txt

Výstup

2

Vstup Výstup

Vstup

./z2 < stdin/scenar_5/example_004.txt

Výstup

1

Vstup Výstup

Vstup

./z2 < stdin/scenar_5/example_005.txt

Výstup

1

Vstup Výstup

Vstup

./z2 < stdin/scenar_5/example_006.txt

Výstup

9

Vstup Výstup

Vstup

./z2 < stdin/scenar_5/example_007.txt

Výstup

2

Vstup Výstup

Vstup

./z2 < stdin/scenar_5/example_008.txt

Výstup

8

Vstup Výstup

Vstup

./z2 < stdin/scenar_5/example_009.txt

Výstup

0

Vstup Výstup

Vstup

./z2 < stdin/scenar_5/example_010.txt

Výstup

9

Vstup Výstup

Výpis výsledku klasifikácie načítaného obrázku číslice

Vstup

./z2 < stdin/scenar_6/example_001_0_1293.txt

Výstup

0

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_001_0_1294.txt

Výstup

0

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_001_0_1295.txt

Výstup

0

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_002_1_1491.txt

Výstup

1

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_002_1_1492.txt

Výstup

1

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_002_1_1493.txt

Výstup

1

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_003_2_1728.txt

Výstup

1

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_003_2_1729.txt

Výstup

2

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_003_2_1730.txt

Výstup

2

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_004_3_10.txt

Výstup

3

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_004_3_11.txt

Výstup

3

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_004_3_12.txt

Výstup

3

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_005_4_1383.txt

Výstup

4

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_005_4_1384.txt

Výstup

4

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_005_4_1385.txt

Výstup

4

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_006_5_1565.txt

Výstup

5

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_006_5_1566.txt

Výstup

5

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_006_5_1567.txt

Výstup

5

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_007_6_1802.txt

Výstup

6

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_007_6_1803.txt

Výstup

6

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_007_6_1804.txt

Výstup

6

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_008_7_1147.txt

Výstup

7

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_008_7_1148.txt

Výstup

7

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_008_7_1149.txt

Výstup

7

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_009_8_120.txt

Výstup

8

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_009_8_121.txt

Výstup

8

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_009_8_122.txt

Výstup

8

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_010_9_15.txt

Výstup

9

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_010_9_16.txt

Výstup

9

Vstup Výstup

Vstup

./z2 < stdin/scenar_6/example_010_9_17.txt

Výstup

9

Vstup Výstup

Výpis úspešnosti klasifikácie číslic

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 Výstup

Vstup

./z2 < stdin/scenar_7/example_002-4c.txt

Výstup

0.00 0-4-1

Vstup Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

Vstup

./z2 < stdin/scenar_7/example_008-4.txt

Výstup

100.00 0-4-4

Vstup Výstup

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

Vstup Výstup

Vstup

./z2 < stdin/scenar_7/example_010-9872.txt

Výstup

100.00 0-9-9 1-8-8 2-7-7 3-2-2

Vstup Výstup

Zdroje

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

Copyright © 2025, Pavol Marák, ÚIM FEI STU.
Vyrobené pomocou Django a Spectre.css.
Regulárne výrazy testujeme pomocou Regular Expression 101.
Videá prehrávame pomocou Plyr prehrávača.
Animácie vytvárame pomocou Animate.css.