Skúška

Bude sa skladať z domácej úlohy (30 bodov) a zo školskej úlohy (30 bodov).

Príprava na školskú úlohu

Naštudujte a nacvičte si funkcie:

  • načítanie postupnosti slov alebo číslic, oddelených medzerou alebo koncom riadku, funkcie: scanf,sscanf, fgets,atof,atol,strtof,strtol,strtok`, sprintf
  • alokácia a dealokácia pamäte, malloc,calloc,free,realloc,
  • kopírovanie reťazcov a inicializácia. memset, memcpy, strcpy
  • triedenie: qsort

Naštudujte a nacvičte si algoritmy tak aby ste ich vedeli samostatne naprogramovať na skúške. Pri príprave používajte aj systém Valgrind.

V prípade, že nie sú postačujúce prednášky a cvičenia, odporúčaný spôsob praktickej a teoretickej prípravy je naštudovať si problém a vyskúšať pomoocu Geek4Geeks Practice:

Príklad možných zadaní:

  • Zostavte počítadlo slov alebo číslic
  • Vypíšte strom vo formáte preorder alebo postoder.
  • Overte kopovitosť zadanej postupnosti.
  • Zostavte spojkový zoznam.
  • Iné zadanie na vyššie uvedenú tému.

Predtermín

Predtermín sa uskutoční na poslednom cvičení. Nebude potrebné vypracovať "domácu úlohu", len "domácu prípravu" na programovanie na hodine.

Na účasť je potrebné mať aspoň 40 bodov zo zápočtu.

Na hodine naprogramujte:

  • Zostavenie Huffmanovho stromu zo zadaných údajov.
  • Naprogramovanie prioritnej fronty.
  • Výpis a načítanie stromu vo formáte preorder.
  • Zakódovanie alebo dekódovanie údajov Huffmanovým kódovaním podľa zadaného stromu.

Domáca skúška -

Riadny termín: Kompressor

Naprogramuj nástroj na kompresiu a dekompresiu.

Na kompresiu použite aspoň dva kompresné algoritmy, napr. : Huffmanovo kódovanie, LZ77, LZ78, Run Length kódovanie alebo iný. Môžete vymyslieť aj vlastný algoritmus.

Kompresor a dekompresor by mal byť schopný pracovať s ľubovoľným binárnym súborom do 10 MB. Súbor by mal byť po skomprimovaní menší minimálne o 10 percent a po dekomprimovaní by mal byť zhodný s pôvodným súborom. Pri práci s binárnymi súbormi môžete využiť funkcie fopen(), fread() a fwrite().

Na otestovanie kompresora a dekompresora použite súbory z Canterbury corpus

Riešenie nesmie využívať inú ako štandardnú knižnicu. Riešenie sa môže inšpirovať voľne dostupným cudzím riešením za predpokladu že uvediete zdroj, ste podrobne oboznámený so zdrojovým kódom a viete odpovedať na otázky týkajúce sa kódu. Vaše riešenie nemôže kopírovať cudzie riešenie. V prípade, že použijete generatívny model, napíšte ktorý a napíšte aj prompt ktorý ste použili.

Program by mal mať takéto rozhranie pri spustení z príkazového riadka:

# skomprimuje infile do súboru outfile
./compressor -c infile outfile
# dekomprimuje sUbor compressed a zapise do suboru uncompressed.
./compressor -d compressed uncompressed
./compressor -h  # Vypíše pomoc

Meno vstupného a výstupného súboru načítajte ako argument príkazového riadka. V zadaní by mali byť implementované tieto štyri funkcie:

/**
 * Skomprimuje súbor s názvom input_file_name pomocou kompresného algoritmu 1
 * a zapíše do súboru s názvom output_file_name
 * @arg input_file_name vstupný súbor (na čítanie)
 * @arg output_file_nameout výstupný súbor (na zápis)
 * @return počet bajtov skomprimovaného súboru v prípade úspechu. Zápornú hodnotu v prípade chyby.
 */
int compress_1(const char* input_file_name, const char* output_file_name);
/**
 * Dekomprimuje súbor skomprimovaný pomocou algoritmu 1 in a zapíše do súboru out. 
 * @arg input_file_name vstupný súbor (na čítanie)
 * @arg output_file_nameout výstupný súbor (na zápis)
 * @return počet bajtov deomprimovaného súboru v prípade úspechu. Zápornú hodnotu v prípade chyby.
 */
int decompress_1(const char* input_file_name, const char* output_file_name);
/**
 * Skomprimuje súbor s názvom input_file_name pomocou kompresného algoritmu 2
 * a zapíše do súboru s názvom output_file_name
 * @arg input_file_name vstupný súbor (na čítanie)
 * @arg output_file_nameout výstupný súbor (na zápis)
 * @return počet bajtov skomprimovaného súboru v prípade úspechu. Zápornú hodnotu v prípade chyby.
 */
int compress_2(const char* input_file_name, const char* output_file_name);
/**
 * Dekomprimuje súbor skomprimovaný pomocou algoritmu 2 in a zapíše do súboru out. 
 * @arg input_file_name vstupný súbor (na čítanie)
 * @arg output_file_nameout výstupný súbor (na zápis)
 * @return počet bajtov deomprimovaného súboru v prípade úspechu. Zápornú hodnotu v prípade chyby.
 */
int decompress_2(const char* input_file_name, const char* output_file_name);

Odovzdanie

Riešenie odovzdávajte na GIT s pomocou systému Traktor do repozitára usaa24 do adresára sk1.

Vaše riešenie by malo byť ukončené a odovzdané najneskôr 2 dni pred termínom skúšky na ktorý ste sa prihlásili.

Adresár musí obsahovať:

  • compressor.h : hlavičkový súbor s predpismi funkcií uvedených vyššie.
  • compressor.c: implementácia funkcií definovaných v hlavičkovom súbore.
  • main.c : implementácia funkcie main().
  • Makefile : Pravidlá pre skompilovanie. Príkaz make musí skompilovať program.
  • README.md s dokumentáciou. Dokumentácia musí obsahovať zadanie, stručný opis funkčnosti, stručný opis riešenia , podmienky za ktorých funguje a zoznam použitých zdrojov.

Domáca skúška - Opravný termín - Kalkulačka

Naprogramuj vedeckú kalkulačku. Kalkulačka by mala vyhodnocovať aj zložitejšie výrazy v infixnej notácii.

Kalkulačka by mala podporovať tieto operácie:

  • načítanie a prácu s číslami s presnosťou min. 2 desatinné miesta.
  • sčítanie, odčítanie, násobenie, delenie, zátvorky.
  • sinus, cosinus, odmocnina, druhá mocnina, logaritmus.

Príklad použitia:

(2 + 3) * 2
10
(10 * 2) + (6 / 2)
23

Pri riešené môžete využiť prepis infixovej formy zápisu do postfixovej. Potom môžete problém riešiť ako "zásobníkovú" kalkulačku.

Odovzdanie

Riešenie odovzdávajte na GIT s pomocou systému Traktor do repozitára usaa24 do adresára sk2.

Vaše riešenie by malo byť ukončené a odovzdané najneskôr 2 dni pred termínom skúšky na ktorý ste sa prihlásili.

Adresár musí obsahovať:

  • calculator.h : hlavičkový súbor s predpismi funkcií uvedených vyššie.
  • calculator.c: implementácia funkcií definovaných v hlavičkovom súbore.
  • main.c : implementácia funkcie main().
  • Makefile : Pravidlá pre skompilovanie. Príkaz make musí skompilovať program.
  • README.md s dokumentáciou. Dokumentácia musí obsahovať zadanie, stručný opis funkčnosti, stručný opis riešenia , podmienky za ktorých funguje a zoznam použitých zdrojov.

Riešenie nesmie využívať inú ako štandardnú knižnicu. Riešenie sa môže inšpirovať voľne dostupným cudzím riešením za predpokladu že uvediete zdroj, ste podrobne oboznámený so zdrojovým kódom a viete odpovedať na otázky týkajúce sa kódu. Vaše riešenie nemôže kopírovať cudzie riešenie. V prípade, že použijete generatívny model, napíšte ktorý a napíšte aj prompt ktorý ste použili.

Skúška