Кодирование и декодирование текстовой информации циклическим кодом с исправлением тройных одиночных ошибок

 

 



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

 

СЕВАСТОПОЛЬСКИЙ ГОСУДАРСТВЕННЫЙ  ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

 

 

 

Кафедра

Информационных систем

 

 

 

 

 

 

 

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

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

по теме «Кодирование и декодирование текстовой информации циклическим кодом с исправлением тройных одиночных ошибок»

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

 

 

 

 

  листов

 

 

 

 

 

Выполнил:

студент группы И-33д

Берёзин П.А.

 

Проверил:

Василенко В.А.

 

 

 

 

 

 

Севастополь

2001

 

АННОТАЦИЯ

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

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

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

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

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

 

Севастопольский государственный технический университет

(название высшего учебного заведения)

Кафедра информационных систем

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

Специальность информационные управляющие системы и технологии

Курс  третий   Группа И-33д  Семестр пятый

 

ЗАДАНИЕ


на курсовой проект (работу) студента

Берёзина П. А.


(фамилия, имя, отчество)

1 Тема проекта (работы). Кодирование и декодирование текстовой информации циклическим кодом с исправлением тройных одиночных ошибок.

2 Срок сдачи студентом законченного проекта  1 ноября 2001г

3 Входные данные к проекту по усмотрению разработчика

 

 

 

 

I Содержание расчетно-пояснительной записки

1 Постановка  задачи

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

3 Описание  функциональных возможностей программы

4 Структурная схема  алгоритма кодирования и декодирования


5 Программная  реализация

 

 


 

 

 

 

7) Дата выдачи задания  7 сентября 2001 года

 

КАЛЕНДАРНЫЙ ПЛАН

 

п/п

Название этапов курсо-

вого проекта (работы)

Срок выполнения

Этапов проекта

Примечания

1

Изучение методов ре-

   
 

шения поставленной

   
 

задачи

       2.09 – 10.09

 
       

  2

Составление алгорит-

   
 

ма программы и разра-

   
 

ботка интерфейса

        10.9 – 15.09

 
       

  3

Написание текста прог-

   
 

раммы

       15.09 – 10.10

 
       

  4

Отладка программы на

   
 

примерах

         10.10 –20.10

 
       

  5

Проведение вычисли-

   
 

тельного эксперимента

        20.10 –22.10

 
       

  6

Оформление  поясни-

   
 

тельной записки

        22.10 – 30.10

 
   

   

 
 
       
       
       
       
       
       

 

Студент.

(подпись)

Руководитель Василенко В.А.

(подпись) (фамилия, имя, отчество)

 

 

 

<    7    >     сентября      2001 г.

 

СОДЕРЖАНИЕ

Введение 6

1 Постановка задачи 7

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

3 Описание функциональных возможностей  программы 10

4 Структурная схема алгоритма  кодирования и декодирования 11

5 Программная реализация 13

Заключение 14

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

Приложение А 16

Приложение Б 29

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


                            КУРСОВОЙ ПРОЕКТ


                                                                                                 Лит.         


Изм. Лист N докум. Подп. Дат  


Разраб.            Берёзин                         ПОЯСНИТЕЛЬНАЯ ЗАПИСКА     Т  Провер.     Василенко


                                                  Лист   Листов


Н.Контр                     Кафедра ИС 


Утв.                  Группа И-33д


ВВЕДЕНИЕ

 

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

 

1 ПОСТАНОВКА ЗАДАЧИ

 

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

 

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

 

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

Первоначально циклические  коды они были созданы для упрощения  схем кодирования. Их эффективность обеспечила им широкое применение на практике.

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

Для образования циклического кода служат так называемые образующие полиномы, степень которых соответствует  количеству проверочных символов. Образующий полином – это всегда неприводимой многочлен, т. е. делящийся только сам на себя и на «1» и одновременно входящий в разложение двучлена x+1.

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

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

Для исправления ошибок необходимо разделить кодовую комбинацию на образующий многочлен и определить вес остатка. Если этот вес меньше или равен кратности исправляемых ошибок, то этот остаток складывают с принятой комбинацией и ошибка исправлена. Если вес больше кратности исправляемых ошибок W>tи, то производим циклический сдвиг принятой кодовой комбинации на один разряд влево и эту сдвинутую комбинацию вновь делим на образующий полином и опять определяем вес остатка. Продолжаем процедуру до тех пор, пока не выполнится соотношение W<=tи. После этого последнее делимое складываем с последним остатком и затем циклически сдвигаем эту сумму вправо по разрядно столько раз, сколько раз до этого осуществляли циклический сдвиг влево.

