мне нужно сделать умножение в д коде
дается 80 бит
перевод,принт д,суматтор работает
помоги с остальным =)
помогите пожалуйста
Код:
PROGRAM inf_kur;
uses crt;
type
tbcd=array[1..10] of byte;
var result:tBCD;
bcd,ss:tbcd ;
x,y,s3,s4:byte ;
s1,s2:string;
bcd1,bcd2,bcd3:tbcd;
ch:char;
s:string;
error,i,j:byte;
sizeStr:byte;
function convert(ch:char):byte;
begin
if (ch>='0')and(ch<='9') then
convert:=ord(ch)-48
end;
{$F+}
{перевод числа в д}
procedure InputBcd(s:string;var bcd:Tbcd;var error:byte);
var st:string;
i,sizeStr:byte;
begin
SizeSTR:=length(s);
for I:=1 to 10 do
bcd[i]:=0;
if (s[1]<>'-') and (s[1]<>'+') then {*Ґ §**Є}
begin
s:='+'+s;
inc(sizeStr);
end;
error:=0;
for i:=2 to sizeStr do
if (s[i]<'0') or (s[i]>'9') then
begin
error:=1;
end;
if SizeStr>=20 then begin
error:=2;{length(S)>=MAX BCD}
end;
if error=0 then {convert}
begin
if sizeStr mod 2=0 then
begin
st:=s[1]+'0';
for i:=2 to sizeStr do
st:=st+s[i];
s:=st;
inc(sizeStr);
end;{mod2}
{convert}
for i:=1 to ((SizeStr) div 2) do
begin
bcd[i]:= convert(s[SizeStr-1])shl 4 or convert(s[sizeStr]);
dec(sizeStr,2);
end;
if s[1]='-' then bcd[10]:=bcd[10]or 128;
end;{convert}
end;{InputBCD}
{вывод в формате д}
procedure printBCD(BCD:tbcd);
{ for print BCD}
var i,j:byte;
begin
writeLn(' N|',' ':5 ,' Lo',' ':3,' | ',' ':5,'hi',' ');
for i:=1 to 10 do
begin
write(i:2);
for j:=0 to 7 do
begin
if j mod 4 = 0 then write('|');
write(' ':2{,(1 shl j):2,});
write(ord(bcd[i] and (1 shl j)=(1shl j)));
end;
writeln;
end;{for elem arr}
end;{print}
{если число не нормальное..приводим его в соответствующий вид}
procedure normbcd1;
var lo,i,p,hi:byte;
begin
p:=0;
for i:=1 to 10 do
begin
lo:=p+(bcd1[i] mod 16);
if lo>9 then
begin
p:=1;
lo:=lo-10;
end else p:=0;
hi:=p+(bcd[i] div 16);
if hi>9 then
begin
p:=1;
hi:=hi-10;
end else p:=0;
bcd[i]:=hi*16+lo;
end;
end;
{для второго числа хз пока}
{procedure normbcd2;
begin
end; }
procedure cdvigi;
begin
bcd1[i]:=sizestr shl 1;
bcd2[i]:=sizestr shr 1;
end;
{summator}
procedure summator(bcd1,bcd2:Tbcd; var BCD:Tbcd);
var i,lo,hi,p:byte;
begin
P:=0;
for i:=1 to 10 do
begin
Lo:=p+(Bcd1[i] mod 16);
Lo:=lo+(bcd2[i] mod 16);
if lo>9 then
begin
p:=1;
lo:=lo-10;
end else p:=0;
hi:=p+bcd1[i] div 16;
hi:=hi+bcd2[i] div 16;
if hi>9 then
begin
p:=1;
Hi:=Hi-10;
end else p:=0;
bcd[i]:=Hi*16+lo;
end;
end;{summator}
{тут тип умножение..но как сделать тоже хз}
procedure we;
var lo :array[1..4] of byte ;
j:byte;
begin
for I:=1 to 10 do begin
for j:=1 to 4 do
if lo[i]:=1 then begin
summator(bcd1,bcd2,bcd3);
cdvigi;
normbcd1;
else
cdvigi;
end;
end;
end;
procedure vyvod;
begin
writeln('BBeguTe 4ucJla gJl9l yMHo}I{eHu9l');
writeln('x=');
readln(s);
s1:=s;
bcd1:=bcd;
InputBcd(s1,bcd1,error);
if (error<>1) and (error<>2) then begin
printBCD(bcd1);
writeln('y=');
readln(s);
s2:=s;
bcd2:=bcd;
InputBcd(s2,bcd2,error);
if (error<>1) and (error<>2) then
printBCD(bcd2)
else begin
if error=1 then
writeln('HekoppeTHoe 4ucJIo');
if error=2 then
writeln('gJIuHoe 4ucJIO');
end;
end
else begin
if error=1 then
writeln('HekoppeTHoe 4ucJIo');
if error=2 then
writeln('gJIuHoe 4ucJIO');
end;
{we;}
end;
{---------------------------------}
begin
vyvod
end.