Компрессия текстовой информации зонным методом

Алгоритм компрессии текстовых сообщений зонным методом. Программа на языке DELPHI5.0, позволяет осуществлять ввод текстовых данных пользователем, считывать их из специальных текстовых файлов, кодировать сообщение, вычисление коэффициента компрессии.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 09.03.2009
Размер файла 125,8 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

2

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовому проекту

по теме "Компрессия текстовой информации зонным методом"

по дисциплине "Кодирование и защита информации"

2004

Аннотация

В данном документе описывается алгоритм компрессии текстовых сообщений зонным методом. Программа написана на языке DELPHI5.0 и позволяет осуществлять ввод текстовых данных непосредственно пользователем, либо считывать их из специальных текстовых файлов (с расширением .txt), кодировать или декодировать сообщение, используя одну из четырех таблиц (для русского алфавита, английского, русского с цифрами, английского с цифрами), а также вычисление коэффициента компрессии. По желанию пользователя кодирование (декодирование) может производиться либо с учетом регистра символов, либо без него. Предусмотрена возможность создания новых файлов и сохранение, как текстов, так и их кодов для работы с ними в дальнейшем.

Данная пояснительная записка содержит следующие разделы:

введение;

теоретическое обоснование метода в сравнении с другими методами;

структурная схема алгоритма и его описание;

заключение;

библиографический список;

приложение:

Текст программы;

Тестовый пример;

Руководство пользователя.

Содержание

Введение

1. Теоретическое обоснование метода в сравнении с другими методами

2. Структурная схема алгоритма и его описание

Заключение

Библиографический список

Приложение

Введение

Повышение эффективности существующих систем передачи и хранения информации сравнительно просто и с минимальными затратами достигается путем использования методов сжатия (компрессии) сообщений. В процессе сжатия информации производится уменьшение объема исходного сообщения за счет устранения естественной избыточности, присущей практически всем источникам информации. В связи с тем, что компрессия в настоящее время осуществляется преимущественно программным способом, при ее внедрении не требуется дополнительно изменять действующие каналы передачи, системы записи и носители информации. Это обстоятельство играет особую роль, так как в пользовании находится большое число технических средств передачи и хранения информации, срок службы которых далеко не исчерпан, а их замена требует немалых средств.

Впервые метод сжатия текстовых сообщений был разработан основоположниками теории информации К. Шенноном и Р. Фано в 1948 г. Ими было предложено кодировать символы сообщений неравномерным кодом, причем длина кодовой комбинации зависит от вероятности появления символа в сообщении. Этот код получил название кода Шеннона-Фано. Второй важнейшей вехой в области сжатия информации явилась работа Д. Хаффмена, опубликованная в 1952 г. в ней предложен метод построения оптимального неравномерного кода, обеспечивающего минимальную длину закодированного сообщения. Коды Шеннона-Фано и Хаффмена относятся к классическим методам сжатия сообщений, на основе которых возникло множество других алгоритмов компрессии. Классические методы сжатия предполагают, что в процессе передачи или записи информации на носитель таблица кодирования остается неизменной, в связи с чем их можно отнести к статическим методам сжатия сообщений.

Неравномерные коды с момента их появления длительное время не находили широкого применения на практике в связи с трудностями технической реализации. Взамен их были разработаны упрощенные методы сжатия, использующие наличие в текстовых и графических сообщениях повторяющихся символов, их групп и целых строк. Эти методы не обеспечивали оптимального сжатия, но были достаточно эффективны и просты в реализации. Один из них, зонный метод, описывается в данном документе.

1. Теоретическое обоснование метода в сравнении с другими методами

Метод зонного сжатия обычно используется для текстов на естественном алфавите и учитывает статистику появления того или иного символа в тексте как самого по себе так и в сочетаниях. Все буквы располагаются по зонам и группам и кодированию подлежат номера зоны и подгруппы. Алфавит считается шестнадцатеричным и байт разбивается на полубайты. Часть используется как код буквы, часть как код зоны. Для русского алфавита чаще используется тринадцать кодов для букв и три - для кодов зон. Если необходимо увеличить алфавит, то уменьшают число букв и увеличивают число зон. Компрессия происходит за счет того, что очень часто подряд стоящие буквы попадают в одну зону - код зоны пишется один раз до следующей зоны.

Зонный метод можно использовать и для числовых массивов, если числа представить буквами некоторого алфавита.

Преимуществом данного метода в простоте его реализации, однако большим недостатком является малый коэффициент сжатия (компрессии). В идеальном случае он стремится к 0,5 (коэффициент компрессии соответственно к 2). В сравнении с некоторыми другими методами эти показатели очень низки и поэтому зонный метод в настоящее время практически не используется для сжатия текстовых сообщений.

Виды таблиц, использующихся при кодировании (декодировании) данной программой приведены ниже (таблицы 1.1 - 1.4).

Таблица 1.1 - Коды и зоны для символов русского алфавита

Зона D

Зона E

