Консультация № 160065
10.02.2009, 02:18
0.00 руб.
0 2 1
Помогите пожалуйста найти ошибку. Сложение двоичных чисел на Паскале. Результат получается ноль либо строка из 32 цифр. Спасибо.



Приложение:
function IntToBin(bin:longint):string;
var bin_s:string;
begin
bin_s:= '';
if bin=0 then bin_s:='0'
else
while bin<>0 do begin
if (bin and 1)=1 then
bin_s:='1'+bin_s
else bin_s:='0'+bin_s;

bin:=bin shr 1;
end;
IntToBin:=bin_s
end;
function BinToInt(bin_s:string): longint;
var
bin, mult:longint;
i:integer;
begin
mult:=1; bin:=0;
for i:=length(bin_s) downto 1 do
begin
if bin_s='1' then bin:=bin+mult;
mult:=mult shl 1;
end;
end;
Function Dec2Bin (num: word): String;
var result: string;
remainder: word;
c: char;
begin
result := '';
while num <> 0 do
begin
remainder := num mod 2;
num := num div 2; { или num := num shr 1 }
c := chr (remainder + ord ('0'));
result := c + result;
end; end;
var BO,BT,BM:word;
begin
write('Введите первое число: ');
readln(BO);
write('Введите второе число: ');
readln(BT);
write('Введите третье число: ');
readln(BM);
writeln('Результат:',IntToBin(BinToInt(Dec2Bin(BO))-BinToInt(Dec2Bin(BT))+BinToInt(Dec2Bin(BM))));
readln
end.

Обсуждение

давно
Старший Модератор
31795
6196
10.02.2009, 11:44
общий
это ответ
Здравствуйте, Сиваков Александр!

Программа в приложении.
Выполняет суммирование трех двоичных чисел, второе число переводится ещё в дополнительный код.
По подпрограммах:
inputBin - вводит число в двоичной системе;
rangeBin - все введенные числа выравниваются к одному размеру, определенному в разделе констант;
convertBin - преводит число в дополнительный код;
doSummaBin - суммирование двух двоичных чисел;
outputBin вывод результата на экран.
Вопросы задавайте в минифорум.
Удачи!

Приложение:
uses crt;
const
n=32;
type
TMass=string[n];
var a,b,c:TMass;
procedure inputBin(var d:TMass;e:char);
begin{inputBin}
{вводим число в обратном порядке}
write('Enter number',e:2,':');
d:='';
repeat
e:=ReadKey;{символ без эхо}
if (e='0')or(e='1')then{ноль или единица}
begin{begin if}
write(e);{выводим его}
d:=e+d;{и добавляем в строку}
end;{end if}
until (e=chr(13))or(length(d)=n);{}
writeln;
end;{inputBin}
procedure outputBin(d:TMass);
var
i:integer;
begin{outputBin}
{выводим результат}
write('Result :');
{в обратном порядке}
for i:=length(d)downto 1 do
write(d[i]);
writeln;
end;{outputBin}
procedure doSummaBin(var d,e:Tmass);
var
f:char;
i:integer;
begin{doSummaBin}
f:='0';{}
for i:=1 to length(d) do
begin{for}
if (e[i]<>d[i])then
{обрабатываем ситуацию когда биты различны}
begin{ed=10,01}
if f='1'
then d[i]:='0' {edf=101,011}
else d[i]:='1';{edf=100,010}
end{10,01}
else
{обрабатываем ситуацию когда биты одинаковы}
begin{ed=00,11}
{edf=001,000,111,110}
d[i]:=f;
f:=e[i];
end;{00,11}
end;{for}
end;{doSummaBin}
procedure rangeBin(var d:Tmass);
begin{rangeBin}
while length(d)<n do
d:=d+'0';
end;{rangeBin}
procedure convertBin(var d:TMass;e:TMass);
var
i:integer;
begin{convertBin}
for i:=1 to length(d)do
{инвертируем биты}
case d[i]of{case}
'0':d[i]:='1';
'1':d[i]:='0';
end;{case}
rangeBin(e);{выравниваем строку}
doSummaBin(d,e);{суммируем}
end;{convertBin}
begin{main}
{вводим числа}
inputBin(a,'A');
inputBin(b,'B');
inputBin(c,'C');
{выравниваем к одному размеру}
rangeBin(a);
rangeBin(b);
rangeBin(c);
{переводим в дополнительный код}
convertBin(b,'1');
{суммируем А + Вд + С}
doSummaBin(a,b);
doSummaBin(a,c);
{выводим результат}
outputBin(a);
ReadKey;
end.{main}
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
10.02.2009, 11:51
общий
Сиваков Александр:

Уж больно мудренный код у Вас получился:
IntToBin - почему бы не использовать стандартную процедуру:
Цитата: из хелпа
Str (процедура)Преобразовывает число в строку.
Объявление: Procedure Str(X [: Width [: Decimals ]]; Var S : String);
Режим:Windows, Real, Protected
Замечания:Преобразовывает числовое значение X в строковое представление этого числа, которое можно выводить операторами типа Write и OutText.

Простите разбиратся не стал, просто переписал задание по новому:
IntToBin(BinToInt(Dec2Bin(BO))-BinToInt(Dec2Bin(BT))+BinToInt(Dec2Bin(BM))

Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа