NXT<='0';
elsif (R1='0' and R2='1' and R3='0' and R4='0' and R5='0') then
ERCOR<='1';
NXT<='0';
elsif (R1='0' and R2='0' and R3='1' and R4='0' and R5='0') then
ERCOR<='1';
NXT<='0';
elsif (R1='0' and R2='0' and R3='0' and R4='1' and R5='0') then
ERCOR<='1';
NXT<='0';
elsif (R1='0' and R2='0' and R3='0' and R4='0' and R5='1') then
ERCOR<='1';
NXT<='0';
else
ERCOR<='0';
NXT<='0';
end if;
end process;
END decoder5;
programshhh;
uses Crt;
const
On=516; {курсорвключён}
Off=1600; {курсор выключен}
n=14; {общее число символов сообщения}
k=9; {число информационных символов}
s=1; {число исправляемых символов}
{Образующаяматрица}
a:Array[1..k,1..n]Of Byte=((0,0,0,0,0,0,0,0,1,0,0,1,1,1),
(0,0,0,0,0,0,0,1,0,0,1,1,1,0),
(0,0,0,0,0,0,1,0,0,1,1,1,0,0),
(0,0,0,0,0,1,0,0,0,1,1,1,1,1),
(0,0,0,0,1,0,0,0,0,1,1,0,0,1),
(0,0,0,1,0,0,0,0,0,1,0,1,0,1),
(0,0,1,0,0,0,0,0,0,0,1,1,0,1),
(0,1,0,0,0,0,0,0,0,1,1,0,1,0),
(1,0,0,0,0,0,0,0,0,1,0,0,1,1));
stepen=6; {степень образующего многочлена=6, т.к.
порядковый номер степени начинаем
отсчитывать не с 0, а с 1 }
{Образующий многочлен :
X^5 + X^2 + X + 1}
Polynom:Array[1..stepen]Of byte=(1,0,0,1,1,1);
MenuColor=3; {цвет активного пункта меню}
GroundColor=white; {цвет фона}
CodeLine=5; {номер строки ввода кода}
G_CodeLine=6; {номер строки закодированного сообщения}
D_CodeLine=8; {номер строки искажённого сообщения}
C_CodeLine=7; {номер строки исправленного сообщения}
Begin_Line=34; {номер столбца начала строк}
var
menu_p:array[1..18] of string[19]; {массив названий пунктов меню}
n_pun,from:byte; {текущий номер пункта меню}
n_z:integer; {количество записей в базе данных}
key:char; {нажатая клавиша}
i,j,x:byte; {счетчик}
Code:Array[1..k]Of Boolean; {начальная кодовая комбинация}
G_Code:Array[1..n]Of Byte; {закодированная кодовая комбинация}
(* ИНИЦИАЛИЗАЦИЯ *)
PROCEDURE init;
begin
menu_p[1]:=' КОДИРОВКА';
menu_p[2]:=' ПОМОЩЬ ';
menu_p[3]:=' О ПРОГРАММЕ';
menu_p[4]:=' ВЫХОД ';
menu_p[5]:=' СПРАВКА ';
menu_p[6]:=' АВТОР ';
menu_p[7]:=' ДА ';
menu_p[8]:=' НЕТ ';
end;
(* процедура работы с курсором *)
Procedure Cursor(q:Integer);
Begin Asm
mov AH,01h
mov CX,q
Int 10h
End End;
(* Процедура рисования простого окна *)
PROCEDURE win(x1,y1,x2,y2,color:byte);
begin
textbackground(color);
window(x1,y1,x2,y2);
clrscr;
end;
(* Процедура рисования окна с рамкой, тенью и заголовком *)
PROCEDURE wind(x1,y1,x2,y2,foncol,textcol:byte;zagl:string);
var pos:byte; {позиция х для заголовка окна}
i,j:integer; {счетчики}
begin
window(1,1,80,25);
textbackground(cyan);
textcolor(darkgray);
for i:=y1 to y2+2 do
begin
gotoxy(x1-1,i);
for j:=x1-1 to x2+4 do
write(chr(177));
end;
win(x1-2,y1-1,x2+2,y2+1,foncol);
textcolor(textcol);
gotoxy(3,1);
for i:=1 to x2-x1+1 do
write(chr(205));
gotoxy(3,3-y1+y2);
for i:=1 to 1+x2-x1 do
write(chr(205));
for i:=1 to y2-y1+1 do
begin
gotoxy(2,i+1);
writeln(chr(186));
end;
for i:=1 to 1+y2-y1 do
begin
gotoxy(4+x2-x1,i+1);
write(chr(186));
end;
gotoxy(2,1);
write(chr(201));
gotoxy(2,y2-y1+3);
write(chr(200));
gotoxy(x2-x1+4,1);
write(chr(187));
gotoxy(x2-x1+4,y2-y1+3);
write(chr(188));
pos:=3+((x2-x1) div 2)-(length(zagl) div 2);
gotoxy(pos,1);
write(zagl);
window(x1,y1,x2,y2);
end;
(* Процедура "Нажмите любую клавишу" *)
PROCEDURE wait_key;
var w_k:char; {ожидаемаяклавиша}
begin
win(1,25,80,25,white);
textcolor(black);
write(' Нажмите любую клавишу');
w_k:=readkey;
if w_k=#0 then w_k:=readkey;
end;
(* Процедура вывода "справки" *)
PROCEDURE spravka;
begin
wind(27,3,75,13, white,black,' Справка ');
textcolor(black);
write;
WriteLn('Данная программа позволяет закодировать сооб-');
WriteLn('щение с помощью циклического кода с корректиру-');
WriteLn('ющей способностью d=4. Первые 9 символов -');
WriteLn('информационные, остальные 5 - контрольные.');
WriteLn;
WriteLn('Программа написана студентом 4 курса СФ МЭИ(ТУ)-');
WriteLn('Власовым А.В. в качестве приложения к выпускной');
writeln('работе.');
wait_key;
writeln;
win(1,1,80,24,cyan);
end;
(* Процедура вывода помощи-используемые клавиши *)
PROCEDURE helper;
begin
wind(9,4,59,15,white,black,' Помощь ');
textcolor(0);
writeln('Используемые клавиши:');
writeln;
writeln(' F1 - помощь');
writeln(' Esc - отмена, выход');
writeln(' "Пробел" - ввод символа кода : [0,1]');
writeln(' BackSpace - Удаление предыдущего символа');
writeln;
wait_key;
win(1,1,80,24,cyan);
end;
(*Процедура вывода информации об авторе *)
PROCEDURE avtor;
begin
wind(16,7,60,15,white,black,' Обавторе ');
textcolor(0);
writeln;
writeln(' Студент : ВласовА.В.');
writeln(' Группа : ВМ-2-00');
writeln(' Руководитель : Каевченко М.А.');
writeln;
writeln;
writeln(' Смоленск 2004 г.');
wait_key;
win(1,1,80,24,3);
end;
(* Процедура вывода подсказки в нижней строке *)
PROCEDURE vnizu;
begin
win(1,25,80,25,white);
textcolor(black);write(' ',chr(24),chr(25),' │ ',chr(27),chr(26),' │ ');
textcolor(red);write('Enter ');
textcolor(black);write('Выбор│ ');
textcolor(red);write('F1 ');
textcolor(black);write('Помощь│ ');
textcolor(red);write('Esc ');
end;
(*Процедура выхода из программы *)
PROCEDURE final(var from:byte);{номер пункта меню, на котором находились}
var n_p:byte;{номер позиции в меню выхода}
i:integer; {счетчик}
begin
win(4,from+2,20,from+2,white);
textcolor(black);
write(menu_p[from]);
win(4,6,19,6,3);
textcolor(white);
write(' ВЫХОД');
n_p:=1;
repeat
repeat
vnizu;textcolor(black);write('Отменавыхода');
wind(29,10,42,11,white,black,'');
for i:=1 to 2 do
begin
if i=n_p then
begin
textbackground(3);
textcolor(white);
end
else begin
textbackground(white);
textcolor(black);
end;
if i=2 then write(menu_p[8])
else writeln(menu_p[7]);
end;
key:=readkey;
if key=#0 then key:=readkey;
case key of
#80:begin {Вниз}
n_p:=n_p+1;
if n_p>2 then n_p:=1;
end;
#72:begin {Вверх}
n_p:=n_p-1;
if n_p<1 then n_p:=2;
end;
#27,#75:begin {Esc}
n_p:=2;
break;
end;
end;
until (key=#13) or (key=#77);
case n_p of
1:begin
cursor(on);
textcolor(lightgray);
win(1,1,80,25,0);
halt;init;
end;
2:begin
win(1,1,80,25,3);
exit;
end;
end;
until false;
end;
(*Процедура вывода меню для пункта "О программе" *)
PROCEDURE o_progr;
var n_p:byte;{номер позиции в меню выхода}
i:integer; {счетчик}
begin
n_p:=1;
repeat
repeat
vnizu;textcolor(black);write('Выход');
wind(26,9,37,10,white,black,'');
for i:=1 to 2 do
begin
if i=n_p then
begin
textbackground(3);
textcolor(white);
end
else begin
textbackground(white);
textcolor(0);
end;
if i=2 then write(menu_p[6])
else writeln(menu_p[5]);
end;
key:=readkey;
if key=#0 then key:=readkey;
case key of
#80:begin {Вниз}
n_p:=n_p+1;
if n_p>2 then n_p:=1;
end;
#72:begin {Вверх}
n_p:=n_p-1;
if n_p<1 then n_p:=2;
end;
#27,#75:begin {Esc}
win(1,1,80,24,3);
exit;
end;
end;
until (key=#13) or (key=#77);
case n_p of
1:begin {справка}
spravka;
exit;
end;
2:begin {отменавыхода}
avtor;
exit;
end;
end;
until false;
end;
(* процедуравыхода *)
Procedure Quit;
begin
clrscr;
cursor(off);
init;
n_pun:=1;
win(1,1,80,25,3);
repeat
repeat
vnizu;
textcolor(0);
write('Выход');
wind(4,3,20,6,white,0,'');
for i:=1 to 4 do
begin
if i=n_pun then
begin
textbackground(3);
textcolor(white);
end
else begin
textbackground(white);
textcolor(0);
end;
if i=4 then write(menu_p[4])
else writeln(menu_p[i]);
end;
from:=4;
key:=readkey;
if key=#0 then key:=readkey;
case key of
#27:begin {Esc}
from:=n_pun;
n_pun:=4;
break;
end;
#59:helper; {F1}
#80:begin {Вниз}
n_pun:=n_pun+1;
if n_pun>4 then n_pun:=1;
end;
#72:begin {Вверх}
n_pun:=n_pun-1;
if n_pun<1 then n_pun:=4;
end;
end;
until (key=#13) or (key=#77);
case n_pun of
{1:visio;}
2:helper; {помощь}
3:o_progr; {опрограмме}
4:final(from); {выход}
end;
until false;
end;
(* процедуравводакода *)
Procedure Input;
Begin
X:=2;
GotoXY(Begin_Line+x,CodeLine-1);
Write('k9k8k7k6k5k4k3k2k1m5m4m3m2m1');
For i:=1 to k Do
Begin
GotoXY(Begin_Line+X+2*(i-1),CodeLine);
If Code[i]Then Write('1')Else Write('0');
End;
TextBackGround(MenuColor);
GotoXY(Begin_Line+X,CodeLine);
If Code[x div 2]Then Write('1') Else Write('0');
Repeat
Key:=ReadKey;
Case Key of
#0:Begin
Key:=ReadKey;
TextBackGround(GroundColor);
GotoXY(Begin_Line+X,CodeLine);
If Code[x div 2]Then Write('1') Else Write('0');
Case Key of
#77:If X<2+(k-1)*2 Then X:=X+2 else x:=2;
#75:If X>2 Then X:=X-2 else x:=2+(k-1)*2;
End;
TextBackGround(MenuColor);
GotoXY(Begin_Line+X,CodeLine);
If Code[x div 2]Then Write('1') Else Write('0');
End;
#27:quit;
{begin clrscr; cursor(off);init; final(from); end;}
#32:Begin
Code[x div 2]:=Not Code[x div 2];
GotoXY(Begin_Line+X,CodeLine);
If Code[x div 2]Then Write('1') Else Write('0');
End;
End;
Until Key=#13;
TextBackGround(GroundColor);
GotoXY(Begin_Line+X,CodeLine);
If Code[x div 2]Then Write('1') Else Write('0');
End;
(* процедура кодирования сообщения *)
ProcedureCoder;
Begin
For i:=1 to n do G_Code[i]:=0;
For i:=1 to k do Begin
If Code[k+1-i] Then Begin
For j:=1 to n Do Begin
G_Code[j]:=G_Code[j]+a[i,j];
If g_Code[j]=2 Then G_Code[j]:=G_Code[j]-2;
End;
End;
End;
For i:=1 to n Do Begin
GotoXY(Begin_Line+2*i,G_CodeLine);
Write(G_Code[i]);
End;
End;
(* процедура сдвига кода влево *)
procedure Left;
begin
x:=G_Code[1];
for i:=1 to n-1 do G_Code[i]:=G_Code[i+1];
G_Code[14]:=x; {!!!!!!!!!!15!!!!!!111}
end;
(* процедура сдвига кода вправо *)
Procedure Shift_Rigth;
Begin
x:=G_Code[14];{!!!!!!!!!!!15!!!!!!!!1}
For i:=n downto 2 do G_Code[i]:=G_Code[i-1];
G_Code[1]:=x;
End;
(* процедура декодирования *)
Procedure decoder;
Var b:Array[1..n] of byte;
w,AmountShift:byte;
Begin
AmountShift:=0;
Repeat
w:=0;
For i:=1 to n Do b[i]:=G_Code[i];
For i:=1 to n-stepen+1 Do
Begin
If b[i]=1 Then
Begin
For j:=i to stepen+i do
Begin
b[j]:=b[j]+Polynom[j-i+1];
if b[j]=2 Then
b[j]:=0;
End;
End;
End;
For i:=1 to n do If b[i]=1 Then Inc(w);
If w>s Then
Begin
Left;
Inc(AmountShift);
End
Else
Begin
For i:=1 to n Do
Begin
G_Code[i]:=G_Code[i]+b[i];
If G_Code[i]=2 then G_Code[i]:=0;
End;
w:=0;
End;
Until (w=0) Or (AmountShift=n);
If w=0 Then
Begin
While AmountShift>0 Do
Begin
Dec(AmountShift);
Shift_Rigth;
End;
For i:=1 to n Do
Begin
GotoXY(Begin_Line+2*i,D_CodeLine);
write(G_Code[i]);
End;
End
Else
Begin
GotoXY(Begin_Line+2,D_CodeLine);
Write('Невозможно расшифровать комбинацию');
End;
End;
(* процедураизменениякода *)
Procedure Change_Code;
begin
x:=2;
For i:=1 to n Do Begin
GotoXY(Begin_Line+X+2*(i-1),C_CodeLine);
If G_Code[i]=1Then Write('1')Else Write('0');
End;
TextBackGround(MenuColor);
GotoXY(Begin_Line+X,C_CodeLine);
If G_Code[x div 2]=1Then Write('1') Else Write('0');
Repeat
Key:=ReadKey;
Case Key of
#0:Begin
Key:=ReadKey;
TextBackGround(GroundColor);
GotoXY(Begin_Line+X,C_CodeLine);
If G_Code[x div 2]=1Then Write('1') Else Write('0');
Case Key of
#77:If X<2+(n-1)*2 Then X:=X+2 else x:=2;
#75:If X>2 Then X:=X-2 else x:=2+(n-1)*2;
End;
TextBackGround(MenuColor);
GotoXY(Begin_Line+X,C_CodeLine);
If G_Code[x div 2]=1Then Write('1') Else Write('0');
End;
#27:Exit;
#32:Begin
G_Code[x div 2]:=1-G_Code[x div 2];
GotoXY(Begin_Line+X,C_CodeLine);
If G_Code[x div 2]=1 Then Write('1') Else Write('0');
End;
End;
Until Key=#13;
TextBackGround(GroundColor);
GotoXY(Begin_Line+X,C_CodeLine);
If G_Code[x div 2]=1Then Write('1') Else Write('0');
end;
(*Процедура ввода и обработки кодового сообщения*)
procedure visio;
Begin
Cursor(Off);
Init;
Repeat
ClrScr;
wind(2,3,78,24,white,black,' Кодирование ');
GotoXY(3,12);
TextColor(0);
GotoXY(3,codeLine);
Write('Посылаемыйкод :');
GotoXY(3,G_codeLine);
Write('Закодированныйкод :');
GotoXY(3,C_codeLine);
Write('Измененный код :');
GotoXY(3,D_codeLine);
Write('Декодированный код :');
Input;
Coder;
Change_Code;
decoder;
Repeat
Key:=ReadKey;
If Key=#27 Then exit;
Until Key=#13;
Until False;
End;
(* ГЛАВНЫЙ МОДУЛЬ *)
(* Вывод меню.Вызов соответствующих модулей *)
begin
cursor(off);
init;
n_pun:=1;
win(1,1,80,25,3);
repeat
repeat
vnizu;
textcolor(0);
write('Выход');
wind(4,3,20,6,white,0,'');
for i:=1 to 4 do
begin
if i=n_pun then
begin
textbackground(3);
textcolor(white);
end
else begin
textbackground(white);
textcolor(0);
end;
if i=4 then write(menu_p[4])
else writeln(menu_p[i]);
end;
from:=4;
key:=readkey;
if key=#0 then key:=readkey;
case key of
#27:begin {Esc}
from:=n_pun;
n_pun:=4;
break;
end;
#59:helper; {F1}
#80:begin {Вниз}
n_pun:=n_pun+1;
if n_pun>4 then n_pun:=1;
end;
#72:begin {Вверх}
n_pun:=n_pun-1;
if n_pun<1 then n_pun:=4;
end;
end;
until (key=#13) or (key=#77);
case n_pun of
1:visio;
2:helper; {помощь}
3:o_progr; {опрограмме}
4:final(from); {выход}
end;
until false;
end.