Зона F

Код буквы

Буква

Код буквы

Буква

Код буквы

Буква

0

0

З

0

Ц

1

О

1

У

1

Ж

2

Е

2

Д

2

Х

3

А

3

Я

3

Ч

4

Р

4

Ь

4

Э

5

П

5

Ф

5

Ю

6

Т

6

Ы

6

.

7

Н

7

Щ

7

,

8

В

8

Ш

8

;

9

И

9

Б

9

:

A

С

A

Д

A

!

B

М

B

К

B

?

C

Л

C

й

C

-

Таблица 1.2 - Коды и зоны для символов английского алфавита

Зона E

Зона F

Код буквы

Буква

Код буквы

Буква

0

0

Q

1

D

1

R

2

E

2

U

3

I

3

W

4

K

4

X

5

L

5

Y

6

M

6

Z

7

N

7

F

8

O

8

G

9

P

9

H

A

S

A

J

B

B

B

T

C

C

C

V

D

A

C

Таблица 1.3 - Коды и зоны для символов русского алфавита и цифр

Зона C

Зона D

Зона Е

Зона F

Код буквы

Буква

Код буквы

Буква

Код буквы

Буква

Код буквы

Буква

1

1

З

1

Ц

1

.

2

О

2

У

2

Ж

2

,

3

Е

3

Д

3

Х

3

0

4

А

4

Я

4

Ч

4

1

5

Р

5

Ь

5

Э

5

2

6

П

6

Ф

6

Ю

6

3

7

Т

7

Л

7

Ы

7

4

8

Н

8

Щ

8

Й

8

5

9

В

9

Ш

9

;

9

6

0

И

0

Б

0

:

0

7

A

С

A

Г

A

!

A

8

B

М

B

К

B

?

B

9

Таблица 1.4 - Коды и зоны для символов английского алфавита и цифр

Зона D

Зона Е

Зона F

Код буквы

Буква

Код буквы

Буква

Код буквы

Буква

1

1

Q

1

0

2

T

2

R

2

1

3

A

3

S

3

2

4

C

4

U

4

3

5

D

5

W

5

4

6

E

6

X

6

5

7

F

7

Y

7

6

8

K

8

V

8

7

9

L

9

B

9

8

0

M

0

J

0

9

A

N

A

H

A

Z

B

O

B

I

B

.

С

P

С

J

С

,

2. Структурная схема алгоритма и его описание

Рисунок 2.1 - Структурная схема функции Poisk

Рисунок 2.2 - Структурная схема процедуры Coder

Рисунок 2.3 - Структурная схема функции PoiskZ

Рисунок 2.4 - Структурная схема функции PoiskS

Рисунок 2.5 - Структурная схема процедуры DeCoder

Рисунок 2.6 - Структурная схема процедуры IndexOfCompress

Процедура кодирования текстовой информации (Coder) содержит следующие переменные:

F: TextFile;{файловая переменная}

S: String; {переменная для работы со строкой}

I: Integer; {счетчик}

Z: String[1]; {имя зоны}

LastZ: String[1]; {имя зоны последнего символа}

StrBig: String; {строка с признаками регистра символов}

StrText: String; {текс, подлежащий кодированию}

StrCod: String; {код, полученный в результате кодирования}

Num: Integer; {номер текущего символа в таблице}, а также функцию Poisk(ch: string; var StrBig: String):Integer, которая осуществляет поиск текущего символа из текста в одной из выбранных таблиц по которым производится кодирование. Ее аргументы:

ch - текущий символ;

StrBig - строка с признаками регистра символов.

Функция возвращает номер места, которое занимает текущий символ в кодовой таблице. Если такового символа нет - возвращает ноль. Ниже приведено поблочное описание функции Poisk (см. рисунок 2.1):

Блок №1: задается начальное значение I равное единице.

Блок №2: проверка какой алфавит выбран - русский или английский.

Если выбран русский - переход на блок №3, иначе - на блок №4.

Блок №3: в ChUp записывается первый символ из таблицы в верхнем регистре (для русских шрифтов).

Блок №4: в ChUp записывается первый символ из таблицы в верхнем регистре (для английских шрифтов).

Блок №5: пока символ Ch или символ СhUp не будут найдены в кодовой таблице (и пока просмотр таблицы не завершен - то есть данного символа в таблице может не быть) выполняются блоки №6-9.

Блок №6: увеличение счетчика I на единицу.

Блок №7: если выбран русский алфавит - то перход к блоку №8, иначе - к блоку №9.

Блок №8: в ChUp записывается I-ый символ из таблицы в верхнем регистре (для русских шрифтов).

Блок №9: в ChUp записывается I-ый символ из таблицы в верхнем регистре (для английских шрифтов).

Блок №10: если символ Ch совпадает с символом ChUp (то есть записан в верхнем регистре), то переход к блоку №11, иначе - к блоку №12.

Блок №11: запись в строку признака регистра символа единицы.

Блок №12: запись в строку признака регистра символа нуля.

