Федеральное Агентство по образованию
Государственное образовательное учреждение высшего профессионального образования Московский Государственный Университет
Приборостроения и Информатики филиал в г. Сергиев Посад
Кафедра ИТ-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.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.