readme
This commit is contained in:
parent
37b2141053
commit
3421a17233
@ -1,5 +1,5 @@
|
|||||||
CC = gcc
|
CC = gcc
|
||||||
CFLAGS = -g -Wall -Werror
|
CFLAGS = -g -Wall -Werror -std=c99
|
||||||
|
|
||||||
all: program
|
all: program
|
||||||
|
|
||||||
@ -13,4 +13,4 @@ main.o: main.c
|
|||||||
$(CC) $(CFLAGS) -c main.c -o main.o
|
$(CC) $(CFLAGS) -c main.c -o main.o
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf program *.o *.exe *.exe.stackdump
|
rm -rf program *.o *.exe *.exe.stackdump
|
||||||
|
@ -0,0 +1,39 @@
|
|||||||
|
Zadanie
|
||||||
|
|
||||||
|
A. 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ý.
|
||||||
|
|
||||||
|
Meno vstupného a výstupného súboru načítajte ako argument príkazového riadka. V zadaní by mali byť implementované tieto dve funkcie:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skomprimuje súbor in a zapíše do súboru out.
|
||||||
|
* @arg in smerník na otvorený vstupný súbor (na čítanie)
|
||||||
|
* @arg out smerník na otvorený výstupný súbor (na zápis)
|
||||||
|
* @return počet bajtov skomprimovaného súboru
|
||||||
|
*/
|
||||||
|
int compress(FILE* in, FILE* out);
|
||||||
|
/**
|
||||||
|
* Dekomprimuje súbor in a zapíše do súboru out.
|
||||||
|
* @arg in smerník na otvorený vstupný súbor (na čítanie)
|
||||||
|
* @arg out smerník na otvorený výstupný súbor (na zápis)
|
||||||
|
* @return počet bajtov dekomprimovaného súboru
|
||||||
|
*/
|
||||||
|
void decompress(FILE* in, FILE* out);
|
||||||
|
|
||||||
|
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 Cantebury corpus
|
||||||
|
|
||||||
|
Riešenie
|
||||||
|
|
||||||
|
Implementácia mojho riešenia zahŕňa algoritmus Run Length Encoding pracujúci na úrovni jednotlivých bajtov. Pri enkódovani sa hľadajú počty po sebe idúcich rovnakých bajtov a zapisuje sa počet namiesto samotných bajtov. Príklad:
|
||||||
|
|
||||||
|
in.txt: out.txt
|
||||||
|
AAAAAABB A6B2
|
||||||
|
|
||||||
|
V najlepšom prípade kompresia dokáže enkódovať bajty v pomere 1:127,5, v najhoršom prípade ide "negatívnu" kompresiu s pomerom 2:1.
|
||||||
|
|
||||||
|
Moje riešenie ukladá počet bajtov do jedného bajtu, t.j. maximálne 255. V prípade, že by vstupný súbor obsahoval príkladovo 500 rovnakých znakov A po sebe, uložili by sa ako A255 A245.
|
||||||
|
|
||||||
|
Pri dekódovaní sa v cykle čítajú 2 bajty, prvým je bajt ktorý sa opakuje a druhý je počet opakovaní. Tie sa následne vygenerujú v logickej pamäti programu a následne uložia pomocou jedného volania.
|
BIN
sk2a/compressor.o
Normal file
BIN
sk2a/compressor.o
Normal file
Binary file not shown.
1
sk2a/input.txt
Normal file
1
sk2a/input.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
aaaaaaAAAAAA
|
BIN
sk2a/main.o
Normal file
BIN
sk2a/main.o
Normal file
Binary file not shown.
2
sk2a/output.txt
Normal file
2
sk2a/output.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
aA
|
||||||
|
|
BIN
sk2a/program
Executable file
BIN
sk2a/program
Executable file
Binary file not shown.
Loading…
Reference in New Issue
Block a user