Блок №13: если счетчик меньше 65-ти (то есть символ был обнаружен в кодовой таблице), то переход к блоку №14, иначе - к блоку №15.

Блок №14: функции присваивается номер поля из кодовой таблицы, в котором найден символ.

Блок №15: функции присваивается ноль - символ не найден.

Ниже приведено поблочное описание процедуры Coder (см. рисунок 2.2):

Блок №1: подготовка файла к чтению.

Блок №2: начальное значение счетчика I=1 и зоны Z=''.

Блок №3: если не конец файла, то выполняются блоки №4-№9, иначе - блок №10.

Блок №4: считывание очередной строки (S) из файла.

Блок №5: если S[2]<>'-', то переход на блок №6, иначе - блок №10.

Блок №6: если S[2]='З', то переход на блок №7, иначе - блоки №8,9.

Блок №7: запись зоны из файла в переменную Z.

Блок №8: заполнение полей массива Tabl[i] - Litera, Zona, Cod - из файла.

Блок №9: следующее значение i.

Блок №10: начальные значения переменных StrBig, StrText, StrCod - пустые строки.

Блок №11: начальное значение LastZ - пустой символ. В переменную StrText записывается текст, подлежащий кодированию.

Блок №12: организация цикла с количеством итераций от i=1 до длины текста.

Блок №13: переменной Num присваивается значение, возвращаемое функцией Poisk.

Блок №14: если значение Num равно нулю, то переход к блоку №15, иначе к блоку №16.

Блок №15: в строки кода и признака регистра добавляется признак неизвестного символа - `<?>'.

Блок №16: в переменной Z сохраняется зона текущего символа.

Блок №17: если зона Z не совпадает с последней использовавшейся зоной - LastZ, то выполняется блок №18, иначе - блок №19.

Блок №18: в строку кода записывается зона, в которой находится текущий символ. Данная зона запоминается как последняя использованная в переменной LastZ.

Блок №19: в строку кода приписывается код текущего символа.

Блок №20: если необходимо учитывать регистр символов при кодировании (декодировании), то выполняется блок №21, иначе - не выполняется.

Блок №21: к строке кода приписывается строка признаков регистра символов.

Процедура декодирования (DeCoder) содержит следующие переменные:

F: TextFile; {файловая переменная}

S: String; {переменная для работы со строками}

I: Integer; {счетчик}

N: Integer; {длина строки}

Num: Integer; {номер}

Z: String[1]; {имя зоны}

LastZ: String[1]; {имя последней зоны}

StrText: String; {строка исходного текста}

StrCod: String; {строка кода}

StrBig: String; {строка признаков регистра символов}
и две функции - PoiskZ(ChZ: String): Boolean и PoiskS(ChC, LastZ, StrBig: String; Num: Integer): String, где:

ChZ: имя зоны;

ChC: символ;

LastZ: имя последней зоны;

StrBig: строка признаков регистра;

Num: номер символа;

Функция PoiskZ возвращает True, если символ кода является зоной и False - если символ кода не является зоной.

Функция PoiskS возвращает символ по его коду.

Ниже приведено поблочное описание функции PoiskZ(см. рисунок 2.3):

Блок №1: задание начальных значений переменных - i=0, PoiskZ=True.

Блок №2: если символ Ch неравен i-му имени зоны из кодовой таблицы и поле таблицы не последнее, то выполняется блок №3, иначе - переход к блоку №4.

Блок №3: следующее значение i.

Блок №4: если i>65, то символ не является зоной и выполняется блок №5, иначе зона определена и блок №5 пропускается.

Блок №5: присвоение функции PoiskZ значения False.

Ниже приведено поблочное описание функции PoiskS(см. рисунок 2.4):

Блок №1: обнуление начальных значений переменных: i=0, PoiskS=''.

Блок №2: пока символ ChC не совпадет с кодом Tabl[i].Cod из кодовой таблицы и зона из этой таблицы не совпадет с последней кодовой зоной LastZ, а также пока не перебраны все поля таблицы выполняются блоки №3-8, иначе - переход к блоку №9.

Блок №3: следующее значение I.

Блок №4: если учитывается регистр символов и в переменоой StrBig i-ое значение равно единице, то переход на блок №6, иначе выполняется блок №5.

Блок №5: функция PoiskS принимает значение i-го символа Tabl[i].Litera из кодовой таблицы.

Блок №6: если используется русский алфавит, то выполняется блок №7, иначе - блок №8.

Блок №7: перевод русского символа в верхний регистр.

Блок №8: перевод английского символа в верхний регистр.

Блок №9: если вся таблица просмотрена, а символ не найден, то выполняется блок №10, иначе блок №10 пропускается.

Блок №10:функции PoiskS присваивается символ неопределенности: `<?>'.

Ниже приведено поблочное описание процедуры DeCoder (см. рисунок 2.5):

Блок №1: подготовка файла к чтению.

Блок №2: начальные значения - i=1, Z=''.