Обнаружение ошибок в  циклических кодах может быть как для одиночных ошибок, так и для пакетов или пачек ошибок, длина которых не превышает количества проверочных символов.

 

3 ОПИСАНИЕ ФУНКЦИОНАЛЬНЫХ  ВОЗМОЖНОСТЕЙ ПРОГРАММЫ

 

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


 

4 СТРУКТУРНАЯ  СХЕМА АЛГОРИТМА КОДИРОВАНИЯ  И ДЕКОДИРОВАНИЯ

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5 ПРОГРАММНАЯ РЕАЛИЗАЦИЯ

 

Для разработки программы  был выбран язык программирования высокого уровня Delphi 6.

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

Delphi позволяет без особых трудностей реализовать удобный и красивый пользовательский интерфейс, не пребигая к объёмному и трудоёмкому написанию низкоуровневого кода.

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


 

ЗАКЛЮЧЕНИЕ

 

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

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

 

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

 

  1. Конспект лекций по дисциплине “Кодирование и защита информации”.
  2. Березюк Н. Т., Андрющенко А. Г., Мощинский С. С. и др. Кодирование информации (двоичные коды). – Харьков: Выща школа, 1978. – 252 с.
  3. Кузьмин И. В., Кедрус В. А. Основы теории информации и кодирования. – Киев: Выща школа, 1977. – 280 с.
  4. Цымбал В. П. Теория информации и кодирование. Киев, ”Вища школа”, 1997, 288 с.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ПРИЛОЖЕНИЕ  А

 

ТЕКСТ ПРОГРАММЫ

 

unit main;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  //используемы

  Dialogs, ExtCtrls, Menus, jpeg, StdCtrls, ComCtrls, Grids, Math, Buttons,       //модули

  OleServer,obsh, Mask, HTTPApp;

 

