Реферат: Кодовые комбинации на основе циклических кодов

                                                  АННОТАЦИЯ

        Документсодержит описание программы, которая строит  кодовые комбинации на основециклических кодов. Программа кодирует и деко-дирует  информационные слова.Иммитируется работа источника, переда-ющего информационное слово, кодировщика,кодирующего данное слово, канала связи и декодировщика, обнаруживающего иисправляющего ошибки в информационном полиноме. Программа работает по принципуприёмник – источник, так, как это реализовано в устройствах, передающихинформацию или обыкновенных приводах для внешних носителей в 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.

еще рефераты
Еще работы по информатике, программированию