Блок №3: пока не конец файла выполняются блоки №№3-9, иначе переход к блоку №10.

Блок №4: считывание очередной строки S из файла.

Блок №5: если S[2]<>'-`, то выполняется блок №6, иначе - переход к блоку №10.

Блок №6: если S[2]='З', то выполняется блок №7, иначе - блок №8.

Блок №7: запись зоны из файла в переменную Z.

Блок №8: заполнение полей таблицы Tabl[i] - Litera, Zona, Cod.

Блок №9: следующее значение i.

Блок №10: в StrText помещается пустая строка, а в StrCod - кодовая комбинация.

Блок №11: определение последней использовавшейся зоны - LastZ, длины кодовой комбинации - N и номера символа - Num.

Блок №12: если необходимо учесть регистр символа, то выполняется блок №13, иначе - переход к блоку №17.

Блок №13: пока StrCod<>'>' выполняется блок №14.

Блок №14: если StrCod='1' или '0', то выполняются блоки №№15,16, иначе - они пропускаются.

Блок №15: в строку признаков регистра символа записывается N-ое значение кодовой последовательности.

Блок №16: уменьшить N на единицу.

Блок №17: организация цикла от i=2 до N для блоков №№18-21.

Блок №18: если PoiskZ=True, товыполняется блок №19, иначе - блок №20.

Блок №19: в переменной LastZ сохраняется i-ое значение кодовой последоватльности StrCod.

Блок №20 следующее значение Num.

Блок №21: в строку декодированного текста приписывается очередной декодированный символ.

Блок №22: вывод декодированного текста.

Процедура подсчета коэффициента компрессии IndexOfCompress1Click представлена на рисунке 2.6. Ниже приведено ее поблочное описание:

Блок №1: если текст кода и исходный текст не пустые, то выполняются блоки №№2-4, иначе выполняется блок №5.

Блок №2: если регистр символов не учитывается, то выполняется блок №3, иначе - блок №4.

Блок №3: расчет коэффициента компрессии производится по формуле: (длина исходного текста)/(длина кодовой последовательности/2) {предполагается, что символ исходного текста занимает 1 байт, а символ кодовой последовательности 0,5 байта}.

Блок №4: расчет коэффициента компрессии производится по формуле: (длина исходного текста)/(длина кодовой последовательности/2 + длина строки признаков регистра/8) {предполагается, что символ исходного текста занимает 1 байт, символ кодовой последовательности - 0,5 байта, а символ строки признаков регистра - 1 бит}.

Блок №5: выдача сообщения о невозможности подсчета коэффициента компрессии.

Заключение

В процессе компрессии данных устраняется естественная избыточность источника информации, а при декомпрессии, перед выдачей данных потребителю, происходит восстановление исходного сообщения.

Процесс исторического развития методов сжатия сообщений характеризуется реализацией вначале простейших методов, которые позволяли сокращать объем сообщения за счет кодирования групп одинаковых символов, либо выделения повторяющихся групп символов и фраз и заменой их определенными кодовыми комбинациями.

На основе фундаментальных исследований в теории информации, проведенных К. Шенноном, Р. Фано, Р.Е. Кричевским и другими, были разработаны методы кодирования источников информации, которые стали классическими. В процессе реализации этих методов вначале создается модель сообщения, а затем осуществляется кодирование безизбыточными кодами. При этом модель до завершения компрессии остается неизменной. Такие методы образуют группу статических методов сжатия информации.

Простейшие способы сжатия данных широко применялись в качестве самостоятельных процедур в конце 70-х - середине 80-х годов для архивации данных и в коммуникационных системах. Однако они не позволяют полностью использовать избыточность источника сообщений, что ограничивает их самостоятельное применение.

Библиографический список

Чернега В.С. Сжатие информации в компьютерных сетях: учебное пособие для вузов: Под. ред. д.т.н., проф. В. К. Маригодова.- Севастополь.:“СевГТУ”,1997.-214 с.:ил.

Цымбал В. П. Теория информации и кодирование. Киев,”Вища школа”, 1997, 288 с.

Конспект лекций по дисциплине “Кодирование и защита информации”.

Приложение

Текст программы

program Zones_Compress;

Forms,

Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.Run;

end.

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Buttons, Menus, ComCtrls, ExtCtrls;

type

TForm1 = class(TForm)

MainMenu1: TMainMenu;

OpenDialog1: TOpenDialog;

File1: TMenuItem;

Open1: TMenuItem;

Saveas1: TMenuItem;

Exit1: TMenuItem;

RichEdit1: TRichEdit;

Casecodetable1: TMenuItem;

Aboutmethod1: TMenuItem;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

N4: TMenuItem;

Help1: TMenuItem;

Aboutmethod2: TMenuItem;

Showcode1: TMenuItem;

Indexofcompress1: TMenuItem;

RichEdit2: TRichEdit;

Label1: TLabel;

Label2: TLabel;

Bevel1: TBevel;

Bevel2: TBevel;

