Сложение и вычитание двух целых чисел в дополнительном коде - Pascal

Узнай цену своей работы

Формулировка задачи:

Составьте программу представления в двоичном виде (ввод и вывод в виде 8 нулей и единиц для каждого числа) выполнения операций: 1. сложения 2. вычитания для двух целых чисел в дополнительном коде.

Решение задачи: «Сложение и вычитание двух целых чисел в дополнительном коде»

textual
Листинг программы
type
    TBinNumb = String[8];
    TMax = -63..63;
    TInt = -127..127;
 
function BinToDec(const s: TBinNumb): TInt;
var
    Result: TInt;
    i, n: 1..8;
begin
    Result := 0; n := Length(s);
    for i := 1 to n do
        Inc(Result, Round(Ord(s[i] = '1') * Exp(Ln(2) * (n - i))));
    BinToDec := Result;
end;
 
function DecToBin(x: TInt): TBinNumb;
var
    Result: TBinNumb;
begin
    Result := '';
    repeat
        Result := Chr(48 + Ord(x mod 2 <> 0)) + Result;
        x := x div 2;
    until (x = 0);
    while (Length(Result) < 7) do
        Result := '0' + Result;
    DecToBin := Result;
end;
 
function AdditionalToDec(const s: TBinNumb): TInt;
var
    Result: TInt;
    ss: TBinNumb;
    i, n: 1..8;
begin
    if (s[1] = '1')
    then
    begin
        ss := Copy(s, 2, Length(s) - 1);
        for i := 1 to Length(ss) do
            ss[i] := Chr(48 + Ord(ss[i] = '0'));
        Result := -BinToDec(ss) - 1;
    end
    else
        Result := BinToDec(s);
    AdditionalToDec := Result;
end;
 
function DecToAdditional(x: TInt): TBinNumb;
var
    Result: TBinNumb;
    flag: Boolean;
    i: 1..8;
begin
    if (x < 0)
    then
    begin
        Result := DecToBin(Abs(x));
        for i := 1 to Length(Result) do
            Result[i] := Chr(48 + Ord(Result[i] = '0'));
        i := Length(Result);
        repeat
            if (Result[i] = '1')
            then
                Result[i] := '0'
            else
                Result[i] := '1';
            flag := (Result[i] = '1');
            Dec(i);
        until ((flag) Or (i <= 1));
        Result := '1' + Result;
    end
    else
        Result := '0' + DecToBin(x);
    DecToAdditional := Result;
end;
 
var
    x, y: TBinNumb;
begin
    ReadLn(x); ReadLn(y);
    WriteLn('   Сумма: ', DecToAdditional(AdditionalToDec(x) + AdditionalToDec(y)));
    WriteLn('Разность: ', DecToAdditional(AdditionalToDec(x) - AdditionalToDec(y)));
end.

Объяснение кода листинга программы

  1. Объявление типов переменных:
    • TBinNumb - строка фиксированной длины (8 символов)
    • TMax - диапазон от -63 до 63
    • TInt - диапазон от -127 до 127
  2. Функция BinToDec:
    • Принимает строку в двоичном формате s и возвращает целое число TInt.
    • Инициализирует переменные Result и n.
    • Выполняет цикл для каждого символа строки, осуществляя преобразование двоичного числа в десятичное.
    • Возвращает результат BinToDec.
  3. Функция DecToBin:
    • Принимает целое число x и возвращает строку в двоичном формате TBinNumb.
    • Инициализирует переменную Result.
    • Преобразует число в двоичную строку.
    • Дополняет строку нулями до 8 символов.
    • Возвращает результат DecToBin.
  4. Функция AdditionalToDec:
    • Принимает строку в дополнительном коде s и возвращает целое число TInt.
    • Инициализирует переменные Result и ss.
    • Проверяет знак числа и преобразует в десятичное число.
    • Возвращает результат AdditionalToDec.
  5. Функция DecToAdditional:
    • Принимает целое число x и возвращает строку в дополнительном коде TBinNumb.
    • Инициализирует переменные Result и flag.
    • Проверяет знак числа и преобразует в дополнительный код.
    • Возвращает результат DecToAdditional.
  6. Основная часть программы:
    • Вводятся две строки в двоичном формате x и y.
    • Выполняются операции сложения и вычитания чисел в дополнительном коде.
    • Результаты выводятся на экран.

Оцени полезность:

11   голосов , оценка 3.364 из 5
Похожие ответы