Type

  Tfmzikl = class(TForm)  //описание используемых компонентов

    bevel1: TBevel;

    mm: TMainMenu;

    nfile: TMenuItem;

    nopen: TMenuItem;

    nsave: TMenuItem;

    nexit: TMenuItem;

    nhelp: TMenuItem;

   nhelp_avtor: TMenuItem;

    nhelp_prog: TMenuItem;

    nrun: TMenuItem;

    nnew: TMenuItem;

    od: TOpenDialog;

    sd: TSaveDialog;

    ncoding: TMenuItem;

    ndecoding: TMenuItem;

    nrazdel: TMenuItem;

    nisxodsms: TMenuItem;

    nstatic: TMenuItem;

    nmatrix: TMenuItem;

    ntablcod: TMenuItem;

    ndecodsms: TMenuItem;

    pllogo: TPanel;

    plInfo: TPanel;

    Image1: TImage;

    reInfo: TRichEdit;

    nlogo: TMenuItem;

    plstatic: TPanel;

    sgstatic: TStringGrid;

    pllong: TPanel;

   plh: TPanel;

    plmatrix: TPanel;

    gbmatrixcikl: TGroupBox;

    stInfoMatrix: TStaticText;

    edInfoMatrix: TEdit;

    udInfoMatrix: TUpDown;

    sgInfoMatrix: TStringGrid;

    StaticText1: TStaticText;

    edControlMatrix: TEdit;

    udControlMatrix: TUpDown;

    sgControlMatrix: TStringGrid;

 

    stPolinom: TStaticText;

    edPolinom: TEdit;

    gbParamtrCikl: TGroupBox;

    stDmin: TStaticText;

    stCorrect: TStaticText;

    stObnar: TStaticText;

    edObnar: TEdit;

    udObnar: TUpDown;

    edCorrect: TEdit;

    udCorrect: TUpDown;

    edDmin: TEdit;

    sbcoding: TSpeedButton;

    plcoding: TPanel;

    sgSym: TStringGrid;

    sbAutoTabl: TSpeedButton;

    ncanal: TMenuItem;

    plGoTo: TPanel;

    lbSource: TLabel;

    lbExit: TLabel;

    gbKanal: TGroupBox;

    lbCountError: TLabel;

    lbProb: TLabel;

    lbE1: TLabel;

    Label2: TLabel;

    Label3: TLabel;

    meCountError: TMaskEdit;

    udCountError: TUpDown;

    edE1: TEdit;

    edE2: TEdit;

    edE3: TEdit;

    sbAutoFill: TSpeedButton;

    plAllDecode: TPanel;

    reDecode: TRichEdit;

    lbernocor: TLabel;

    lbercor: TLabel;

    reSource: TRichEdit;

    reExit: TRichEdit;

    Label1: TLabel;

    procedure nexitClick(Sender: TObject);  //объявление процедур и функций

    procedure FormCreate(Sender: TObject);

    procedure FormActivate(Sender: TObject);

    procedure nnewClick(Sender: TObject);

    procedure nopenClick(Sender: TObject);

    procedure nsaveClick(Sender: TObject);

    procedure nlogoClick(Sender: TObject);

    procedure nisxodsmsClick(Sender: TObject);

    procedure FormClose(Sender: TObject;

              var Action: TCloseAction);

    procedure udInfoMatrixChangingEx(Sender: TObject;

      var AllowChange: Boolean; NewValue: Smallint;

      Direction: TUpDownDirection);

    procedure nstaticClick(Sender: TObject);

    procedure nmatrixClick(Sender: TObject);

    procedure udControlMatrixChangingEx(Sender: TObject;

 

      var AllowChange: Boolean; NewValue: Smallint;

      Direction: TUpDownDirection);

    procedure sgControlMatrixSetEditText(Sender: TObject; ACol,

      ARow: Integer; const Value: String);

    procedure udObnarChangingEx(Sender: TObject; var AllowChange: Boolean;

      NewValue: Smallint; Direction: TUpDownDirection);

    procedure udCorrectChangingEx(Sender: TObject;

      var AllowChange: Boolean; NewValue: Smallint;

      Direction: TUpDownDirection);

    procedure sbcodingClick(Sender: TObject);

    procedure ncodingClick(Sender: TObject);

    procedure sbAutoTablClick(Sender: TObject);

    procedure ntablcodClick(Sender: TObject);

    procedure ncanalClick(Sender: TObject);

    procedure sgSymDrawCell(Sender: TObject; ACol, ARow: Integer;

      Rect: TRect; State: TGridDrawState);

    procedure meCountErrorChange(Sender: TObject);

    procedure edE1Change(Sender: TObject);

    procedure sgSymKeyPress(Sender: TObject; var Key: Char);

    procedure edE1KeyPress(Sender: TObject; var Key: Char);

    procedure sbAutoFillClick(Sender: TObject);

    procedure ndecodingClick(Sender: TObject);

   procedure ndecodsmsClick(Sender: TObject);

    procedure FormShow(Sender: TObject);

    procedure nhelp_avtorClick(Sender: TObject);

  public

   CodeButton:boolean; function FullText:boolean; procedure CreateMatrix;

   procedure DoCodingTabl; end;

var

fmzikl:Tfmzikl; Load:boolean; myf:AnsiString;

implementation uses Kanal, Cikl, logo, about;

{$R *.dfm}

procedure Tfmzikl.nexitClick(Sender: TObject);

begin Сlose; end;

procedure Tfmzikl.FormCreate(Sender: TObject);

begin

  with pllogo, plInfo, plstatic, plcoding, plGoto do

   begin Height:=258; Left:=5; Top:=6; Width:=452; Parent:=fmzikl; end;

   pllong.Parent:=plstatic; plh.Parent:=plstatic; end;

  with sgstatic do

   begin Height:=230; Left:=0; Top:=0; Width:=451; Parent:=plstatic; end;

  with Image1 do begin Parent:=pllogo; Align:=alClient; end;

  with reInfo do begin Parent:=plInfo; Color:=clInfoBk;

     Width:=458; Top:=-2; Left:=-2; Height:=262 end;

   with plmatrix do begin Height:=258; Left:=5; Top:=6; Width:=452; Parent:=fmzikl;end;

   with gbmatrixcikl do begin Height:=262; Left:=0; Top:=-4; Width:=452; Parent:=plmatrix;end;

   with plAllDecode do begin Height:=256; Left:=5; Top:=6; Width:=451; Parent:=fmzikl; end;

   with reDecode do begin Height:=214; Left:=2; Top:=2; Width:=443; Parent:=plAllDecode; end;