Bevel3: TBevel;

BitBtn1: TBitBtn;

Label3: TLabel;

SaveDialog1: TSaveDialog;

Savecodeas1: TMenuItem;

New1: TMenuItem;

Label5: TLabel;

Aboutprogramm1: TMenuItem;

Opencode1: TMenuItem;

Showtext1: TMenuItem;

Bevel4: TBevel;

IgnoreUpCase1: TMenuItem;

WithUpCase1: TMenuItem;

IgnoreUpCase2: TMenuItem;

WithUpCase2: TMenuItem;

procedure Exit1Click(Sender: TObject);

procedure New1Click(Sender: TObject);

procedure N1Click(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure N3Click(Sender: TObject);

procedure N4Click(Sender: TObject);

procedure Open1Click(Sender: TObject);

procedure Saveas1Click(Sender: TObject);

procedure Indexofcompress1Click(Sender: TObject);

procedure Savecodeas1Click(Sender: TObject);

procedure Opencode1Click(Sender: TObject);

procedure RichEdit1Change(Sender: TObject);

procedure RichEdit2Change(Sender: TObject);

procedure IgnoreUpCase2Click(Sender: TObject);

procedure WithUpCase2Click(Sender: TObject);

procedure IgnoreUpCase1Click(Sender: TObject);

procedure WithUpCase1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

{определение кодовой таблицы}

Pole = record

Zona : String[1];

Litera : String[1];

Cod : String[1];

end;

var

Form1: TForm1;

Tabl: array[1..64]of Pole;

implementation

{$R *.DFM}

procedure TForm1.Exit1Click(Sender: TObject);

begin

close;

end;

procedure TForm1.New1Click(Sender: TObject);

begin

Label1.Enabled := True;

Label2.Enabled := False;

Label5.Visible := False;

SaveCodeAs1.Enabled := False;

Label3.Enabled := False;

IndexOfCompress1.Enabled := False;

RichEdit1.Lines.Clear;

RichEdit2.Lines.Clear;

RichEdit2.ReadOnly:= True;

RichEdit1.ReadOnly := False;

ShowText1.Enabled := False;

ShowCode1.Enabled := True;

end;

procedure TForm1.N1Click(Sender: TObject);

begin

n1.Checked:=true;

end;

procedure TForm1.N2Click(Sender: TObject);

begin

n2.Checked:=true;

end;

procedure TForm1.N3Click(Sender: TObject);

begin

n3.Checked:=true;

end;

procedure TForm1.N4Click(Sender: TObject);

begin

n4.Checked:=true;

end;

procedure TForm1.Open1Click(Sender: TObject);

var F: TextFile;

begin

RichEdit2.Lines.Clear;

Label1.Enabled := True;

Label2.Enabled := False;

Label5.Visible := False;

SaveCodeAs1.Enabled := False;

IndexOfCompress1.Enabled := False;

Label3.Enabled := False;

RichEdit1.ReadOnly := False;

RichEdit2.ReadOnly := True;

ShowCode1.Enabled := True;

ShowText1.Enabled := False;

OpenDialog1.Filter:='Текстовые файлы|*.txt|Все файлы|*.*|';

if OpenDialog1.Execute and FileExists(OpenDialog1.FileName)

then

begin

AssignFile(F,OpenDialog1.FileName);

Reset(F);

RichEdit1.Lines.Clear;

RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);

CloseFile(F);

end;

end;

procedure TForm1.Saveas1Click(Sender: TObject);

begin

SaveDialog1.Filter:='Текстовые файлы|*.txt|';

if SaveDialog1.Execute

then

RichEdit1.Lines.SaveToFile(SaveDialog1.FileName);

end;

procedure TForm1.Indexofcompress1Click(Sender: TObject);

var i:integer;

begin

Label3.Enabled := True;

Label5.Visible := True;

If (Length(RichEdit1.Lines.GetText)<>0)

and (Length(RichEdit2.Lines.GetText)<>0)

then

Begin

If Form1.IgnoreUpCase2.Checked or

Form1.IgnoreUpCase1.Checked then

Label5.Caption:='K = '+

FloatToStr(Length(RichEdit1.Lines.GetText)/

(Length(RichEdit2.Lines.GetText)/2));

If Form1.WithUpCase2.Checked or

Form1.WithUpCase1.Checked then

Begin

i:=Length(RichEdit2.Lines.GetText);

While (RichEdit2.Lines.Text[i]<>'>')do dec(i);

i:=Length(RichEdit2.Lines.GetText)-i;

Label5.Caption:='K = '+

FloatToStr(Length(RichEdit1.Lines.GetText)/

((Length(RichEdit2.Lines.GetText)-i-10)/2+(i-2)/8));

end

end

else Label5.Caption:='Expected';

end;

procedure TForm1.Savecodeas1Click(Sender: TObject);

begin

SaveDialog1.Filter:='Текстовые файлы|*.txt|';

if SaveDialog1.Execute

then

