Розробка програми стиснення iнформацiї та повернення до початкового стану без втрат

Страницы работы

Содержание работы

МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ

«ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ»

Лабораторна робота №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вування).

Похожие материалы

Информация о работе