АНОТАЦІЯ
Документ містить опис програми, яка будує кодові комбінації на основі циклічних кодів. Програма кодує і деко-дірует інформаційні слова. Іммітіруется робота джерела, переда-ющего інформаційне слово, кодувальника, що кодує дане слово, каналу зв'язку і декодувальник, виявляти і виправляти помилки в інформаційному полінома. Програма працює за принципом приймач - джерело, так, як це реалізовано в пристроях, що передають інформацію або звичайних приводах для зовнішніх носіїв в PC.
ЗМІСТ
1. Введення
2. Постановка завдання
3. Операції над циклічними кодами
4. Принцип побудови циклічних кодів
4.1. Отримання кодової комбінації додаванням залишку R (x)
4.2. Отримання кодової комбінації множенням на який утворює
поліном
5. Розробка схеми алгоритму
6. Розробка тексту програми
7. Результати роботи програми
Література
Додаток № 1
Додаток № 2
§ 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) = 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 старших розрядів комбінації, а решта (nk) розрядів
відводяться під контрольні.
При другому способі освіти циклічних кодів інфор-
ційних і контрольні символи в комбінаціях циклічного коду не відокремлені один від одного, що ускладнює процес декодування.
(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 = nk = 5 розрядів тобто поліном G (x) множиться на xm:
xm G (x) = (x2 +1) x5 = x7 + x5 = 0000000000000000000000010100000.
5. Вибирається створюючий многочлен-P (x) за таблицею непріводімих многочленів. Для виправлення одиночної помилки (d0 = 3) утворює полином P (x) повинен бути ступеня m = nk = 5 і кількістю ненульових членів не менше мінімального кодового відстані d0 = 3. Виходячи з
цього образуюшій полином P (x) дорівнює:
P (x) = x5 + x4 + x3 + x 2 +1 = 111101.
6. Визначимо залишок R (x) від ділення G (x)? Xm на який утворює по-
Ліном P (x)
x7 + x5 x5 + x4 + x3 + x 2 +1 10100000 111101
x7 + x6 + x5 + x 4 + x2 x2 + x +1 111101 111
x6 + x4 + x2 101010
x6 + x5 + x4 + x 3 + x 111101
x5 + x3 + x2 + x 101110
x5 + x4 + x3 + x 2 +1 111101
x4 + x +1 10011
Залишок R (x) = x4 + x +1 = 10011.
7. Будуємо передається кодовий проліну F (x):
F (x) = xm G (x)? R (x) = x7 + x5 + x4 + x +1 = 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
немає
да
немає
да
Кінець
(6. Розробка тексту програми
Для подання інформаційного слова в пам'яті використовується
масив. До складу програми входить основна програма і два модулі,
що реалізують алгоритм кодування і декодування інформаційних слів і діалогу з користувачем відповідно.
Program Cyclic_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;
case Switch 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
Write (m [i]);
end;
TextColor (14);
GotoXY (2,3);
Write ( 'створюючий полином');
TextColor (13);
for i: = n1 downto 0 do
Write (p [i]);
TextColor (14);
GotoXY (2,4);
Write ( 'Додавання за модулем 2 (F (x) + P (x)):');
FxPx (m);
TextColor (9);
for i: = n downto 0 do
begin
if (i
Write (m [i]);
end;
TextColor (14);
GotoXY (2,5);
Write ( 'Залишок:');
Divizion (m, r, p, Mainflag);
TextColor (11);
for i: = n1 downto Mainflag do
Write (r [i]);
GotoXY (2,6);
TextColor (14);
Write ( 'надсилаєте полином:');
BildMoveCode (m, r, Mainflag);
TextColor (9);
for i: = n downto 0 do
begin
if (i
Write (m [i]);
end;
GotoXY (2,7);
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,8);
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;
TextColor (14);
GotoXY (2,9);
Write ( 'Простий полином:');
Decoder (m);
TextColor (2);
for i: = n downto 0 do
begin
if (i
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
Write (m [i]);
end;
TextColor (14);
GotoXY (2,3);
Write ( 'створюючий полином:');
TextColor (13);
for i: = n1 downto 0 do
Write (p [i]);
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 ( 'Натисніть будь-яку клавішу ...');< br />
Readln;
end;
3: begin
ClrScr;
GotoXY (1,24);
TextColor (14);
Writeln ( 'Робота програми завершено ...');< br />
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
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 )){)}< br />
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 ));{);}< br />
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 ((x1MaxLine) 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
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
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.