RichEdit2.Lines.SaveToFile(SaveDialog1.FileName);

end;

procedure TForm1.Opencode1Click(Sender: TObject);

var F: TextFile;

begin

RichEdit1.Lines.Clear;

Label1.Enabled := False;

Label2.Enabled := True;

Label5.Visible := False;

SaveCodeAs1.Enabled := True;

IndexOfCompress1.Enabled := False;

Label3.Enabled := False;

ShowCode1.Enabled := False;

ShowText1.Enabled := True;

RichEdit1.ReadOnly := True;

RichEdit2.ReadOnly := False;

OpenDialog1.Filter:='Текстовые файлы|*.txt|Все файлы|*.*|';

if OpenDialog1.Execute and FileExists(OpenDialog1.FileName)

then

begin

AssignFile(F,OpenDialog1.FileName);

Reset(F);

RichEdit2.Lines.Clear;

RichEdit2.Lines.LoadFromFile(OpenDialog1.FileName);

CloseFile(F);

end;

end;

procedure DeCoder;

function PoiskZ(ChZ:string):Boolean;

var i:integer;

Begin

i:=0;

PoiskZ:=True;

while (ChZ<>Tabl[i].Zona)and(i<65) do inc(i);

If i>=65 then PoiskZ:=False;

End;

function PoiskS(ChC,LastZ,StrBig:string;Num:Integer):string;

var i:integer;

Begin

i:=0;

PoiskS:='';

while not((ChC=Tabl[i].Cod)and(Tabl[i].Zona=LastZ))

and(i<65) do

begin

inc(i);

If (Form1.WithUpCase1.Checked)and(StrBig[Num]='1')then

Begin

if Form1.N1.Checked or Form1.N3.Checked then

PoiskS := chr(ord(tabl[i].litera[1])-32);

if Form1.N2.Checked or Form1.N4.Checked then

PoiskS:=UpCase(Tabl[i].Litera[1]);

end

else PoiskS:=Tabl[i].Litera;

end;

If (i>=65) then PoiskS:='<?>';

End;

var F: TextFile;

S: String;

i: Integer;

N: Integer;

Num: Integer;

Z: String[1];

LastZ: String[1];

StrText: String;

StrCod: String;

StrBig: String;

begin

If length(Form1.RichEdit2.Lines.Text)<>0 then

begin

Form1.Label1.Enabled := True;

S:='a:\Вова\CodeTab\Tab';

If Form1.N1.Checked then S:=S+'1.txt'

else If Form1.N2.Checked then S:=S+'2.txt'

else If Form1.N3.Checked then S:=S+'3.txt'

else S:=S+'4.txt';

Form1.RichEdit1.Lines.Clear;

for i:=1 to 64 do

begin

Tabl[i].Zona := '';

Tabl[i].Litera := '';

Tabl[i].Cod := '';

end;

AssignFile(F,S);

Reset(f);

i:=1;

ReadLn(F,S);

ReadLn(F,S);

ReadLn(F,S);

Z:='';

While not eof(F) do

Begin

ReadLn(F,S);

If S[2]<>'-' then

If S[2]='З' then Z := S[7]

else

Begin

Tabl[i].litera := S[12];

Tabl[i].zona := Z;

Tabl[i].cod := S[2];

inc(i);

end;

end;

strText:='';

StrCod := Form1.RichEdit2.Lines.GetText;

LastZ := StrCod[1];

N:=Length(StrCod);

Num:=0;

If Form1.WithUpCase1.Checked then

begin

N:=N-2;

while StrCod[N]<>'>'do

begin

If (StrCod[N]='1')or(StrCod[N]='0')then

StrBig:=StrCod[N]+StrBig;

dec(N);

end;

N:=N-10;

end;

For i:=2 to N do

begin

If ord(StrCod[i])<32 then

StrText := StrText+StrCod[i]

else

begin

If PoiskZ(StrCod[i]) then LastZ := StrCod[i]

else

begin

Num:=Num+1;

StrText := StrText+PoiskS(StrCod[i],LastZ,StrBig,Num);

end

end

end;

Form1.RichEdit1.Lines.Text:=StrText;

Form1.IndexOfCompress1.Enabled := True;

end

else Begin

Form1.RichEdit2.Lines.Clear;

Form1.Label2.Enabled := False;

Form1.SaveCodeAs1.Enabled := False;

Form1.IndexOfCompress1.Enabled := False;

end;

end;

procedure TForm1.RichEdit1Change(Sender: TObject);

begin

Label3.Enabled := False;

Label5.Visible := False;

IndexOfCompress1.Enabled:=False;

end;

procedure TForm1.RichEdit2Change(Sender: TObject);

begin

Label3.Enabled := False;

Label5.Visible := False;

IndexOfCompress1.Enabled:=False;

end;

procedure Coder;

function Poisk(ch:string;var StrBig:string):integer;

var i:integer;

ChUp:string[1];

Begin

i := 1;

