Автор работы: Пользователь скрыл имя, 28 Мая 2013 в 18:23, курсовая работа
Цель данной курсовой работы написать с помощью Delphi программу - блочные коды постоянного смещения. Блочные коды постоянного смещения задаются начальной длиной кодового слова и величиной, на которую увеличивается длина кодового слова в каждом блоке. Сжатие происходит при выполнении следующего условия: длина кодового слова в начальном блоке - 3; смещение – 2.
Задание 3
1 Краткое описание используемых алгоритмов и архитектуры программы
1.1 Построение таблицы кодовых слов 4
1.2 Описание алгоритмов, используемых в программе 6
1.3 Алгоритмы сжатия и восстановления файлов 7
2 Краткая инструкция пользователю по работе с программой 8
3 Результаты тестирования 10
Заключение 11
Приложение А. Код программы 12
Приложение Б. Таблица кодовых слов 18
Министерство образования и науки РФ
Федеральное государственное
бюджетное образовательное
«Ярославский государственный технический университет»
Кафедра «Информационные системы и технологии»
Курсовая работа защищена
с оценкой (_________)
Руководитель
доцент, к.т.н
(________) Раухваргер А.Б.
“___”_________ 2013 г.
РАЗРАБОТКА ПРОГРАММЫ СЖАТИЯ ФАЙЛОВ С ПОМОЩЬЮ БЛОЧНОГО КОДА
Расчетно-пояснительная записка к курсовой работе
по дисциплине “Теория информационных процессов и систем”
ЯГТУ 230201.65-21 КР
Нормоконтролер Работу выполнила
доцент, к.т.н студентка гр. ЭИС-44
(______) Раухваргер А.Б. (______) Паишева Е.В.
“___”________ 2013 г.
2013
Содержание
Задание 3
1 Краткое описание используемых
алгоритмов и архитектуры
1.1 Построение таблицы кодовых слов 4
1.2 Описание алгоритмов, используемых в программе 6
1.3 Алгоритмы сжатия и восстановления файлов 7
2 Краткая инструкция
3 Результаты тестирования 10
Заключение 11
Приложение А. Код программы
Приложение Б. Таблица кодовых слов 18
Задание
Цель данной курсовой работы написать с помощью Delphi программу - блочные коды постоянного смещения. Блочные коды постоянного смещения задаются начальной длиной кодового слова и величиной, на которую увеличивается длина кодового слова в каждом блоке. Сжатие происходит при выполнении следующего условия: длина кодового слова в начальном блоке - 3; смещение – 2.
1 Краткое описание используемых алгоритмов и архитектуры программы
1.1 Построение таблицы кодовых слов
Для построения таблицы кодовых слов я использовала алгоритм сжатия с помощью блочного кода с постоянным смещением. Смысл данного метода в том, что таблица кодовых слов состоит из блоков слов постоянной длины; задана наименьшая длина кодового слова, а также смещение (увеличение длины кодового слова следующего блока по сравнению с предыдущим). Самыми короткими словами (словами начальной длины) кодируются наиболее частые байты сжимаемого файла (для этого байты файла сортируются по убыванию количества повторений). Количество кодовых слов в блоке (n) определяется формулой nk=2l0-1+k(h-1), где k - порядковый номер блока, l0 - начальная длина кодового слова, h - смещение.
Строю таблицу кодовых слов для своего варианта.
Начальная длина кодового слова l0= 3, смещение h=2.
n0=23-1=4 - количество кодовых слов нулевого (начального) блока. Блок будет состоять из кодовых слов:
111
110
101
100
n1=23-1+2-1=8 - количество кодовых слов следующего блока. Начиная с этого блока кодовые слова, будут формироваться путем добавления нулей и единиц в начало и конец слов предыдущего блока, например:
01111
01101
01011
01001
…
Главное, чтобы начала кодовых слов в таблице не повторялись.
n2=23-1+2=16 - количество кодовых слов следующего блока.
0011111
0011011
0010111
0010011
…
n3=23-1+3(2-1)=32 - количество слов следующего блока:
000111111
000111110
000111101
000111100
…
n4=26=64 - количество слов следующего блока:
00001111111
00001111110
00001111101
00001111100
….
n5=27=128 - количество слов следующего блока:
0000011111111
0000011111110
0000011111101
0000011111100
…
n6=28=256 - количество слов последнего блока, а так как мне требуется всего 256 кодовых слов (0-255), для кодирования байт файла я беру 4 первых строчки. Продолжаю строить таблицу кодовых слов.
000000111111111
000000111111110
000000111111101
000000111111100
Полную версию таблицы кодовых слов можно посмотреть в приложении Б.
1.2 Описание алгоритмов, используемых в программе
Алгоритмы преобразования строки в байт и обратно
Так как преобразования подобного типа с использованием арифметических операций (в частности деления и умножения) сильно тормозит работу программы, я использую логические операции и сдвиги бит в байте.
Преобразование из string в byte: мне дано некоторое строковое значение бит байта. Беру нулевой байт (00000000), в цикле от 1 до 8 (в байте 8 бит) сдвигаю биты влево и сравниваем их поочередно с символами в строке с помощью логической операции or ("или", логическое сложение) - в логических операциях принимает участие только последний бит байта.
Преобразование из byte в string: мне дано некоторое значение байта. В цикле от 0 до 7 сравниваю заданный байт с единичным, который сдвигается на текущий шаг, при помощи логической операции and ("и", логическое умножение) - если результат сравнения равен 0, то в начало строкового буфера записывается '0', иначе '1'.
Алгоритм сортировки "Пузырек"
Сортировка простыми обменами, сортировка пузырьком — простой алгоритм сортировки. Для понимания и реализации этот алгоритм — простейший, но эффективен он лишь для небольших массивов.
Алгоритм состоит из повторяющихся проходов по сортируемому массиву. За каждый проход элементы последовательно сравниваются попарно и, если порядок в паре неверный, выполняется обмен элементов. Проходы по массиву повторяются N-1 раз или до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны, что означает — массив отсортирован. При каждом проходе алгоритма по внутреннему циклу, очередной наибольший элемент массива ставится на своё место в конце массива рядом с предыдущим наибольшим элементом, а наименьший элемент перемещается на одну позицию к началу массива («всплывает» до нужной позиции как пузырёк в воде, отсюда и название алгоритма).
1.3 Алгоритмы сжатия и восстановления файлов
Алгоритм с использованием блочного кода, в отличие от алгоритмов Шеннона и Хаффмана, имеет фиксированную таблицу кодовых слов. Поэтому удобно хранить ее непосредственно в программе. В моем случае это организовано через компонент ListBox, в который таблица кодовых слов подгружается из текстового файла с таблицей, созданной заранее (слова упорядочены по возрастанию длины).
Краткое описание алгоритма сжатия:
1.программа считывает байты из файла (процедура blockread), подсчитываем количество повторений в файле для каждого байта;
2. с помощью алгоритма
сортировки данных "пузырек"
упорядочивает байты по
3. байтам с наибольшей
частотой повторений будут
4. формируется таблица
соответствий байтов кодовым
словам (реализовано с помощью
массива из записей типа TTable
5. формируется строка кодовых слов, заменяя байты файла соответствующими кодовыми словами;
6. далее программа разбивает строку на восьмерки символов и описанным ранее методом перевода из строки в байт записывает (процедура blockwrite), новые байты в файл (последний байт "добивается нулями", если длина строки не кратна 8);
7. в конце, записывает
последний байт файла,
Краткое описание алгоритма восстановления:
1. программа считывает байты из файла (процедура blockread),;
2. формируется таблица соответствий кодовых слов байтам исходного файла (используем первые 256 байт сжатого файла - сохраненную последовательность байт исходного);
3. определяется количество
"нулей добивания" - это значение
последнего байта сжатого
4. при помощи рассмотренного выше метода перевода из байта в строку формируется буферная строка кодовых слов;
5. в завершении с помощью процедуры blockwrite записывается в файл последовательность байт, соответствующих кодовым словам в буферной строке
2 Краткая инструкция пользователю по работе с программой
После запуска программы вы увидите:
Рисунок 1 – Интерфейс программы
Нажав на кнопку «Архивировать» откроется окно, в котором вы сможете выбрать файл дл работы с ним.
Рисунок 2 – Открытие файла
После открытия файла программа выполняет данную операцию:
Рисунок 3 – Архивируем файл
Рисунок 4 – Завершение архивации файла
Для восстановления требуется нажать кнопку «Разархивировать», тогда откроется окно, в котором вы сможете выбрать файл для работы с ним.
Рисунок 5 – Окно завершения восстановления
Так же следует указать, что файлы после обработки сохраняются в той же директории, в которой находились исходные и будут иметь расширение *.blc .
3 Результаты тестирования программы
Я протестировала свою программу на различных типах файлов, использовались разнообразные форматы, такие как: текстовые, графические, мультимедийные и другие.
Проведем сравнение файлов до и после сжатия:
Из полученных данных видим, что некоторые форматы файлов сжимаются лучше, некоторые хуже. Прежде всего, связано это с тем, что некоторые форматы файлов имеют встроенное сжатие, а так же с тем, что в некоторых форматах хранится однотипная информация, которая эффективно поддается сжатию.
Заключение
В ходе курсовой работы мной была разработана программа для сжатия и восстановления файлов, основой, которой является алгоритм блочного кода с постоянным смещением, так же были составлены алгоритмы преобразования данных из типа string в тип byte и наоборот. Я провела тестирование программы и поняла, что использованный метод сжатия не является эффективным, так как данным методом можно успешно сжимать только текстовые файлы или мультимедийные файлы высокого качества без потерь, но коэффициенты сжатия при этом довольно низкие.
Приложение А. Код программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
ProgressBar1: TProgressBar;
ProgressBar2: TProgressBar;
OpenDialog1: TOpenDialog;
ListBox1: TListBox;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type TableByte=record
ind:byte;
code:string;
end;
var
Form1: TForm1;
filereading,filewriting:File;
path, buffer, stroka, strbuffer, narstr:string;
s,i,j,b2,b,k,dlina,proc,proc2,
buf, bt:byte;
bytebase:array of byte;
indexes:array [0..255] of byte;
massiv:array [0..255] of integer;
table:array [0..255] of TableByte;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); //архивировать
begin
if OpenDialog1.Execute then //открытие файла
begin
for i:=0 to 255 do // присвоение начальных значений массиву частот
begin
indexes[i]:=i;
massiv[i]:=0;
table[i].code:='';
end;
path:=OpenDialog1.FileName; // привязка файла
assignfile(filereading,path); // связываем файл с файл.переменной
reset(filereading,1); //открываем файл для чтения по байтно
k:=0; // обнуление счетчиков
proc:=0;
Progressbar1.Position:=0; // начальные значения прогресс-баров
Progressbar2.Position:=0;
dlina:=filesize(filereading);
setlength(bytebase,dlina);
while not eof(filereading) do // считываем байты, количество повторов(пока не конец файла)
begin
blockread(filereading,buf,1); //производим считывание и запись из файла в буфер
bytebase[k]:=buf;
massiv[buf]:=massiv[buf]+1; //индекс в массиве равен значению считываемого файла
inc(k);
if proc<>100 then
proc:=((k*100) div dlina); // описание прогреесс бара
ProgressBar1.Position:=proc;
end;
closefile(filereading); //закрываем
Информация о работе Разработка программы сжатия файлов с помощью блочного кода