Смекни!
smekni.com

Передача информации по каналу с решающей обратной связью (стр. 11 из 11)

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.