Ðåôåðàò: Êîäîâûå êîìáèíàöèè íà îñíîâå öèêëè÷åñêèõ êîäîâ
TextColor(14);
GotoXY(2,4);
Write('Ðåçóëüòàò óìíîæåíèÿ: ');
BildMoveCodeMultiplication(m);
TextColor(9);
for i:=n downto 0 do
Write(m[i]);
GotoXY(2,5);
TextColor(14);
Write('Ïðîèçîøëà îøèáêà ... ');
MakeError(m,Error);
TextColor(9);
for i:=n downto 0 do
begin
if(i=Error)then
TextColor(12)
else
TextColor(9);
write(m[i]);
end;
GotoXY(2,6);
TextColor(14);
Write('Îøèáêà èñïðàâëåíà ! ');
TextColor(9);
Correction(m,p,r);
for i:=n downto 0 do
begin
if(i=Error)then
TextColor(10)
else
TextColor(9);
write(m[i]);
end;
Key:=false;
end;
end;
TextColor(14);
GotoXY(2,22);
Write('Íàæìèòå ëþáóþ êëàâèøó...');
Readln;
end;
3:begin
ClrScr;
GotoXY(1,24);
TextColor(14);
Writeln('Ðàáîòà ïðîãðàììû çàâåðøåíà ...');
Readln;
TextBackGround(0);
TextColor(15);
ClrScr;
Key:=true;
end;
end;
Until Key;
end.
§ 7 .Ðåçóëüòàòû ðàáîòû ïðîãðàììû
Ðåçóëüòàò ðàáîòû ïðîãðàììû ïðè îáðàçîâàíèè êîäà äîáàâëåíèåì îñòàòêà
Äåìîíñòðàöèÿ
Èíôîðìàöèîííûé ïîëèíîì: 0000011010111110011110110110110
Îáðàçóþùèé ïîëèíîì: 111101
Cëîæåíèe ïî ìîäóëþ 2 (F(x)+P(x)): 1101011111001111011011011000000
Îñòàòîê: 010101
Ïåðåäàâàåìûé ïîëèíîì: 1101011111001111011011011010101
Ïðîèçîøëà îøèáêà... 1101011111001110011011011010101
Îøèáêà èñïðàâëåíà! 1101011111001111011011011010101
Èñõîäíûé ïîëèíîì: 0000011010111110011110110110110
Íàæìèòå ëþáóþ êëàâèøó...
Ðåçóëüòàò ðàáîòû ïðè îáðàçîâàíèè êîäà óìíîæåíèåì
Äåìîíñòðàöèÿ
Èíôîðìàöèîííûé ïîëèíîì: 0000001010110000011111010001011
Îáðàçóþùèé ïîëèíîì: 111101
Ðåçóëüòàò óìíîæåíèÿ: 0110000011111010000100100101111
Ïðîèçîøëà îøèáêà... 0110000011111010000100100101101
Îøèáêà èñïðàâëåíà! 0110000011111010000100100101111
Íàæìèòå ëþáóþ êëàâèøó...
Âûâîäû:
Äàííàÿ ïðîãðàììà êîäèðóåò ñîîáùåíèÿ èñïîëüçóÿ öèêëè÷åñêèé êîä.
Ïðè ýòîì îíà èììèòèðóåò ðàáîòó êàíàëà äëÿ ïåðåäà÷è èíôîðìàöèè.
Ïðè âîçíèêíîâåíèè èñêëþ÷èòåëüíûõ ñèòóàöèé,êîãäà èíôîðìàöèîííîå ñëîâî ïî êàêèì-ëèáî ïðè÷èíàì ðàñêîäèðîâàòü íå óäà¸òñÿ, ïðîãðàììà ïîâòîðÿåò çàïðîñ íà ïåðåñûëêó äàííûõ, êàê ýòî äåëàåòñÿ â ðåàëüíûõ ñèòóàöèÿõ ïîäîáíîãî ðîäà.
Êðîìå ýòîãî, ïðîãðàììà ñëó÷àéíûì îáðàçîì, "ïðè ïðîõîæäåíèè
èíôîðìàöèîííîãî ñëîâà ÷åðåç êàíàë" äîïóñêàåò â ñëîâå îäíîêðàòíóþ îøáêó, çàòåì èñïðàâëÿåò åå, äåêîäèðóåò èíôîðìàöèîííîå ñëîâî è ïåðåäà¸ò ðåçóëüòàò ïîëüçîâàòåëþ.
Ëèòåðàòóðà
1. “Êîäèðîâàíèå èíôîðìàöèè (äâîè÷íûå êîäû)”.Áåðåçþê Í.Ò.,
Àíäðóùåíêî À.Ã., Ìîùèöêèé Ñ.Ñ. è äð. Õàðüêîâ,èçäàòåëüñêîå îáúåäè-
íåíèå “Âèùà øêîëà”,1978. 252 ñ.
2. “ Ïðîãðàììèðîâàíèå â ñðåäå Turbo Pascal “ . Ìàð÷åíêî À.È., Ìàð÷åíêî
Ë.À. Ìîñêâà,“Áèíîì Óíèâåðñàë”.Êèåâ,”Þíèîð”,1997.495 ñ.
Ïðèëîæåíèå ¹ 1
Ïðîöåäóðû è ôóíêöèè ìîäóëÿ _ññ31.
Unit _CC31;
Interface
Uses
Crt;
Const
n=30; { Èíôîðìàöèÿ+êîä }
n1=5; { Ðàçìåð êîíòðîëüíûõ ðàçðÿäîâ }
Type
Move_code=array[0..n] of byte; { Ïåðåäàâàåìûé ïîëèíîì F(x) }
Rest=array[0..n1] of byte; { Îñòàòîê }
Polinom=array[0..n1] of byte; { Îáðàçóþùèé ïîëèíîì P(x) }
Procedure Init(var m1:Move_code;var p1:Polinom;
var r1:Rest;var flag:integer);
Procedure FxPx(var m6:Move_Code);
Procedure Divizion(var m2:Move_code;var r2:Rest;
p2:Polinom;var flag:integer);
Procedure BildMoveCode(var m3:Move_code;r3:Rest;var flag:integer);
Procedure Decoder(var m6:Move_Code);
Procedure MakeError(var m4:Move_code;var err:integer);
Procedure BildMoveCodeMultiplication(var m7:Move_Code);
Procedure Correction(var m5:Move_code;p5:Polinom;var r5:Rest);
Implementation
Procedure Init;
var
i:integer;
begin
p1[5]:=1;
p1[4]:=1;
p1[3]:=1;
p1[2]:=1;
p1[1]:=0;
p1[0]:=1;
flag:=0;
for i:=n1 downto 0 do
r1[i]:=0;
Randomize;
for i:=n-n1 downto 0 do
m1[i]:=random(2);
end;
Procedure FxPx(var m6:Move_Code);
var
i:integer;
k:byte;
begin
k:=5;
while(k>0) do
begin
for i:=n downto 1 do
m6[i]:=m6[i-1];
dec(k);
end;
for i:=n1-1 downto 0 do
m6[i]:=0;
end;
Procedure Divizion(var m2:Move_code;var r2:Rest;
p2:Polinom;var flag:integer);
label
RETURN;
var
i,j,i1,kol,Countzero:integer;
begin
j:=n;
RETURN:while((j>=0)and(m2[j]=0))do dec(j);
if(j>n1)
then begin
for i:=n1 downto 0 do
begin
r2[i]:=m2[j];
dec(j);
end;
while(j>=0)do
begin
for i:=n1 downto 0 do
r2[i]:=r2[i] xor p2[i];
i1:=n1;
while((i1>=0)and(r2[i1]=0))do dec(i1);
if(i1=-1)then goto RETURN;
Kol:=n1-i1;
while(Kol>0)do
begin
for i:=n1 downto 1 do
r2[i]:=r2[i-1];
dec(Kol);
end;
Kol:=n1-i1;
while((Kol>0)and(j>=0))do
begin
r2[Kol-1]:=m2[j];
dec(Kol);
dec(j);
end;
if((j=-1)and(Kol=0))
then begin
for i:=n1 downto 0 do
r2[i]:=r2[i] xor p2[i];
end
else flag:=Kol;
end;
end
else if(n1=j)
then begin
for i:=n1 downto 0 do
begin
r2[i]:=m2[j];
dec(j);
end;
for i:=n1 downto 0 do
r2[i]:=r2[i] xor p2[i]
end
else if(j<n1)
then begin
for i:=j downto 0 do
r2[i]:=m2[i]
end;
end;
Procedure BildMoveCode(var m3:Move_code;r3:Rest;var flag:integer);
var
i,k:integer;
begin
if(flag>0)then
begin
k:=n1-flag;
for i:=n1 downto flag do
begin
m3[k]:=r3[i];
dec(k);
end;
end
else begin
for i:=n1-1 downto 0 do
m3[i]:=r3[i];
end;
end;
Procedure MakeError(var m4:Move_code;var err:integer);
begin
Randomize;
err:=Random(n);
m4[err]:=m4[err] xor 1;
end;
Procedure Decoder(var m6:Move_Code);
var
i:integer;
k:byte;
begin
k:=5;
while(k>0) do
begin
for i:=0 to n-1 do
m6[i]:=m6[i+1];
dec(k);
end;
for i:=n downto n-n1+1 do
m6[i]:=0;
end;
Procedure BildMoveCodeMultiplication(var m7:Move_Code);
var
m1,m2,m3,m4,mm:Move_Code;
i,j:integer;
begin
mm:=m7;
m1:=m7;
for j:=0 to 1 do
begin
for i:=n downto 1 do
m1[i]:=m1[i-1];
m1[j]:=0;
end;
m2:=m7;
for j:=0 to 2 do
begin
for i:=n downto 1 do
m2[i]:=m2[i-1];
m2[j]:=0;
end;
m3:=m7;
for j:=0 to 3 do
begin
for i:=n downto 1 do
m3[i]:=m3[i-1];
m3[j]:=0;
end;
m4:=m7;
for j:=0 to 4 do
begin
for i:=n downto 1 do
m4[i]:=m4[i-1];
m4[j]:=0;
end;
for i:=n downto 0 do
m7[i]:=mm[i] xor m1[i]xor m2[i]xor m3[i] xor m4[i];
end;
Procedure Correction(var m5:Move_code;p5:Polinom;var r5:Rest);
var
i,Correctflag,i1:integer;
Count,Countcarry,Carryflag:byte;
begin
Correctflag:=0;
Countcarry:=0;
repeat
for i:=n1 downto 0 do
r5[i]:=0;
Count:=0;
Divizion(m5,r5,p5,Correctflag);
i1:=n1;
while((i1>=Correctflag)and(r5[i1]=0))do dec(i1);
if({(i1=Correctflag-1) or
(}(i1=Correctflag)and(r5[Correctflag]=1)){)}
then m5[0]:=m5[0] xor r5[Correctflag]
else begin
Carryflag:=m5[n];
for i:=n downto 1 do
m5[i]:=m5[i-1];
m5[0]:=Carryflag;
inc(Countcarry);
end;
until ({(i1=Correctflag-1) or
(}(i1=Correctflag)and(r5[Correctflag]=1));{);}
while (Countcarry>0) do
begin
Carryflag:=m5[0];
for i:=0 to n-1 do
m5[i]:=m5[i+1];
m5[n]:=Carryflag;
dec(Countcarry);
end;
end;
end.
Ïðèëîæåíèå ¹ 2
Ïðîöåäóðû è ôóíêöèè ìîäóëÿ _Serv.
Unit _SERV;
Interface
Uses
Crt,Dos;
Const
EmptyBorder =0;
SingleBorder =1;
DoubleBorder =2;
BorderChar:array[0..2,1..6] of Char=
((#32,#32,#32,#32,#32,#32),
(#218,#196,#191,#179,#192,#217),
(#201,#205,#187,#186,#200,#188));
MaxChar =80;
MaxLine =25;
MenuTop =3;
SubMenuTop =2;
MenuLine :array[1..MenuTop]of string[20]=
(' Î ïðîãðàììå...',' Äåìîíñòðàöèÿ ' ‘Âûõîä ');
SubMenuLine :array[1..SubMenuTop]of string[20]=
(' Ñëîæåíèåì' , ' Óìíîæåíèåì');
Procedure SetWindow(x1,y1,x2,y2,Bord:byte;Header:string);
Procedure CursorOff;
Function GetMainMenuChoice:byte;
Function GetSubMenuChoice:byte;
Procedure About;
Implementation
Procedure SetWindow(x1,y1,x2,y2,Bord:byte;Header:string);
var
i:integer;
begin
if not ((x1<1) or (x2<=x1) or
(y1<1) or (y2<=y1) or (x2>MaxChar) or
(y2>MaxLine) or (Bord>2)) then
begin
GotoXY(x1,y1);
Write(BorderChar[Bord,1]);
for i:=1 to x2-x1-1 do
begin
GotoXY(x1+i,y1);
Write(BorderChar[Bord,2]);
end;
GotoXY(x2,y1);
Write(BorderChar[Bord,3]);
for i:=1 to y2-y1-1 do
begin
GotoXY(x1,y1+i);
Write(BorderChar[Bord,4]);
GotoXY(x2,y1+i);
Write(BorderChar[Bord,4]);
end;
GotoXY(x1,y2);
Write(BorderChar[Bord,5]);
for i:=1 to x2-x1-1 do
begin
GotoXY(x1+i,y2);
Write(BorderChar[Bord,2]);
end;
GotoXY(x2,y2);
Write(BorderChar[Bord,6]);
end;
GotoXY((x2-x1-ord(Header[0])) div 2+x1,y1);
Write(Header)
end;
Procedure CursorOff;
begin
asm
mov ah,1
mov ch,20h
int 10h
end;
end;
Function GetMainMenuChoice:byte;
var
Count:byte;
i:integer;
ch,ch1:char;
begin
Count:=1;
while KeyPressed do
ch:=Readkey;
repeat
for i:=1 to MenuTop do
begin
if(i=Count)then
begin
HighVideo;
TextColor(0);
end
else
begin
LowVideo;
TextColor(8);
end;
GotoXY(25,10+i);
Writeln(MenuLine[i]);
CursorOff;
end;
if KeyPressed
then begin
ch:=Readkey;
if(ch=#0)
then begin
ch1:=Readkey;
case ch1 of
#72 : if(Count>1)
then dec(Count);
#80 : if(Count<MenuTop)
then inc(Count);
end;
end;
end;
until(ch=#13);
GetMainMenuChoice:=Count;
end;
Function GetSubMenuChoice:byte;
var
Count:byte;
i:integer;
ch,ch1:char;
begin
Count:=1;
while KeyPressed do
ch:=Readkey;
repeat
for i:=1 to SubMenuTop do
begin
if(i=Count)then
begin
HighVideo;
TextColor(9);
end
else
begin
LowVideo;
TextColor(1);
end;
GotoXY(26,10+i);
Writeln(SubMenuLine[i]);
CursorOff;
end;
if KeyPressed
then begin
ch:=Readkey;
if(ch=#0)
then begin
ch1:=Readkey;
case ch1 of
#72 : if(Count>1)
then dec(Count);
#80 : if(Count<SubMenuTop)
then inc(Count);
end;
end;
end;
until(ch=#13);
GetSubMenuChoice:=Count;
end;
Procedure About;
begin
TextColor(15);
SetWindow(5,1,75,3,1,'Î ïðîãðàììå');
TextColor(10);
GotoXY(6,2);
TextColor(10+128);
Write('Òîêàðü Àëåêñåé Þðüåâè÷ ÀÏ-57.Êóðñîâîé ïðîåêò.
“Öèêëè÷åñêèé êîä” ');
end;
end.