Если в качестве полинома ошибки вводится разрешенная кодовая комбинация, то программа воспринимает переданную комбинацию, как правильную. Это связано со свойствами циклического кода.
Если программа может исправить ошибки, то она пишет номера разрядов с ошибками в окне.
7.3. Листинг (текст) программы |
unit kurs;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls, Menus;
type
TCool = class(TForm)
procedure SendClick(Sender: TObject);
procedure ClosClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure GenerateSindromes;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
TArray=array[1..15] of integer;
rr=array[1..5,1..10] of integer;
hh=array[1..10] of TArray;
sind=array[1..100,1..10] of integer;
var
Dmin,MaxSindr,RightError:integer;
Cool: TCool;
e,o:TArray;
P:TArray;
g:array[1..5] of TArray;
R1:rr;
H1:hh;
a:array[1..5] of integer;
b:array[1..10] of integer;
FormationMatrix: array [1..2 shl 5] of TArray;
sindr:^sind;
implementation
uses Dialog, AboutK, Matr;
{$R *.DFM}
function Find(var A: TArray): integer;
var
N, I, S: integer;
begin
Result := 15;
for N := 1 to (1 shl 4) do
begin
S := 0;
for I := 1 to 15 do
if A[I] <> FormationMatrix[N, I] then Inc(S);
if S < Result then
begin
Result := S;
end;
if Result = 0 then Break;
end;
end;
procedure ZeroArray(var A: TArray);
var
N: Byte;
begin
for N := 1 to 15 do
A[N] := 0;
end;
procedure XorArrays(var A: TArray; const B: TArray);
var
N: Byte;
begin
for N := 1 to 15 do
A[N] := (A[N]+B[N]) mod 2;
end;
procedure TCool.GenerateSindromes;
var
i,j,bb,k1,k2,k3:integer;
err:TArray;
begin
MaxSindr:=1;
for i:=15 downto 15-trunc(Dmin/2)-1 do
MaxSindr:=MaxSindr*i;
FreeMem(sindr);
GetMem(sindr,sizeof(integer)*10*MaxSindr);
ZeroArray(err);
for k1:=1 to 15 do begin
err[k1]:=1;
for j:=1 to 10 do
begin
bb:=0;
for i:=1 to 15 do begin
if ((err[i]=1)and(h1[j,i]=1)) then bb:=bb+1;end;
if (bb mod 2) <> 0 then sindr[k1,j]:=1 else sindr[k1,j]:=0;
end;
ZeroArray(err);;
end;
for k1:=1 to 15 do begin
for k2:=k1+1 to 15 do begin
if (k2<>k1) then begin
err[k1]:=1;
err[k2]:=1;
for j:=1 to 10 do
begin
bb:=0;
for i:=1 to 15 do begin
if ((err[i]=1)and(h1[j,i]=1)) then bb:=bb+1;end;
if (bb mod 2) <> 0 then sindr[k1+k2*15,j]:=1 else sindr[k1+k2*15,j]:=0;
end;
ZeroArray(err);
end;
end;
end;
if trunc(dmin/2)>2 then begin
for k1:=1 to 15 do begin
for k2:=k1+1 to 15 do begin
for k3:=k2+1 to 15 do begin
if (k2<>k1)and(k3<>k2)and(k3<>k1) then begin
err[k1]:=1;
err[k2]:=1;
err[k3]:=1;
for j:=1 to 10 do
begin
bb:=0;
for i:=1 to 15 do begin
if ((err[i]=1)and(h1[j,i]=1)) then bb:=bb+1;end;
if (bb mod 2) <> 0 then sindr[k1+k2*15+k3*15*15,j]:=1 else sindr[k1+k2*15+k3*15*15,j]:=0;
end;
ZeroArray(err);
end;
end;
end;
end;
end;
end;
procedure Normalize();
var
N, K: Byte;
begin
for K := 1 to 4 do
for N := k+1 to 5 do
if g[K, N]=1 then
XorArrays(g[K], g[N]);
end;
procedure Error;
begin
e[1]:=strtoint(cool.e1.Text);
e[2]:=strtoint(cool.e2.Text);
e[3]:=strtoint(cool.e3.Text);
e[4]:=strtoint(cool.e4.Text);
e[5]:=strtoint(cool.e5.Text);
e[6]:=strtoint(cool.e6.Text);
e[7]:=strtoint(cool.e7.Text);
e[8]:=strtoint(cool.e8.Text);
e[9]:=strtoint(cool.e9.Text);
e[10]:=strtoint(cool.e10.Text);
e[11]:=strtoint(cool.e11.Text);
e[12]:=strtoint(cool.e12.Text);
e[13]:=strtoint(cool.e13.Text);
e[14]:=strtoint(cool.e14.Text);
e[15]:=strtoint(cool.e15.Text);
XorArrays(o,e);
end;
procedure DeCode(mass:hh);
var
w:string;
i,j,bb,k,er:integer;
z:array[1..10] of integer;
begin
cool.mem.Clear;
w:='';
er:=0;
cool.S.Text:='Комбинация принята без ошибок';
for j:=1 to 10 do
begin
bb:=0;
for i:=1 to 15 do begin
if ((o[i]=1)and(mass[j,i]=1)) then bb:=bb+1;end;
if (bb mod 2) <> 0 then cool.S.Text:='Комбинация принята с ошибками';
if (bb mod 2) <> 0 then z[j]:=1 else z[j]:=0;
end;
for i:=1 to MaxSindr do begin
bb:=0;
for j:=1 to 10 do bb:=bb+(sindr[i,j]+z[j])mod 2;
er:=er+1;
if bb=0 then break;
end;
j:=0;
for i:=1 to 10 do j:=j+z[i];
k:=0;
for i:=1 to 15 do k:=k+e[i];
if (bb=0)and(j=0)and(k<>0) then
begin
cool.Label7.Visible:=true;
cool.Label9.Visible:=true;
cool.Label10.Visible:=true;
end;
if (k>trunc(Dmin/2)) then
begin
cool.Label7.Visible:=true;
cool.Label9.Visible:=true;
cool.Label10.Visible:=true;
end;
if (bb=0)and(j<>0) then begin
for i:=2 to 15 do begin
if ((er-1)/(15*15*i)<1) then break;
end;
if (i>2) then cool.mem.Lines.add(inttostr(i-1));
if (i>2) then er:=er-(i-1)*15*15;
for i:=1 to 15 do begin
if ((er-1)/(15*i)<1) then break;
end;
if (i>1) then cool.mem.Lines.add(inttostr(i-1));
er:=er-(i-1)*15;
cool.mem.Lines.add(inttostr(er));
end;
end;
procedure Code(mass:rr);
var
i,j,bb:integer;
begin
cool.Label7.Visible:=false;
cool.Label9.Visible:=false;
cool.Label10.Visible:=false;
for j:=1 to 10 do
begin
bb:=0;
for i:=1 to 5 do
begin
bb:=bb+A[i]*mass[i,j];
end;
if (bb mod 2)=1 then b[j]:=1;
end;
for i:=1 to 5 do o[i]:=a[i];
for i:=1 to 10 do o[i+5]:=b[i];
end;
procedure TCool.SendClick(Sender: TObject);
var
i:integer;
begin
for i:=1 to 5 do A[i]:=0;
for i:=1 to 10 do b[i]:=0;
A[1]:= strtoint(a5.Text);
A[2]:= strtoint(a4.Text);
A[3]:= strtoint(a3.Text);
A[4]:= strtoint(a2.Text);
A[5]:= strtoint(a1.Text);
Code(R1);
Error;
c1.text:=IntTostr(o[1]);
c2.text:=IntToStr(o[2]);
c3.text:=IntToStr(o[3]);
c4.text:=IntToStr(o[4]);
c5.Text:=IntToStr(o[5]);
c6.text:=IntToStr(o[6]);
c7.text:=IntToStr(o[7]);
c8.text:=IntToStr(o[8]);
c9.text:=IntToStr(o[9]);
c10.text:=IntToStr(o[10]);
c11.text:=IntToStr(o[11]);
c12.text:=IntToStr(o[12]);
c13.text:=IntToStr(o[13]);
c14.text:=IntToStr(o[14]);
c15.text:=IntToStr(o[15]);
Decode(H1);
end;
procedure Show_Main;
begin
Cool.Show;
end;
procedure TCool.ClosClick(Sender: TObject);
begin
About.Close;
Close;
end;
procedure TCool.Button1Click(Sender: TObject);
var
k,i,j:integer;
e:TArray;
begin
// обнуляем
for j := 1 to 5 do ZeroArray(g[j]);
for j := 1 to 1 shl 4 do ZeroArray(FormationMatrix[j]);
with Form1 do
begin
if (Form1.ShowModal=MROK) then
begin
N1.Enabled:=true;
Send.Enabled:=true;
p[1]:=strtoint(q0.Text);
p[2]:=strtoint(q1.Text);
p[3]:=strtoint(q2.Text);
p[4]:=strtoint(q3.Text);
p[5]:=strtoint(q4.Text);
p[6]:=strtoint(q5.Text);
p[7]:=strtoint(q6.Text);
p[8]:=strtoint(q7.Text);
p[9]:=strtoint(q8.Text);
p[10]:=strtoint(q9.Text);
p[11]:=strtoint(q10.Text);
for i:=1 to 5 do begin
for j:=1 to 11 do begin
g[i,(j+i-1)]:=p[j];
end;
end;
// приведем к виду с единичной матрицей в начале
Normalize;
// создаем кодовую таблицу
for I := 1 to 1 shl 5 do
for j := 1 to 6 do
if (I and(1 shl (j - 1))) <> 0 then
XorArrays(FormationMatrix[I], g[j]);
end;
end;
Dmin:=Find(p);if Dmin=6 then dmin:=5;
RightError:=trunc(Dmin/2);
EditDmin.Text:=IntToStr(Dmin);
EditError.Text:=IntToStr(RightError);
for i:=1 to 5 do begin
for j:=1 to 10 do begin
R1[i,j]:=g[i,j+5];
end;
end;
for i:=1 to 10 do ZeroArray(H1[i]);
for i:=1 to 5 do
for j:=1 to 10 do
h1[j,i]:=r1[i,j];
for j:=6 to 15 do
h1[j-5,j]:=1;
GenerateSindromes;
end;
procedure TCool.N1Click(Sender: TObject);
begin
Matrix.Show;
end;
procedure TCool.FormCreate(Sender: TObject);
begin
GetMem(sindr,sizeof(integer)*5);
MaxSindr:=0;
end;
procedure TCool.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Dispose(sindr);
end;
end.