if Form1.N1.Checked or Form1.N3.Checked then

ChUp := chr(ord(tabl[1].litera[1])-32)

else

ChUp := UpCase(tabl[1].litera[1]);

while ((ch[1]<>tabl[i].litera) and

(ch[1]<>ChUp))and(i<65) do

begin

inc(i);

if Form1.N1.Checked or Form1.N3.Checked then

ChUp := chr(ord(tabl[i].litera[1])-32)

else

ChUp := UpCase(tabl[i].litera[1]);

end;

If Form1.WithUpCase2.Checked then

Begin

If (ord(Ch[1])>64)and(ord(Ch[1])<123)or

(ord(Ch[1])>191)and(ord(Ch[1])<255) then

If (Ch=ChUp)then StrBig := StrBig+'1';

If (Ch=tabl[i].litera)then StrBig := StrBig+'0';

end;

If i<65 then Poisk:=i else Poisk:=0;

End;

var F: TextFile;

S: String;

i: Integer;

Z: String[1];

LastZ: String[1];

StrBig: String;

StrText: String;

StrCod: String;

Num: Integer;

begin

If length(Form1.RichEdit1.Lines.Text)<>0 then

begin

Form1.Label2.Enabled := True;

Form1.SaveCodeAs1.Enabled := True;

S:='a:\Вова\CodeTab\Tab';

If Form1.N1.Checked then S:=S+'1.txt'

else If Form1.N2.Checked then S:=S+'2.txt'

else If Form1.N3.Checked then S:=S+'3.txt'

else S:=S+'4.txt';

Form1.RichEdit2.Lines.Clear;

for i:=1 to 64 do

begin

Tabl[i].Zona := '';

Tabl[i].Litera := '';

Tabl[i].Cod := '';

end;

AssignFile(F,S);

Reset(f);

i:=1;

ReadLn(F,S);

ReadLn(F,S);

ReadLn(F,S);

Z:='';

While not eof(F) do

Begin

ReadLn(F,S);

If S[2]<>'-' then

If S[2]='З' then Z := S[7]

else

Begin

Tabl[i].litera := S[12];

Tabl[i].zona := Z;

Tabl[i].cod := S[2];

inc(i);

end;

end;

If Form1.WithUpCase2.Checked then StrBig := #13'<UpCase>'

else StrBig := '';

StrText := '';

StrCod := '';

LastZ := '';

StrText:=Form1.RichEdit1.Lines.GetText;

For i:=1 to Length(Form1.RichEdit1.Lines.GetText) do

begin

If ord(StrText[i])<32 then

StrCod := StrCod+StrText[i]

else

begin

Num := Poisk(StrText[i],StrBig);

if Num=0 then Begin

StrCod := StrCod+'<?>';

If Form1.WithUpCase2.Checked

then StrBig := StrBig+'<?>';

end

else begin

Z := Tabl[Num].Zona;

If LastZ<>Z then Begin

StrCod := StrCod+Z[1];

LastZ := Z;

end;

StrCod := StrCod+Tabl[Num].Cod[1];

end;

end;

end;

If Form1.WithUpCase2.Checked then StrCod := StrCod+StrBig;

Form1.RichEdit2.Lines.Text:=StrCod;

Form1.IndexOfCompress1.Enabled := True;

end

else Begin

Form1.RichEdit2.Lines.Clear;

Form1.Label2.Enabled := False;

Form1.SaveCodeAs1.Enabled := False;

Form1.IndexOfCompress1.Enabled := False;

end;

end;

procedure TForm1.IgnoreUpCase2Click(Sender: TObject);

begin

IgnoreUpCase2.Checked := True;

WithUpCase2.Checked := False;

Coder;

end;

procedure TForm1.WithUpCase2Click(Sender: TObject);

begin

IgnoreUpCase2.Checked := False;

WithUpCase2.Checked := True;

Coder;

end;

procedure TForm1.IgnoreUpCase1Click(Sender: TObject);

begin

IgnoreUpCase1.Checked := True;

WithUpCase1.Checked := False;

DeCoder;

end;

procedure TForm1.WithUpCase1Click(Sender: TObject);

begin

IgnoreUpCase1.Checked := False;

WithUpCase1.Checked := True;

DeCoder;

end;

end.

Тестовый пример.

Пример кодирования.

Исходное сообщение:

Пусть чередуются весь век

Счастливый рок и рок несчастный.