end;

procedure Tfmzikl.FormActivate(Sender: TObject);

begin

  plInfo.Visible:=false; plstatic.Visible:=false; plmatrix.Visible:=false; plcoding.Visible:=false;

  plgoto.Visible:=false; plAllDecode.Visible:=false; pllogo.Visible:=true; nnew.Enabled:=true;

 

  nopen.Enabled:=true; nsave.Enabled:=true; nexit.Enabled:=true; nlogo.Enabled:=true;

  nmatrix.Enabled:=false; ntablcod.Enabled:=false; ndecodsms.Enabled:=false;

  ncoding.Enabled:=false; ncanal.Enabled:=false; ndecoding.Enabled:=false;

end;

procedure Tfmzikl.nnewClick(Sender: TObject);

begin

  pllogo.Visible:=false; plstatic.Visible:=false; plmatrix.Visible:=false; plcoding.Visible:=false;

  plgoto.Visible:=false; plAllDecode.Visible:=false; plInfo.Visible:=true; reInfo.Lines.Clear;

  reInfo.SetFocus; nisxodsms.Enabled:=true; nstatic.Enabled:=true; nmatrix.Enabled:=false;

  ntablcod.Enabled:=false; ndecodsms.Enabled:=false; ncoding.Enabled:=false;

  ncanal.Enabled:=false; ndecoding.Enabled:=false;

end;

procedure Tfmzikl.nopenClick(Sender: TObject);

var F:TextFile;

  procedure LoadInfo;

   var Str:string; i:integer;

   begin reInfo.Clear; while not eof(F) do begin readln(F,Str); reInfo.Lines.Add(Str);

      MaxTransf:=reInfo.Lines.Count; for i:=0 to MaxTransf-1 do Transf[i]:=reInfo.Lines[i];

     end; end; Begin

ForceCurrentDirectory:=true; if od.Execute then begin AssignFile(F,od.FileName);

    Reset(F); LoadInfo; pllogo.Visible:=false; plstatic.Visible:=false; plmatrix.Visible:=false;

    plcoding.Visible:=false; plgoto.Visible:=false; plAllDecode.Visible:=false;

    plInfo.Visible:=true; nisxodsms.Enabled:=true; nmatrix.Enabled:=false;

    ndecodsms.Enabled:=false; ncoding.Enabled:=false; ndecoding.Enabled:=false;

    ncanal.Enabled:=false;

    if reInfo.Lines.Count<>0 then nstatic.Enabled:=true else nstatic.Enabled:=false; end

else ShowMessage('Файл не был выбран!');

end;

procedure Tfmzikl.nsaveClick(Sender: TObject);

begin if reInfo.Lines.Count=0 then ShowMessage('Нет данных!') else begin

    sd.FileName:=myf; if sd.Execute then begin myf:=sd.FileName;

      reInfo.Lines.SaveToFile(sd.FileName); end;

    ShowMessage('Текст не был сохранён, т.к. файл не был выбран!');

   end; end;

procedure Tfmzikl.nlogoClick(Sender: TObject);

begin plInfo.Visible:=false; plstatic.Visible:=false; plmatrix.Visible:=false;

plcoding.Visible:=false; plgoto.Visible:=false; plAllDecode.Visible:=false;

  pllogo.Visible:=true; end;

procedure Tfmzikl.nisxodsmsClick(Sender: TObject);

begin pllogo.Visible:=false; plstatic.Visible:=false; plmatrix.Visible:=false; lcoding.Visible:=false;

  plgoto.Visible:=false; plAllDecode.Visible:=false; plInfo.Visible:=true; end;

procedure Tfmzikl.FormClose(Sender: TObject; var Action: TCloseAction);

begin fmzikl.DestroyWindowHandle; Action:=caFree; end;

procedure Tfmzikl.nstaticClick(Sender: TObject);

var i,j,k,Sum,n:integer; StrS:String; Str:array[0..255] of Char; b:boolean; H:real;

