Реферат: Кодовые комбинации на основе циклических кодов
АННОТАЦИЯ
Документсодержит описание программы, которая строит кодовые комбинации на основециклических кодов. Программа кодирует и деко-дирует информационные слова.Иммитируется работа источника, переда-ющего информационное слово, кодировщика,кодирующего данное слово, канала связи и декодировщика, обнаруживающего иисправляющего ошибки в информационном полиноме. Программа работает по принципуприёмник – источник, так, как это реализовано в устройствах, передающихинформацию или обыкновенных приводах для внешних носителей в PC.
СОДЕРЖАНИЕ
1. Введение…6
2. Постановказадачи… 7
3. Операции надциклическими кодами… 8
4. Принциппостроения циклических кодов… 9
4.1. Получениекодовой комбинации добавлением остатка R(x)… 11
4.2. Получениекодовой комбинации умножением на образующий
полином…14
5. Разработкасхемы алгоритма… 15
6. Разработкатекста программы… 16
7. Результатыработы программы… 21
----------------------------------------------------------------------------------------------------
Литература........................................................................................ 23
Приложение № 1............................................................................... 24
Приложение № 2............................................................................... 30
§1 Введение
Код, в котором кодовая комбинация, полученная путем циклического сдвигаразрешенной кодовой комбинации является также разрешенной кодовой комбинациейназывается циклическим ( полиномиальным, кодом с циклическими избыточнымипроверками-ЦИП).
Сдвиг осуществляется справа налево, при этом крайний левый символпереносится в конец комбинации.
Циклический код относится к линейным, блочным, корректирующим,равномерным кодам.
В циклических кодах кодовые комбинации представляются в видемногочленов, что позволяет/> позволяетсвести действия над кодовыми комбинациями к действием над многочленами(используя аппарат полиномиальной алгебры).
Циклические коды являются разновидностью систематических кодов
и поэтомуобладают всеми их свойствами. Первоначально они были созданы для упрощения схемкодирования и декодирования. Их эффек-
тивность при обнаружениии исправлении ошибок обеспечила им широеое применение на практике.
Циклические коды используются в ЭВМ при последовательной передаче данных.
§2 Постановка задачи
Построить циклический код для передачи 31 разрядной кодовой комбинации сисправлением однократной ошибки ( n=31 ,s=1) двумя
способами.
Показать процесс обнаружения и исправления однократной ошибки впередаваемой кодовой комбинации. Составить программу, реализующую алгоритм кодирования,декодирования и исправления ошибки при передаче данных с использованиемциклического кода.
§3 Операции над циклическими кодами
1. Сдвигсправа налево осуществляется путем умножения полинома на x:
G(x)=x4+x2+1 Û 0010101;
G(x)×x=x5+x3+xÛ0101010.
2.Операции сложения и вычитания выполняются по модулю 2 .
Они являются эквивалентними и ассоциативными :
G1(x)+G2(x)=>G3(x);
G1(x) -G2(x)=>G3(x);
G2(x)+G1(x)=>G3(x);
Пример:
G1(x)=<sup/>x5 +x3+x;
G2(x)=x4+x3 +1;
G3(x)=G1(x)Å G2(x)= x5 +x4+x+1.
3.Операция деления является обычным делением многочленов, только вместовычитания используется сложеное по модулю 2 :
G1(x)=x6+x4+x3;
G2(x)=x3+x2+1 .
/>
/> x6+x4+x3 x3+x2+1
/> Å x6+x5+x3 x3+x2
x5 + x4
Å x5 + x4 +x2
/> x2
то же в двоичном коде:
/> 1011000 1101
/>/> Å1101 1100
1100
/> Å1101
100
Все операции легко реализуются аппаратно на регистрах сдвига собратными связям.
§ 4 Принцип построения циклических кодов
Идея построения циклических кодов базируется наиспользовании неприводимых многочленов. Неприводимым называетсямного-член, который не может бять представлен в виде произведения многочленовнизших степеней, т.е. такой многочлен делиться только на самого себя или наединицу и не делиться ни на какой другой многочлен. На такой многочленделиться без остатка двучлен xn+1.Неприводимые многочлены в теориициклических кодов играют роль образующих полиномов.
Чтобы понять принцип построения циклическогокода, умножаем комбинацию простого k-значного кода Q(x) на одночлен xr, азатем делина образующий полином P(x), степень которого равна r. В результатеумножения Q(x) на xr степень каждого одночлена, входящего в Q(x),повы-шается на r. При делении произведения xrQ(x) на образующийполином получается частное C(x) такой же степени, как и Q(x).Результат можнопредставить в вид
Q(x) xr R(x)
¾¾¾¾ = C(x) + ¾¾¾ , (1)
P(x) P(x)
где R(x) — остаток от деления Q(x) xr на P(x).
Частное C(x) имеет такую же степень, как и кодовая комбинация Q(x)простого кода, поэтому C(x) является кодовой комбинацией этого же
постого k-значного кода. Следует заметить, что степень остатка не можетбыть больше степени образующего полинома, т.е. его наивысшая степень может бытьравна (r-1). Следовательно, наибольшее число разрядов остатка R(x) не превышаетчисла r.
Умножая обе части равенства (1) на P(x) и произведя некоторыеперестановки получаем :
F(x) = C(x) P(x) = Q(x) xr+ R(x) (2)
Таким образом, кодовая комбинация циклического n-значного кода может
быть получена двумя способами:
1) умножение кодовой комбинации Q(x) простогокода на одночлен xr
и добавление к этому произведению остатка R(x), полученного врезультате деления произведения Q(x) xr на образующий полином P(x);
2) умножения кодовой комбинации C(x) простогоk-значного на образующий полином P(x).
При построении циклических кодов первым способомрасроложение информационных символов во всех комбинациях строго упорядочено -
они занимают k старших разрядов комбинации, а остальные (n-k) разрядов
отводятся под контрольные.
При втором способе образования циклических кодов информа-
ционные и контрольные символы в комбинациях циклического кода неотделены друг от друга, что затрудняет процесс декодирования.
§4.1 Получение кодовой комбинации добавлением остатка R(x)
Построить циклический код для передачи 31 разрядной кодовой
комбинации сисправлением однократной ошибки ( n=31, s=1)
Решение.
1. Определимчисло контрольных разрядов — m :
m = log2(n+1) = log2 (31+1) = 5.
2. Определимколичество информационных разрядов k :
k = n-m = 26,
т.е получили(31, 26 ) — код .
3. Строиминформационный полином, сответствующий информационному слову длинойk-бит:
G(x)=00000000000000000000000101= x2 +1.
4. Осуществлямсдвиг кода влево на m=n-k=5 разрядов т.е полином G(x) умножается на xm:
xmG(x)= (x2+1) x5= x7+ x5=0000000000000000000000010100000.
5. Выбираетсяобразующий многочлен-P(x) по таблице неприводимых многочленов. Для исправленияодиночной ошибки (d0=3) образующий полином P(x) должен быть степениm=n-k=5 и количеством ненулевых членов не меньше минимального кодовогорасстояния d0=3. Исходя из
этого образуюшийполином P(x) равен :
P(x)= x5 +<sup/>x4 +x3 +x2 +1 =<sup/>111101.
6. Определим остаток R(x) от деления G(x)×x m на образующий по-
линомP(x)
/>/>/>/> x7+ x5 x5 +<sup/>x4 +x3 +x2 +1 10100000 111101
/>/> x7 +<sup/>x6 +x5 +x4 +x2 x2+x +1 111101 111
/>/> x6 +<sup/>x4 +x2 101010
/>/>/>/> x6 +<sup/>x5 +x4 +x3+x 111101
x5 +<sup/>x3 +x2 +x 101110
/>/> x5 +<sup/>x4 +x3 +x2+1 111101
x4 +x<sup/>+1 10011
Остаток R(x)= x4+x+1=10011.
7. Строимпередаваемый кодовый пролином F(x) :
F(x)=xm G(x)ÅR(x)= x7+ x5+<sup/>x4+x+1<sup/>=0000000000000000000000010110011.
8. Пусть впринятом сообщении произошла ошибка в тридцать первом разряде, при зтом принятоекодовое сообщение имеет вид :
F¢(x)=F(x) ÅE(x)= 1000000000000000000000010110011.
9. Разделим многочлен F1(x)соотвествующий полученной кодовой ком-бинации на образующий полином, при этомвес остатка (количество единиц в коде остатка) должен быть меньше или равенколичеству ошибок W £S
/>/> 1000000000000000000000010110011 111101
/> 111101
111010
/> 111101
111000
/> 111101
101000
111101
/> 101010
/> 111101
101110
/> 111101
100110
/> 111101
110110
/> 111101
101100
111101
/> 100010
/> 111101
111110
111101
/> 110010
/> 111101
111111
111101
/> 100011
/> 111101
11110
Сравниваем вес полученного остатка w с числом исправляемыхошибок
w>s .
10. Производим циклический сдвиг принятой кодовой комбинациина один
разряд влево и повторяем п.9 пока w £ s.
/>a)0000000000000000000000101100111 111101
/>/> 111101
100011
/> 111101
111101
111101
/> 1 Þ w=s .
Складываем по модулю 2 последнееделимое с последним остатком:
0000000000000000000000101100111
/>/>/>/>Å 1
0000000000000000000000101100110
Осуществляем обратный сдвиг на 1разряд полученной комбинации
0000000000000000000000010110011
Отбросив контрольные разряды,получаем переданное информацинное слово.
§4.2 Построение кодовой комбинации путем умножения
на образующийполином
Построитьциклический код для передачи 31 разрядной кодовой
комбинации с исправлениемоднократной ошибки ( n=31, s=1) путем умножения образующего многочлена намногочлен полного 31 разрядного кода.
Решение.
1. Строим информационныйполином, сответствующий информационному слову длиной k-бит:
G(x)=00000000000000000000000101=x2 +2.
2. Строимпередаваемый кодовый полином
00000000000000000000000101
111101
/>/>/>/> 00000000000000000000000101
00000000000000000000000101
00000000000000000000000101
00000000000000000000000101
/>/>/>/>/> 00000000000000000000000101
0000000000000000000000011001001
3. Процесс исправленияоднократной ошибки аналогичен описанному
в § 4.1.
§5. Разработка схемы алгоритма
/>/>
Ciclic code
/> /> /> /> /> /> /> /> <td/> />/> нет
/>/>/>
да
/> /> /> /> /> /> <td/> /> /> /> /> />/>/>/>/>/>/>/>/>/>/>
нет
да
Конец
§6. Разработка текста программы
Дляпредставления информационного слова в памяти используется
массив. Всостав программы входит основная программа и два модуля,
реализующиеалгоритм кодирования и декодирования информационных слов и диалога спользователем соответственно.
ProgramCyclic_Code;
Uses
Crt,_CC31,_Serv;
Var
m,mm:Move_code;
p:Polinom;
r:Rest;
i,Mainflag,From,Error:integer;
Switch:byte;
Key:boolean;
begin
Repeat
Key:=true;
TextColor(11);
TextBackGround(7);
Clrscr;
SetWindow(24,10,45,14,2,'Главное меню ');
Switch:=GetMainMenuChoice;
caseSwitch of
1:begin
About;
Readln;
Key:=False;
end;
2: begin
TextColor(0);
ClrScr;
SetWindow(25,10,40,13,1,' Образовать ');
Switch:=GetSubMenuChoice;
case Switch of
1:begin
TextBackGround(0);
TextColor(15);
ClrScr;
SetWindow(1,1,79,24,2,'Демонстрация');
TextColor(14);
GotoXY(2,2);
Init(m,p,r,MainFlag);
Write(‘Информационныйполином ');
TextColor(2);
for i:=n downto 0 do
begin
if(i<n-n1+1)then Textcolor(9);
Write(m[i]);
end;
TextColor(14);
GotoXY(2,3);
Write('Образующийполином ');
TextColor(13);
fori:=n1 downto 0 do
Write(p[i]);
TextColor(14);
GotoXY(2,4);
Write('Сложениепо модулю 2 (F(x)+P(x)): ');
FxPx(m);
TextColor(9);
fori:=n downto 0 do
begin
if(i<n1)then TextColor(2);
Write(m[i]);
end;
TextColor(14);
GotoXY(2,5);
Write('Остаток: ');
Divizion(m,r,p,Mainflag);
TextColor(11);
fori:=n1 downto Mainflag do
Write(r[i]);
GotoXY(2,6);
TextColor(14);
Write('Передаваемыйполином: ');
BildMoveCode(m,r,Mainflag);
TextColor(9);
fori:=n downto 0 do
begin
if(i<n1) then TextColor(11);
Write(m[i]);
end;
GotoXY(2,7);
TextColor(14);
Write('Произошлаошибка... ');
MakeError(m,Error);
TextColor(9);
fori:=n downto 0 do
begin
if(i=Error)then
TextColor(12)
else
TextColor(9);
write(m[i]);
end;
GotoXY(2,8);
TextColor(14);
Write('Ошибкаисправлена! ');
TextColor(9);
Correction(m,p,r);
fori:=n downto 0 do
begin
if(i=Error)then
TextColor(10)
else
TextColor(9);
write(m[i]);
end;
TextColor(14);
GotoXY(2,9);
Write('Исходныйполином: ');
Decoder(m);
TextColor(2);
fori:=n downto 0 do
begin
if(i<n-n1+1)then Textcolor(9);
Write(m[i]);
end;
Key:=false;
end;
2:begin
TextBackGround(0);
TextColor(15);
ClrScr;
SetWindow(1,1,79,24,2,'Демонстрация');
TextColor(14);
GotoXY(2,2);
Init(m,p,r,MainFlag);
Write('Информационныйполином: ');
TextColor(2);
for i:=n downto 0 do
begin
if(i<n-n1+1)then Textcolor(9);
Write(m[i]);
end;
TextColor(14);
GotoXY(2,3);
Write('Образующийполином: ');
TextColor(13);
fori:=n1 downto 0 do
Write(p[i]);
TextColor(14);
GotoXY(2,4);
Write('Результатумножения: ');
BildMoveCodeMultiplication(m);
TextColor(9);
fori:=n downto 0 do
Write(m[i]);
GotoXY(2,5);
TextColor(14);
Write('Произошлаошибка ... ');
MakeError(m,Error);
TextColor(9);
fori:=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);
fori:=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) }
ProcedureInit(var m1:Move_code;var p1:Polinom;
var r1:Rest;var flag:integer);
ProcedureFxPx(var m6:Move_Code);
ProcedureDivizion(var m2:Move_code;var r2:Rest;
p2:Polinom;var flag:integer);
ProcedureBildMoveCode(var m3:Move_code;r3:Rest;var flag:integer);
ProcedureDecoder(var m6:Move_Code);
ProcedureMakeError(var m4:Move_code;var err:integer);
ProcedureBildMoveCodeMultiplication(var m7:Move_Code);
ProcedureCorrection(var m5:Move_code;p5:Polinom;var r5:Rest);
Implementation
ProcedureInit;
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:=n1downto 0 do
r1[i]:=0;
Randomize;
fori:=n-n1 downto 0 do
m1[i]:=random(2);
end;
ProcedureFxPx(var m6:Move_Code);
var
i:integer;
k:byte;
begin
k:=5;
while(k>0)do
begin
for i:=ndownto 1 do
m6[i]:=m6[i-1];
dec(k);
end;
fori:=n1-1 downto 0 do
m6[i]:=0;
end;
ProcedureDivizion(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))dodec(j);
if(j>n1)
thenbegin
for i:=n1 downto 0 do
begin
r2[i]:=m2[j];
dec(j);
end;
while(j>=0)do
begin
fori:=n1 downto 0 do
r2[i]:=r2[i] xor p2[i];
i1:=n1;
while((i1>=0)and(r2[i1]=0))dodec(i1);
if(i1=-1)thengoto 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
fori:=n1 downto 0 do
r2[i]:=r2[i] xor p2[i];
end
else flag:=Kol;
end;
end
elseif(n1=j)
then begin
fori:=n1 downto 0 do
begin
r2[i]:=m2[j];
dec(j);
end;
fori:=n1 downto 0 do
r2[i]:=r2[i] xor p2[i]
end
elseif(j<n1)
thenbegin
fori:=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;
fori:=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;
ProcedureMakeError(var m4:Move_code;var err:integer);
begin
Randomize;
err:=Random(n);
m4[err]:=m4[err] xor 1;
end;
ProcedureDecoder(var m6:Move_Code);
var
i:integer;
k:byte;
begin
k:=5;
while(k>0) do
begin
for i:=0to n-1 do
m6[i]:=m6[i+1];
dec(k);
end;
for i:=ndownto n-n1+1 do
m6[i]:=0;
end;
ProcedureBildMoveCodeMultiplication(var m7:Move_Code);
var
m1,m2,m3,m4,mm:Move_Code;
i,j:integer;
begin
mm:=m7;
m1:=m7;
for j:=0to 1 do
begin
fori:=n downto 1 do
m1[i]:=m1[i-1];
m1[j]:=0;
end;
m2:=m7;
for j:=0to 2 do
begin
fori:=n downto 1 do
m2[i]:=m2[i-1];
m2[j]:=0;
end;
m3:=m7;
for j:=0to 3 do
begin
fori:=n downto 1 do
m3[i]:=m3[i-1];
m3[j]:=0;
end;
m4:=m7;
for j:=0to 4 do
begin
fori:=n downto 1 do
m4[i]:=m4[i-1];
m4[j]:=0;
end;
for i:=ndownto 0 do
m7[i]:=mm[i]xor m1[i]xor m2[i]xor m3[i] xor m4[i];
end;
ProcedureCorrection(var m5:Move_code;p5:Polinom;var r5:Rest);
var
i,Correctflag,i1:integer;
Count,Countcarry,Carryflag:byte;
begin
Correctflag:=0;
Countcarry:=0;
repeat
fori:=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)){)}
thenm5[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];
fori:=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
ProcedureSetWindow(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]);
fori:=1 to x2-x1-1 do
begin
GotoXY(x1+i,y1);
Write(BorderChar[Bord,2]);
end;
GotoXY(x2,y1);
Write(BorderChar[Bord,3]);
fori:=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]);
fori:=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;
ProcedureCursorOff;
begin
asm
mov ah,1
movch,20h
int 10h
end;
end;
FunctionGetMainMenuChoice:byte;
var
Count:byte;
i:integer;
ch,ch1:char;
begin
Count:=1;
whileKeyPressed do
ch:=Readkey;
repeat
for i:=1to 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;
ifKeyPressed
thenbegin
ch:=Readkey;
if(ch=#0)
then begin
ch1:=Readkey;
case ch1 of
#72: if(Count>1)
thendec(Count);
#80:if(Count<MenuTop)
theninc(Count);
end;
end;
end;
until(ch=#13);
GetMainMenuChoice:=Count;
end;
FunctionGetSubMenuChoice: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)
thendec(Count);
#80:if(Count<SubMenuTop)
theninc(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.