Коды, исправляющие не симметричные ошибки. Преобразование целого числа в двоичное строковое представление

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

6 страниц (Word-файл)

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

Федеральное Агентство по образованию

Государственное образовательное учреждение высшего профессионального образования Московский Государственный Университет

Приборостроения и Информатики филиал в г. Сергиев Посад

Кафедра ИТ-4

Отчет по лабораторной работе №2

По дисциплине «Организация ЭВМ, комплексов и систем»

На тему: «Коды, исправляющие не симметричные ошибки.»

Преподаватель        

                   Студент                  

                   Специальность        230101 Курс 3

            Группа                  ИТ4-06-01Д

Сергиев Посад 2008 г.


Коды, исправляющие не симметричные ошибки.

Данная прорграмма исправляет несимметричные ошибки в двоичных словах, такие как вставка или выпадение символа и неверно принятый символ.

В поле «n» указывается длина кодового слова, в поле «l» указывается модуль, по которому берётся сравнение, l=n+1, в поле «код» вводится код, который необходимо проверить на наличие ошибок.

Вычет числа S(u)modl равен номеру позиции в котором произошла ошибка, если ошибки нет то вычет слова равен 0.

В правом окне выводится информация о коде или выдаются имеющиеся в нем ошибки.

Окно программы:

 
 


interface

uses

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

Dialogs, StdCtrls, Math;

Const

SMB_ERR = 0;

LOSE_ERR = -1;

INS_ERR = 1;

type

TMainForm = class(TForm)

Output_Memo: TMemo;

Input_GroupBox: TGroupBox;

Input_n_Edit: TEdit;

n_Label: TLabel;

l_Label: TLabel;

Input_l_Edit: TEdit;

Generate_Code_Button: TButton;

Input_code_Edit: TEdit;

Label1: TLabel;

Find_Error_Button: TButton;

procedure Generate_Code_ButtonClick(Sender: TObject);

procedure Find_Error_ButtonClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

MainForm: TMainForm;

implementation

{$R *.dfm}

// Функция преобразует целое число в двоичное строковое представление

function IntToBin(Value: Cardinal; n: LongInt): String;

var

i: Integer;

begin

SetLength(Result, n);

For i := 0 to n-1 do

begin

If (Value SHR (i) and 1) = 0 then

Result[n-i]:= '0'

Else

Result[n-i]:= '1';

end;

end;

// Функция вычисляет сумму номеров 1-х позиций

function Sum_1N(Bin_Value: String): LongInt;

var

i: Integer;

begin

Result:= 0;

For i:= 1 to Length(Bin_Value) do

If Bin_Value[i] = '1' then

Inc(Result,i);

end;

// Функция вычисляет вес слова

function W(Bin_Value: String): Byte;

var

i: Integer;

begin

Result:= 0;

For i:= 1 to Length(Bin_Value) do

If Bin_Value[i] = '1' then

Inc(Result);

end;

// Функция строит код для заданных n и l

function Generate_Code(n,l: LongInt): String;

var

x: LongInt;

begin

Result:= '';

x:= Trunc(IntPower(2,n))-1;

While (x >= 0) do

begin

If (Sum_1N(IntToBin(x,n)) mod l) = 0 then

Result:= Result + IntToBin(x,n) + ',';

Dec(x);

end;

SetLength(Result,Length(Result)-1);

end;

// Функуция исправляет ошибку искажения символа 0->1.

// Если слово без ошибки возврвщает строку NO_ERR

// Если искажено более 1 символа, возвращает UNKNOWN_ERR

function Simbol_Err(Bin_Value: String; n,l: LongInt): String;

var

_SU: LongInt;

begin

Result:= Bin_Value;

_SU:= Sum_1N(Bin_Value) mod l;

If _SU <> 0 then

begin

Result[_SU]:= '0';

If Pos(Result,Generate_Code(n,l)) = 0 then

Result:= 'UNKNOWN_ERR';

end

Else

Result:= 'NO_ERR';

end;

// Функция нормализует отрицательный вычет

function Norm_Sum(Value,l: LongInt): LongInt;

begin

Result:= Value;

While Result < 0 do

Result:= Result + l;

end;

// Функция исправляет ошибку выпадения символа

function Lose_Simbol_Err(Bin_Value: String; n,l: LongInt): String;

var

_Cnt,i: Byte;

_W: Byte;

_SU: LongInt;

begin

Result:= Bin_Value;

_W:= W(Bin_Value);

_SU:= Norm_Sum((-Sum_1N(Bin_Value) mod l),l);

_Cnt:= 0;

i:= n - 1;

If _SU <= _W then

begin

While _Cnt < _SU do

begin

If Result[i] = '1' then

Inc(_Cnt);

Dec(i);

end;

Insert('0',Result,i+1);

end

Else

begin

While _Cnt < n - _SU do

begin

If Result[i] = '0' then

Inc(_Cnt);

Dec(i);

end;

Insert('1',Result,i+1);

end;

end;

// Функция исправляет ошибку вставки символа

function Insert_Simbol_Err(Bin_Value: String; n,l: LongInt): String;

var

_Cnt,i: Byte;

_SU: LongInt;

_W: Byte;

begin

Result:= Bin_Value;

_Cnt:= 0;

i:= n + 1;

_W:= W(Bin_Value);

_SU:= Sum_1N(Bin_Value) mod l;

If _SU = 0 then

begin

Delete(Result,Length(Result),1);

Exit;

end;

If (_SU > 0) and (_SU < _W) then

begin

While _Cnt < _SU do

begin

If Result[i] = '1' then

Inc(_Cnt);

Dec(i);

end;

Delete(Result,i,1);

Exit;

end;

If _SU = _W then

begin

Delete(Result,1,1);

Exit;

end;

If _SU > _W then

begin

While _Cnt < n - _SU + 1 do

begin

If Result[i] = '0' then

Inc(_Cnt);

Dec(i);

end;

Delete(Result,i,1);

end;

end;

// Функция возвращает код типа ошибки

function Get_Err_Code(Bin_Value: String; n,l: LongInt): Integer;

begin

Result:= Length(Bin_Value) - n;

end;

procedure TMainForm.Generate_Code_ButtonClick(Sender: TObject);

var

_n,_l: LongInt;

begin

Try

_n:= StrToInt(Input_n_Edit.Text);

_l:= StrToInt(Input_l_Edit.Text);

Except

Output_Memo.Lines.Add('Неверные значения: ' +'n = '+ Input_n_Edit.Text +

'; l = '+Input_l_Edit.Text);

Output_Memo.Lines.Add('-----------------------------------');

Exit;

end;

Output_Memo.Lines.Add('V'+Input_n_Edit.Text+','+Input_l_Edit.Text+

' = {'+Generate_Code(_n,_l)+'}');

Output_Memo.Lines.Add('-----------------------------------');

end;

procedure TMainForm.Find_Error_ButtonClick(Sender: TObject);

var

_n,_l: LongInt;

_Wrd: String;

begin

Try

_n:= StrToInt(Input_n_Edit.Text);

_l:= StrToInt(Input_l_Edit.Text);

_Wrd:= Trim(Input_code_Edit.Text);

Except

end;

Output_Memo.Lines.Add('U = '+ _Wrd +'; n = '+ Input_n_Edit.Text +

'; l = '+Input_l_Edit.Text+';');

Case Get_Err_Code(_Wrd,_n,_l) of

LOSE_ERR:

begin

_Wrd:= Lose_Simbol_Err(_Wrd,_n,_l);

Output_Memo.Lines.Add('Тип ошибки: Выпадение символа.');

Output_Memo.Lines.Add('Исходное слово: ' + _Wrd);

Output_Memo.Lines.Add('-----------------------------------');

end;

SMB_ERR:

begin

_Wrd:= Simbol_Err(_Wrd,_n,_l);

If _Wrd = 'NO_ERR' then

Output_Memo.Lines.Add('Слово не содержит ошибки.');

If _Wrd = 'UNKNOWN_ERR' then

Output_Memo.Lines.Add('Неизвестная ошибка.');

If (_Wrd <> 'NO_ERR') And (_Wrd <> 'UNKNOWN_ERR') then

begin

Output_Memo.Lines.Add('Тип ошибки: Искажение символа 0->1.');

Output_Memo.Lines.Add('Исходное слово: ' + _Wrd);

end;

Output_Memo.Lines.Add('-----------------------------------');

end;

INS_ERR:

begin

_Wrd:= Insert_Simbol_Err(_Wrd,_n,_l);

Output_Memo.Lines.Add('Тип ошибки: Вставка символа.');

Output_Memo.Lines.Add('Исходное слово: ' + _Wrd);

Output_Memo.Lines.Add('-----------------------------------');

end;

end;

end;

end.

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

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