В неутомимости всечасной
Себя находит человек.
Кодовая последовательность:
D5E1DA6E4D0F3D242E21F5D6AE3D082AE4D082EB
DAF3D3A6C98E6CD041EBD09041EBD072AF3D3A67E6CF6
D8072E1D61B9B1A6908A2F3D3A71EC
DA2E93D073F2D1E2D960F3D2C182EBF6
<UpCase>100000000000000000000000010000000000000000000000000000000100000000000000000000000100000000000000000000
Пример декодирования.
Кодовая последовательность:
EBDA6BE1D921EBDBA0E262D159E2FC
DB31BE8D5E1D0F8D0F2001C
<UpCase>10000000000010000000100000000000000
Декодированное сообщение:
Information Systems.
October 8 2001.
Руководство пользователя
Рисунок 1 - Вид основного окна программы
Цифрами на рисунке обозначены:
Окна для ввода/редактирования текстовой информации (исходной - верхнее и закодированной - нижнее).
Метка для вывода коэффициента компрессии.
Кнопки для выхода из программы.
Все действия производятся с помощью щелчка левой кнопки мышки в области соответствующего компонента. Ввод текста осуществляется с клавиатуры. Имеется возможность загрузить (сохранить) текст либо код из файла. Для этого необходимо щелкнуть по надписи File(либо использовать комбинацию клавиш Alt+F), в результате чего появится выпадающее меню, представленное на рисунке 2. Для смены кодовой таблицы нужно выбрать CaseCodeTable (либо использовать комбинацию клавиш Alt+C), после чего установить переключатель на требующийся вид кодовой таблицы (см. рисунок 3). Чтобы осуществить кодирование либо декодирование необходимо зайти в Option (комбинация клавиш Alt+O). После появления окна (см. рисунок 4) навести курсор на соответствующее поле и при, появлении дополнительных двух полей, щелкнуть по требующемуся. В зависимости от выбора кодирование (декодирование) будет производиться либо с учетом регистра символов, либо без него. Для выхода из программы следует щелкнуть по кнопке Close, либо использовать комбинацию клавиш Alt+С.
1
Рисунок 2 - Содержимое опции File
Цифрами на рисунке 2 обозначены следующие события:
Создание нового текста.
Открытие текста из файла.
Открытие кода.
Сохранение текста.
Сохранение кода.
Выход.

Рисунок 3 - Содержимое опции CaseCodeTable

Рисунок 4 - Содержимое опции Options

Цифрами на рисунке 4 обозначены действия:

Кодирование.

Декодирование.

Не учитывать регистр.

Учитывать регистр.

Подсчет коэффициента компрессии.


Подобные документы

  • Текстовый редактор - приложение для обработки текстовой информации. Описание текстовых процессоров как более совершенных текстовых редакторов. Типы текстовых файлов: форматированные, неформатированные. Основные правила редактирования и набора текста.

    презентация [747,3 K], добавлен 26.11.2010

  • Функциональные характеристики программы форматирования текстовых файлов, требования к ее интерфейсу и данным. Схема взаимодействия компонентов системы, выбор среды исполнения и программная реализация алгоритмов. Тестирование и оценка качества программы.

    курсовая работа [61,1 K], добавлен 25.07.2012

  • Предотвращение несанкционированного распространения информации в текстовых файлах. Разработка подсистемы обнаружения утечки информации с фильтром идентификации текстовых областей в передаваемом потоке данных и их сходства с конфиденциальными данными.

    дипломная работа [1,8 M], добавлен 14.03.2013

  • Модификация и сравнения двух текстовых файлов. Программа, написанная на языке программирования Cи и работоспособна на IBM совместимых компьютерах. Псевдографический и графический интерфейсы. Анализ программы методом сортировки одномерного массива.

    курсовая работа [116,2 K], добавлен 21.02.2008

  • Разработка программы обработки числовых последовательностей с кодом на языке Pascal. Функции ввода пользователем с клавиатуры последовательности целых чисел. Алгоритмы разработанных процедур и функций. Инструкция пользователя, листинг программы.

    курсовая работа [677,7 K], добавлен 13.07.2010

  • Основы теории передачи информации. Экспериментальное изучение количественных аспектов информации. Количество информации по Хартли и К. Шеннону. Частотные характеристики текстовых сообщений. Количество информации как мера снятой неопределенности.

    лабораторная работа [42,3 K], добавлен 15.02.2011

  • Методы компрессии информации. Обзор и характеристика существующих методов сжатия информации, основанных на процедуре кодирования Хаффмена. Алгоритмы динамического кодирования методом FGK и Виттера. Программная реализация и руководство пользователя.

    курсовая работа [33,2 K], добавлен 09.03.2009

  • Разработка программы, предназначенной для сжатия или компрессии полутонового изображения международным стандартом JPEG. Описание метода JPEG, выдача результатов в виде декодированного изображения. Обзор методов компрессии полутонового изображения.

    курсовая работа [43,5 K], добавлен 14.10.2012

  • Создание и редактирование электронных баз данных. Обработка электронных таблиц. Операции изменения формата документа. Основные функции текстовых процессоров. Деловая графика. Построение рисунков, диаграмм, гистограмм различных типов в программе Excel.

    презентация [773,1 K], добавлен 23.12.2013

  • Классификация программ обработки текстовых документов. Общие принципы оформления издания. Правила набора текста. Системы распознавания текста (OCR). Комплекс программного обеспечения для настольных издательских систем. Примеры текстовых редакторов.

    презентация [75,0 K], добавлен 13.08.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.