Документированный текст программы
program shhh; 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;
(* процедура кодирования сообщения *)
Procedure Coder; 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.
Популярное: Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация... Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (164)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |