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