begin if not FullText then begin ShowMessage('Нет данных!');exit;end;

  With sgstatic do begin ClearTabl(sgStatic); pllogo.Visible:=false; plInfo.Visible:=false;

   plmatrix.Visible:=false; plcoding.Visible:=false; plgoto.Visible:=false;

    plAllDecode.Visible:=false; plstatic.Visible:=true; nmatrix.Enabled:=true; RowCount:=1;

    LongStaticTabl:=0; Sum:=0; Cells[0,0]:='               Номер'; Cells[1,0]:='               Символ';

    Cells[2,0]:='              Частота'; for i:=0 to reInfo.Lines.Count-1 do begin

    StrS:=reInfo.Lines.Strings[i]; StrPCopy(Str,StrS); for j:=0 to StrLen(Str)-1 do begin

        b:=false; inc(Sum);

        for k:=1 to RowCount-1 do

 

   if (Cells[1,k]='                пробел   ') and (Str[j]=' ') or (Cells[1,k][23]=Str[j]) then begin

     b:=true; Cells[2,k]:='                      '+IntToStr(StrToInt(Cells[2,k])+1); end;

        if not b then begin RowCount:=RowCount+1;

             Cells[0,RowCount-1]:='                      '+IntToStr(RowCount-1);

        if Str[j]<>' ' then Cells[1,RowCount-1]:='                      '+Str[j]

          else Cells[1,RowCount-1]:='                пробел   '; Cells[2,RowCount-1]:='                      '+'1';

        end; end; if i=0 then begin RowCount:=RowCount+1;

        Cells[0,RowCount-1]:='                      '+IntToStr(RowCount-1);

        Cells[1,RowCount-1]:='        конец строки'; Cells[2,RowCount-1]:='                      '+'1';

        n:=RowCount-1; inc(sum); end else begin

   Cells[2,n]:='                      '+IntToStr(StrToInt(Cells[2,n])+1);

   inc(sum); end; end; FixedRows:=1;

    if RowCount<15 then DefaultColWidth:=148 else DefaultColWidth:=143;

    pllong.Caption:='Длина:  '+IntToStr(Sum)+'  символов'; AllSymbols:=sum;

    LongCodeTabl:=sgStatic.RowCount-1; LongStaticTabl:=LongCodeTabl;

    for i:=1 to LongStaticTabl do begin if sgStatic.Cells[1,i]='                пробел   ' then begin

        StaticTabl[i-1].Sym:=' '; StaticTabl[i-1].endline:=false; end else

      if sgStatic.Cells[1,i][5]=' ' then begin StaticTabl[i-1].Sym:=sgStatic.Cells[1,i][23];

        StaticTabl[i-1].endline:=false  end else begin StaticTabl[i-1].Sym:=chr(250);

        StaticTabl[i-1].endline:=true end; StaticTabl[i-1].P:=StrToInt(sgStatic.Cells[2,i]);

    end; end; H:=0; for j:=0 to LongStaticTabl-1 do

    H:=H-(StaticTabl[j].P/AllSymbols)*log2(StaticTabl[j].P/AllSymbols);

  plh.Caption:='Энтропия: '+FloatToStr(trunc(H*100)/100)+ ' бит/сим'; end;

function Tfmzikl.FullText:boolean; {Заполнение массива символами из reInfo}

var k:integer; begin MaxTransf:=0; for k:=0 to reInfo.Lines.Count-1 do begin

    Transf[k]:=reInfo.Lines[k]; MaxTransf:=MaxTransf+1; end;

  if reInfo.Lines.Count=0 then FullText:=false else FullText:=true; end;

procedure Tfmzikl.nmatrixClick(Sender: TObject);

begin pllogo.Visible:=false; plInfo.Visible:=false; plstatic.Visible:=false;

plcoding.Visible:=false; plgoto.Visible:=false; plAllDecode.Visible:=false;

plmatrix.Visible:=true; TypeCode:=7; CreateMatrix; end;

procedure Tfmzikl.CreateMatrix;

var i,j:integer; begin With sgInfoMatrix do for i:=0 to RowCount-1 do

      for j:=0 to ColCount-1 do if i=ColCount-1-j then Cells[i,j]:='1' else Cells[i,j]:='0';

        ClearTabl(sgControlMatrix); udObnar.Position:=1; udCorrect.Position:=1;

        edDmin.Text:='3'; gbParamtrCikl.visible:=(TypeCode=7);

        stPolinom.visible:=(TypeCode=7); edPolinom.visible:=(TypeCode=7); end;

procedure Tfmzikl.udInfoMatrixChangingEx(Sender: TObject; var AllowChange: Boolean; NewValue: Smallint; Direction: TUpDownDirection);

