Разработка системы счисления для выполнения арифметических действий, страница 2

Перемножаем, получаем 11111111111100002=6552010.

Переводим в ДД-код: 01100101010100100000.

На ЭВМ:

Листинг файла Result.txt

=============================================

==      К У Р С О В А Я  Р А Б О Т А

==========================================

== по теме: СИСТЕМЫ СЧИСЛЕНИЯ

=================================

==ИСХОДНЫЕ ДАНЫЕ:

==    Число 1 в дд коде:10010001

==    Число 2 в дд коде:011100100000

==РЕЗУЛЬТАТ ВЫПОЛНЕНИЯ ДВОИЧНОГО УМНОЖЕНИЯ:

==    Результат в дд коде: 01100101010100100000

ЗАКЛЮЧЕНИЕ.

Программа написана в среде Турбо Паскаль 7.0.

Минимальные системные требования: ограничиваются требованиями вышеуказанной среды программирования.

При написании программы были изучены основные методы,  применяемые для работы над числами в различных системах счисления. Освоены способы табличного перевода чисел, а также нестандартный метод перевода из десятичной системы в двоичную, использующий особенности хранения данных в памяти ЭВМ, с помощью сдвига битов числа. Закреплены знания языка Паскаль.

Программа может служить примером элементарной обработки информации во внутремашинных кодах.


БИБЛИОГРАФИЧЕСКИЙ СПИСОК.

1.  Искусство программирования для ЭВМ (3-тома). / Д . Кнут . ,  Питер.прес.,2001г.

2.  Turbo Pascal 7.0.(том 1)/ Фаронов., Питер. Прес.,2000г.


ПРИЛОЖЕНИЕ 1. Текст программы.

program kurs;

type

   TVal=0..2;

   TBinArr=array [1..sizeOf(Word)*8] of byte;

{dec->bin}

function DecToBin(D:word):string;

  var

    i,size:byte;

    Res:string;

  begin

    size:=sizeOf(Word)*8; {вычисляем количество битов в числе}

    res:='';

    for i:=size-1 downto 0 do

      begin

      case (D shr i) of

        1:Res:=Res+'1'; {вставляем в запись числа}

        0:Res:=Res+'0'; {слдедующий бит}

      end;

      D:=D-((D shr i) shl i); {вычитаем этот разряд}

      end;

    DEcToBin:=res;

  end;

{bin -> dec}

Function BinToDec(B:string):word;

  var

    i,size:byte;

    errcode:integer;

    tek:word; {текущее слагаемое}

    Res:word;

  begin

    size:=length(B); {вычисляем количество битов в числе}

    Res:=0;

    For i:=size downto 1 do

      begin

      val(B[i],tek,errCode);  {вычисляем тек. слагаемое}

      tek:=tek shl (size-i);  {учитывая вес разряда    }

      res:=res+tek;

      end;

    BinToDec:=res;

  end;

{дд код - десятичное чило}

Function BDToDec(BD:string):word;

  var

    i,size:byte;

    res,raz:word;

    tetrada:string[4];

  begin

    res:=0;

    raz:=1;

    size:=length(BD);

    i:=size;

    while i<>0 do

      begin

      tetrada:=copy(BD,i-3,4);

      res:=res+raz*BinToDec(tetrada);

      raz:=raz*10;

      i:=i-4;

      end;

    BDToDec:=res;

  end;

{десятичное число -> дд-код}

Function DecToBD(D:word):string;

  var

    n:byte;

    res,tetrada:string;

  begin

    res:='';

    while D<>0 do

      begin

      case D mod 10 of

        0:tetrada:='0000';

        1:tetrada:='0001';

        2:tetrada:='0010';

        3:tetrada:='0011';

        4:tetrada:='0100';

        5:tetrada:='0101';

        6:tetrada:='0110';

        7:tetrada:='0111';

        8:tetrada:='1000';

        9:tetrada:='1001';

        end;

      res:=tetrada+res;

      D:=D div 10;

      end;

    DecToBD:=res;

  end;

{двоичное умножение}

