Системы счисления и коды

ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО ОБРАЗОВАНИЮ

Рязанская государственная  радиотехническая академия 
 

Кафедра САПР ВС 
 
 
 
 
 
 
 

Пояснительная записка к курсовому проекту по дисциплине «Информатика» 

тема: «Системы счисления и коды» 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

                      Разработал  ст. гр. 445

                      Бирюков С.А.

                      Проверил

                      Орехов  В.В 
                       
                       
                       

Рязань 2005г. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Оглавление 
 

     1. Введение   4

     2. Постановка задачи   4

     3. Правила перевода для разных  систем счисления   4

     3.1. Правило перевода из шестнадцатеричной в восьмеричную систему счисления   4

     3.2. Правило перевода из восьмеричной в шестнадцатеричную систему счисления  5

     4. Укрупненная блок-схема  6

     4. Подробная блок-схема программы  7

     5. Текст программы  16

     6. Ручной просчет контрольного примера  21

     7. Машинный просчет контрольного примера  21

     8. Заключение 22

     10. Используемая литература  23 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

      1. Введение. 

     В вычислительной технике на ряду с  десятичной системой исчисления используется восьмеричная и шестнадцатеричная. Ручной перевод хотя и достаточно прост но требует много времени. Для решения данного задания необходимо составить программу, которая переводит числа из разных систем счисления в другие системы счисления.  

   2. Постановка задачи. 

     Программа должна считывать из файла исходные данные в восьмеричной системе. Затем, следуя заданию, необходимо перевести числа в в шестнадцатеричную систему счисления. В шестнадцатеричной системе счисления числа необходимо сложить и вычесть. Затем результаты этих действий перевести обратно в восьмеричную систему счисления, и вывести в файл. 

      3. Правила перевода для разных систем счисления.  

     Система счисления —  это способ представления чисел посредством  алфавита (конечное множество) символов, называемых цифрами.  

     Например, «обычная» десятичная система счисления имеет алфавит {0;1;...;9}, состоящий из десяти цифр: 0; 1 и т.д. Системы счисления бывают двух видов: позиционные и непозиционные.

     Позиционная система счисления — это такая, в которой одна и та же цифра имеет разные значения в зависимости от ее позиции в числе. Например, десятичная система счисления — позиционная. В десятичном числе 22 первая слева цифра 2 имеет значение 20, а вторая — значение 2.

     Непозиционная система счисления — это такая, в которой одна и та же цифра всегда имеет одинаковое значение, не зависящее от ее позиции в числе. Например, римская система счисления — непозиционная. В римском числе XX обе цифры X имеют значение 10. 

     3.1. Правило перевода из шестнадцатеричной в восьмеричную систему счисления. 

     Оптимальный способ перевода числа из шестнадцатеричной в восьмеричную систему счисления будет следующим. Т.к. шестнадцатеричное число имеет основание системы счисления 16=24, а восьмеричное 8=23, то шестнадцатеричное число переводим в двоичное: каждую цифру заменяем на группу из 4-х двоичных цифр ( тетраду ) соответственно данной таблице: 
 
 
 
 

      

       С и  с т е м а     с ч  и с л е н и я

      

       С и  с т е м а     с ч  и с л е н и я

    2 16 2 16
    0000 0 1000 8
    0001 1 1001 9
    0010 2 1010 A
    0011 3 1011 B
    0100 4 1100 C
    0101 5 1101 D
    0110 6 1110 E
    0111 7 1111 F
    Таблица №1
 

     Затем получившееся двоичное число разбиваем на группы по 3 цифры (триады). Далее заменяем эти триады цифры соответствующими восьмеричными цифрами. При необходимости добавить нули слева от числа для дробной части, и справа для целой части числа.

      

       С и  с т е м а     с ч  и с л е н и я

      

       С и  с т е м а     с ч  и с л е н и я

    2 8 2 8
    000 0 100 4
    001 1 101 5
    010 2 110 6
    011 3 111 7
    Таблица №2
 

     Например:

       

     3.2. Правило перевода из восьмеричной в шестнадцатеричную систему счисления. 

     Данный  перевод осуществляется аналогично описанному в п. 3.1. с тем отличием, что восьмеричное число переводится в двоичное: каждая восьмеричная цифра заменяется двоичной триадой согласно таблице №2.

     Затем двоичное число разбивается на тетрады (при необходимости добавить нули справа и слева от числа) которые  заменяются шестнадцатеричными цифрами согласно таблице №1. Например:

       
 
 
 
 
 
 
 
 
 

     4. Укрупненная блок-схема.  
 

     

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

                        
 
 
 
 
 

 
 
 

       
 
 
 
 

       
 
 
 
 
 

       
 
 
 
 

     

        
 
 
 
 

 
 
 
 
 
 

 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

     5. Текст программы.

     uses crt;

     Type

         t1=array[0..100] of real;

         t2=array[0..20] of string;

               {процедура для записи в массив  исходных данных}

     Procedure p8(var dt8:t1;var lc,c:integer;var isx:string);

               var

                b,code,i,a:integer;

                begin

                 a:=length(isx);

                 b:=Pos('.', iSx);

                 if b=0 then b:=Pos(',', iSx);

                 lc:=b-1;

                 for i:=1 to b-1 do

                  begin

                   Val(isx[i],dt8[i],code);

                  end;

                 for i:=b+1 to a do

                       begin

                   Val(isx[i],dt8[i-1],code);

                  end;

                 c:=a-1;

              end;

               {Проседура для перевода из 8-ричной  системы в 16-тиричную}

     Procedure p8v16(var dt8,dt16:t1;var c,obch,dr:integer);

               var

                dt8p,b:t1;

                i,k,d:longint;

                a:real;

               begin

                c:=c-dr+obch;

                for k:=1 to c do

                       begin

                  dt8p[k]:=dt8[c-k+1];

                  b[k]:=round(exp((k-1)*ln(8)))*dt8p[k];

                 end;

                a:=0;

                for k:=1 to c do

                       begin

                  a:=a+b[k];

                 end;

               d:=1;

                repeat

                 dt16[d]:=round((a-16*int(a/16)));

                 a:=int(a/16);d:=d+1;

                until a<16;

                dt16[d]:=a;

                end;

               {Процедура для перевода из 16-тиричную  в 8-миричную}

     Procedure p16v8(var dt16,dt8:t1;var c:integer);

               var

                b:t1;

                i,k,d:longint;

                a:real;

               begin

                for k:=1 to c do

                      begin

                b[k]:=round(exp((k-1)*ln(16)))*dt16[k];

               end;

                a:=0;

                for k:=1 to c do

                      begin

                  a:=a+b[k];

                 end;

                d:=1;

                repeat

                 dt8[d]:=round((a-8*int(a/8)));

                 a:=int(a/8);d:=d+1;

                until a<8;

                dt8[d]:=a;

               end;

               {Процедура для записи 16-тиричной(числовой) в 16-тиричную(буквенную)}

     Procedure p16v16n(var dt16:t1;var dt16n:t2;var c:integer);

               var

                i:integer;

               begin

                for i:=1 to c do

                      begin

                 if dt16[i]=0 then dt16n[i]:='0';

                 if dt16[i]=1 then dt16n[i]:='1';

                 if dt16[i]=2 then dt16n[i]:='2';

                 if dt16[i]=3 then dt16n[i]:='3';

                 if dt16[i]=4 then dt16n[i]:='4';

                 if dt16[i]=5 then dt16n[i]:='5';

                 if dt16[i]=6 then dt16n[i]:='6';

                  if dt16[i]=7 then dt16n[i]:='7';

                  if dt16[i]=8 then dt16n[i]:='8';

                  if dt16[i]=9 then dt16n[i]:='9';

                  if dt16[i]=10 then dt16n[i]:='A';

                 if dt16[i]=11 then dt16n[i]:='B';

                  if dt16[i]=12 then dt16n[i]:='C';

                  if dt16[i]=13 then dt16n[i]:='D';

                  if dt16[i]=14 then dt16n[i]:='E';

                 if dt16[i]=15 then dt16n[i]:='F';

                end;

               end;

               {Процедура сумирования в 16-тиричной  ситеме счисления}

     Procedure psum(var dt16ch1,dt16ch2,sum:t1;var dlina:integer);

               var

                i:integer;

               begin

                for i:=1 to dlina do

                       begin

                  sum[i]:=dt16ch1[i]+dt16ch2[i];

                       end;

               for i:=1 to dlina do

                     begin

                 if (sum[i]>15.1)  then

                 begin

                         sum[i+1]:=sum[i+1]+1;

                  sum[i]:=sum[i]-16;

                 end;

                end;

               end;

               {Процедура вычитания в 16-тиричной  ситеме счисления}

     Procedure praz(var dt16ch1,dt16ch2,raz:t1;var c:integer);

               var

                i,p:integer;

               begin

                p:=0;

                for i:=1 to c do

                       begin

                  if (dt16ch1[i]-dt16ch2[i]-p)<0  then

                   begin

                    raz[i]:=dt16ch1[i]-dt16ch2[i]+16-p;

                           p:=1;

                         end;

                  if (dt16ch1[i]-dt16ch2[i]-p)>=0 then

                         begin

                          raz[i]:=dt16ch1[i]-dt16ch2[i]-p;

                    p:=0;

                 end;

                 end;

               end;

     {-------------------------------------------------------------------}

     var

      toch2,dlina2,toch1,dlina1,dr1,dr2,dlina,obch1,obch2,obch:integer;

      i:longint;

      dt8ch1,dt8ch2,dt16ch1,dt16pch1,dt16ch2,dt16pch2,sum,raz,raz8,sum8:t1;

      dt16nch1,dt16nch2,sumn,razn, n1:t2;

      isx1,isx2:string;

      f,g:text;

      vb: integer; 

     {Начало  программы} 

     begin

      TextColor(Yellow);

      TextBackGround(Blue);

      clrscr;

      assign (f,'c:\data.txt');

      reset(f);

      readln(f,isx1);

      readln(f,isx2);

      WriteLn('First  number = ', isx1);

      WriteLn('Second number = ', isx2);

      p8(dt8ch1,toch1,dlina1,isx1);

      p8(dt8ch2,toch2,dlina2,isx2);

      obch1:=dlina1-toch1;

      obch2:=dlina2-toch2;

      if obch1>=obch2 then obch:=obch1 else obch:=obch2;

      if dlina1>dlina2 then dlina:=dlina1 else dlina:=dlina2;

      p8v16(dt8ch1,dt16ch1,dlina1,obch,obch1);

      p8v16(dt8ch2,dt16ch2,dlina2,obch,obch2);

      psum(dt16ch1,dt16ch2,sum,dlina);

      p16v16n(sum,sumn,dlina);

      praz(dt16ch1,dt16ch2,raz,dlina);

      p16v16n(raz,razn,dlina);

      p16v8(dt16ch1,dt8ch1,dlina1);

      p16v16n(dt16ch1,dt16nch1,dlina1);

      p16v8(dt16ch2,dt8ch2,dlina2);

      p16v16n(dt16ch2,dt16nch2,dlina2);

      writeln;

      p16v8(raz,raz8,dlina);

      assign (g,'c:\results.txt');

      rewrite(g);

      write('PA3HOCTb = ');

      for i:=dlina downto obch+1 do write(raz8[i]:0:0);

      write('.');

      for i:=obch downto 1 do write(raz8[i]:0:0);

      write(g,'PA3HOCTb =');

      for i:=dlina downto obch+1 do write(g,raz8[i]:0:0);

       write(g,'.');

      for i:=obch downto 1 do write(g,raz8[i]:0:0);

      writeln(g);

      WriteLn;

      write('Cymma = ');

      p16v8(sum,sum8,dlina);

      for i:=dlina+1 downto obch+1 do write(sum8[i]:0:0);

       write('.');

      for i:=obch downto 1 do write(sum8[i]:0:0);

      write(g,'Cymma =');

      p16v8(sum,sum8,dlina);

      for i:=dlina+1 downto obch+1 do write(g,sum8[i]:0:0);

       write(g,'.');

      for i:=obch downto 1 do write(g,sum8[i]:0:0);

      close(f);

      Close(g);

      ReadKey;

      end.

     {Конец  программы} 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

     6. Ручной просчет  контрольного примера. 

     Пусть имеется два восьмеричных числа:

     1-ое:

     2-ое:  

           Переведем их в шестнадцатеричную систему счисления: 

      =100001,111101=

       =11100,100010=  
 
 

      Сложим  и вычтем эти числа: 

                       
 
 

      Переведем числа в восьмеричную систему счисления : 

      =111101,1011111=

      =101,11011=  
 
 

     7. Машинный просчет контрольного примера. 

     Файл c:\data.txt содержит следующее:  

     41.75

     34.42 

     После выполнения программы файл c:\results.txt содержит следующее: 

     Сумма = 076.37

     Разность = 05.33 
 
 
 
 
 
 
 

         8. Заключение. 

         Курсовая  работа по теме « системы счисления » помогает освоить и отработать методы перевода чисел из разных систем счисления, дает понятие о всевозможных системах счисления, правила выполнения арифметических действий в этих системах.

         Курсовая  работа выполнена на языке высокого уровня – Turbo Pascal, что способствует лучшему освоению данного языка программирования, изучению многих тонкостей языка, связанных с решением задачи, поставленной в данной курсовой работе. 

         Результатом выполнения данной курсовой работы будет  являться программа, выполняющая перевод  вещественных чисел из восьмеричной системы счисления в шестнадцатеричную и обратно в восьмеричную систему счисления. В шестнадцатеричной системе счисления выполняются арифметические действия действия. Результат работы программы записывается в файл. 
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

      10. Используемая литература. 

    1) И. А. Цветков «Представление и обработка информации в ЭВМ», уч.-изд. РГРТА 2003 год.