МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ
«ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ»
Лабораторна робота №7
«Стиснення даних.»
Виконав:
ст групи КІТ-14в
Богачов О. С.
.
ХАРКІВ 2007
Лабораторна робота №7
Тема: Стиснення даних.
Мета: Розробка програми стиснення iнформацiї та повернення до початкового стану без втрат.
Постановка задачi: Необхiдно розробити i налагодити комплекс програм:
- програма стиснення iнформацiї (архiвування). У якостi iнформацiї
використовувати копiю файлу з розробленою програмою. Розрахунок
ступеню стиснення;
- програма повернення архiвного файлу до початкового вигляду
(розархiвування).
1.Індивідуальне завдання.
Реалізувати алгоритм стиснення RLE.
2. Алгоритм програми:
1) Компресор шукає у файлі фрагменти, що повторюються та замінює цю послідовність на пару: повторюваний символ та кількість його провторень (кожну зі стиснених послідовностей записують з заздалегідь вибраною сигнатурою);
2) Неповторювані фрагменти залишаються без змін;
3) Декомпресор шукає сигнатуру – коли знаходе розпаковує послідовність байтів у вихідний файл.
3.Текст програми:
// Программа сжатия файла
#include<conio.h>
#include<stdio.h>
FILE *f=0,*out=0;
int cur_i=0;
char sgn=254; // Сигнатура сжатых фрагментов
// ***************** Функция выявления повторений *****************
int chk_pos (char buf[255])
{
int col=1;
int ch;
ch = buf[cur_i];
cur_i++;
while (ch==buf[cur_i]) { col++; cur_i++; }
return col;
}
// ***************** Главная функция *****************
int main()
{
clrscr();
printf("Hачало работы компрессора:\n");
char file1[20],file2[20];
printf("Введите имя файла для архивации: ");
scanf("%s",&file1);
printf(file1);
printf("\n");
printf("Введите имя результирующего файла: ");
scanf("%s",&file2);
printf(file2);
printf("\n");
if( (f=fopen(file1,"r")) == NULL)
{
printf("Hе могу открыть ысходный файл.\n");
return 1;
}
if( (out=fopen(file2,"w")) == NULL)
{
printf("Hе могу создать выходной файл.\n");
return 1;
}
int col=0;
char buf[255],c; // Буфер для чтения символов
while(!feof(f)) // Пока не конец файла
{
fgets(buf, 255, f); // Читаем целиком строку
cur_i=0;
while ( !(buf [cur_i]=='\n') )
{
col = chk_pos(buf);
if (col==1) { fprintf(out,"%c",buf[cur_i-1]);
printf("%c",buf[cur_i-1]);
}
else if (col==2)
{
fprintf(out,"%c%c",buf[cur_i-col],buf[cur_i-col]);
printf("%c%c",buf[cur_i-col],buf[cur_i-col]);
}
else
{
fprintf(out,"%c%c%c",sgn,buf[cur_i-col],col);
printf("%c%c%c",sgn,buf[cur_i-col],col);
}
col=0;
}
printf("\n");
if (!feof(f)) fprintf(out,"\n");
buf[0]='\n';
}
printf("\nСжатие закончено!");
fclose(out);
fclose(f);
getch();
return 0;
}
// Программа расжатия файла
#include<conio.h>
#include<stdio.h>
FILE *f=0,*out=0;
int cur_i=0;
char sgn=254; // Сигнатура сжатых фрагментов
// ***************** Главная функция *****************
int main()
{
clrscr();
printf("Hачало работы декомпрессора:\n");
char file1[20],file2[20];
printf("Введите имя файла для разархивации: ");
scanf("%s",&file1);
printf(file1);
printf("\n");
printf("Введите имя результирующего файла: ");
scanf("%s",&file2);
printf(file2);
printf("\n");
if( (f=fopen(file1,"r")) == NULL)
{
printf("Hе могу открыть исходный файл.\n");
return 1;
}
if( (out=fopen(file2,"w")) == NULL)
{
printf("Hе могу создать результирующий файл.\n");
return 1;
}
char buf[255],c; // Буфер для чтения символов
while(!feof(f)) // Пока не конец файла
{
fgets(buf, 255, f); // Читаем целиком строку
cur_i=0;
while ( !(buf [cur_i]=='\n') )
{
if (buf[cur_i]!=sgn)
{
fprintf(out,"%c",buf[cur_i]);
printf("%c",buf[cur_i]);
cur_i++;
} else
{
for (int j=0; j<(buf[cur_i+2]); j++)
{
fprintf(out,"%c",buf[cur_i+1]);
printf("%c",buf[cur_i+1]);
}
cur_i+=3;
}
}
cur_i=0;
if (!feof(f)) fprintf(out,"\n");
printf("\n");
buf[0]='\n';
}
printf("\nРасжатие закончено!");
fclose(out);
fclose(f);
getch();
return 0;
}
4.Результати роботи програми:В результаті роботи програми отримали файл, що стиснуто з коєфіцієнтом 1478/1534 * 100 = 96%. Розархівування дало файл, який повністю співпадає з оригіналом до архивування.
Висновок: розробили i налагодили програми, які виконують стиснення iнформацiї (архiвування). У якостi iнформацiї використовували копiю файлу з розробленою програмою. Розрахунок ступеню стиснення, та програма повернення архiвного файлу до початкового вигляду(розархiвування).
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.