function BMult(B1,B2:string):string;

  {подфункция для перевода из массива в строку числа в 2ой с-ме}

  function ArrToStr(Arr:TBinArr):string;

  var

    i:byte;

    res,ch:string;

  begin

    res:='';

    for i:=1 to 16 do

      begin

      Str(Arr[i],ch);

      res:=res+ch;

      end;

    ArrToStr:=res;

  end;

  {подфункция перевода строки с записью 2го числа в массив чисел}

  procedure StrToArr(S:String;var Arr:TBinArr);

    var i:byte;

      errcode:integer;

    begin

     for i:=16 downto 1 do

     if S[i]<>'' then val(S[i],Arr[i],errcode)

     else Arr[i]:=0;

    end;

  var

    BA1,BA2,ARes,tmp:TBinArr;

    i,j,k,m,perenos,skip:byte;

    s:string;

  begin

    StrToArr(B1,BA1); {загоняем в массив данные}

    StrToArr(B2,BA2); {загоняем в массив данные}

    k:=16;

    for i:=k downto 1 do Ares[i]:=0; {обнуляем массив}

    for i:=k downto 1 do

      begin

      for j:=k downto 1 do tmp[j]:=BA1[i]*BA2[j];

      {складываем здесь то, что наумножали}

      skip:=k-i;              {с  }

      if skip>0 then          {д  }

       begin                  {в  }

        s:=ArrToStr(tmp);     {и р}

        for j:=1 to skip do   {г а}

         begin                {  з}

         delete(S,1,1);       {  р}

         s:=s+'0';            {  я}

         end;                 {  д}

         StrToArr(S,tmp);     {  о}

       end;                   {  в}

      perenos:=0;

      for j:=16 downto 1 do

        begin

        ARes[j]:=Ares[j]+tmp[j]+perenos; {складываем одноименные разряды}

        perenos:=0;

        if ARes[j]>1 then        {если сумма больше 1 то перенос в след. разряд}

          begin

          inc(perenos);

          ARes[j]:=ARes[j]-2;

          end;

        end;

      end;

    BMult:=ArrToStr(ARes);

  end;

Function RightData(dd:string):boolean;

  var i:byte;

  begin

     if (length(dd) mod 4) <> 0 then begin RightData:=false;exit;end;

     for i:=1 to length(dd) do

       if not((dd[i]='0')or(dd[i]='1')) then begin RightData:=false;exit;end;

       while dd<>'' do

         begin

         if BinToDec(copy(dd,1,4))>9 then begin RightData:=false;exit;end;

         delete(dd,1,4);

         end;

     RightData:=true;

  end;

Var

  fdat,fres:text;

  dd1,dd2:string;

  bin1,bin2:string;

begin

  Assign(fdat,'data.txt');reset(fdat);

  Readln(fdat,dd1);

  Readln(fdat,dd2);

  close(fdat);

  bin1:=DecToBin(BDToDec(dd1));

  bin2:=DecToBin(BDToDec(dd2));

  if not(RightData(dd1) or RightData(dd1)) then

    begin

    WriteLN('!!!ОШИБКА ДАННЫХ!!!');

    readln;

    exit;

    end;

  Assign(fres,'result.txt');rewrite(fres);

  WriteLn(fres,'=============================================');

  WriteLn(fres,'==      К У Р С О В А Я  Р А Б О Т А       ');

  WriteLn(fres,'==========================================');

  WriteLn(fres,'== по теме: СИСТЕМЫ СЧИСЛЕНИЯ            ');

  WriteLn(fres,'======================================');

  WriteLn(fres,'=================================');

  WriteLn(fres,'==ИСХОДНЫЕ ДАНЫЕ:        ');

  WriteLn(fres,'==    Число 1 в дд коде:',dd1);

  WriteLn(fres,'==    Число 2 в дд коде:',dd2);

  WriteLn(fres,'=========================');

  WriteLn(fres,'==РЕЗУЛЬТАТ ВЫПОЛНЕНИЯ ДВОИЧНОГО УМНОЖЕНИЯ:  ');

  WriteLn(fres,'==    Результат в дд коде: ',DecToBD(BinToDec(BMult(Bin1,Bin2))));

  WriteLn(fres,'==================');

  close(fres);

end.


ПРИЛОЖЕНИЕ 2. Файл исходных данных.

10010001

011100100000

ПРИЛОЖЕНИЕ 3. Файл результатов.

=============================================

==      К У Р С О В А Я  Р А Б О Т А

==========================================

== по теме: СИСТЕМЫ СЧИСЛЕНИЯ

=================================

==ИСХОДНЫЕ ДАНЫЕ:

==    Число 1 в дд коде:10010001

==    Число 2 в дд коде:011100100000

==РЕЗУЛЬТАТ ВЫПОЛНЕНИЯ ДВОИЧНОГО УМНОЖЕНИЯ:

==    Результат в дд коде: 01100101010100100000