var i,j:integer; begin

  With udInfoMatrix,sgInfoMatrix do if (NewValue<=Max) and (NewValue>=min) then

Begin RowCount:=NewValue; ColCount:=NewValue; Width:=NewValue*21+3;

    Height:=Width; sgControlMatrix.RowCount:=NewValue; sgControlMatrix.Height:=Height;

    for i:=0 to RowCount-1 do

      for j:=0 to ColCount-1 do if i=ColCount-1-j then Cells[i,j]:='1' else Cells[i,j]:='0'; end; end;

procedure Tfmzikl.udControlMatrixChangingEx(Sender: TObject; var AllowChange: Boolean; NewValue: Smallint; Direction: TUpDownDirection);

begin With udControlMatrix,sgControlMatrix do if (NewValue<=Max) and (NewValue>=min)

        then begin ColCount:=NewValue; Width:=NewValue*21+3; end; end;

procedure Tfmzikl.sgControlMatrixSetEditText(Sender: TObject; ACol, ARow: Integer;

                                                                                const Value: String);

begin with sgControlMatrix do if (Value<>'0') and (Value<>'1') then Cells[ACol,ARow]:=''; end;

procedure Tfmzikl.udObnarChangingEx(Sender: TObject; var AllowChange: Boolean; NewValue: Smallint; Direction: TUpDownDirection);

 

begin if (NewValue<udObnar.Min) or (NewValue>udObnar.Max) then exit;

   if NewValue<udCorrect.Position then AllowChange:=false else

    edDmin.Text:=IntToStr(NewValue+udCorrect.Position+1) end;

procedure Tfmzikl.udCorrectChangingEx(Sender: TObject; var AllowChange: Boolean; NewValue: Smallint; Direction: TUpDownDirection);

begin if (NewValue<udCorrect.Min) or (NewValue>udCorrect.Max) then exit;

  if NewValue>udObnar.Position then udObnar.Position:=NewValue;

  edDmin.Text:=IntToStr(NewValue+udObnar.Position+1); end;

procedure Tfmzikl.sbcodingClick(Sender: TObject);

var i,j:integer; begin if TypeCode=7 then begin if edPolinom.Text='' then begin

     MessageDlg('Введите образующий полином!',mtWarning,[mbOk],0); exit; end;

for i:=1 to Length(edPolinom.Text) do if (edPolinom.Text[i]<>'0') and (edPolinom.Text[i]<>'1')

      then begin MessageDlg('Неправильно введен образующий полином',mtWarning,[mbOk],0);

          exit; end; end; for i:=0 to sgControlMatrix.ColCount-1 do

    for j:=0 to sgInfoMatrix.ColCount-1 do if sgControlMatrix.Cells[i,j]='' then begin

       ShowMessage('Заполните все ячейки проверочной матрицы!'); exit; end else

if (sgControlMatrix.Cells[i,j]<>'0')and(sgControlMatrix.Cells[i,j]<>'1') then begin

 //MessageDlg('Неправильно заполнена проверочная матрица',mtWarning,[mbOk],0);

ShowMessage('Неправильно заполнена проверочная матрица!'); exit;end;

   if TypeCode=7 then begin Polinom:=edPolinom.Text; Dmin:=StrToInt(edDmin.Text);

  SError:=udCorrect.Position; TError:=udObnar.Position; end;

   LongInfoSym:=sgInfoMatrix.ColCount; LongControlSym:=sgControlMatrix.ColCount;

  for j:=0 to LongInfoSym-1 do begin ObrazMatrix[j]:='';

    for i:=0 to LongInfoSym-1 do

      ObrazMatrix[j]:=ObrazMatrix[j]+sgInfoMatrix.Cells[i,j];

    for i:=0 to LongControlSym-1 do

      ObrazMatrix[j]:=ObrazMatrix[j]+sgControlMatrix.Cells[i,j]; end;

  CodeButton:=true; pllogo.Visible:=false; plInfo.Visible:=false; plstatic.Visible:=false;

    plmatrix.Visible:=false; plgoto.Visible:=false; plAllDecode.Visible:=false;

    plcoding.Visible:=true; ncoding.Enabled:=true; ncanal.Enabled:=false;

    ndecoding.Enabled:=false; ntablcod.Enabled:=true;

Кодирование и декодирование текстовой информации циклическим кодом с исправлением тройных одиночных ошибок