Смекни!
smekni.com

Задание на курсовую работу 2 (стр. 6 из 6)


ошибкой или нет), номера разрядов с ошибками.

Если в качестве полинома ошибки вводится разрешенная кодовая комбинация, то программа воспринимает переданную комбинацию, как правильную. Это связано со свойствами циклического кода.

Если программа может исправить ошибки, то она пишет номера разрядов с ошибками в окне.




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.