Перевод из одной системы счисления в другую систему
Вот такое дело...
Мне нужно фунуция которая переводит с двоичной в десятеричную и обратно..
Но вся проблема в том что нужно что бы минусовые и дробные сичла сщетало!
Если кто-то поможет буду рад!
С мя пиво :)
Драствуйте!
Вот такое дело...
Мне нужно фунуция которая переводит с двоичной в десятеричную и обратно..
Но вся проблема в том что нужно что бы минусовые и дробные сичла сщетало!
Если кто-то поможет буду рад!
С мя пиво :)
писать прогу лениво, а вот алгоритм подсказать могу...
из дес. в двоич.
1) запоминаешь знак
2) делишь число на целую часть и дробную
3) переводишь целую часть следующим путем:
s := '';
while (N > 1) do begin
s := inttostr(N mod 2) + s;
N := N div 2;
end;
s := inttostr(N)+s;
4) переводишь дробную часть следующим путем:
s := '';
while (дробная часть не исчезнет или не достигнется нужная точность) do begin
D := D * 2;
C := Trunc(D);
s := s + inttostr(C);
D := D - C;
end;
5) склеиваешь все.
из двоич. в дес. ваще элементарно.
каждый знак (1 или 0) двоичного числа в целой части умножаешь на 2 в степени (позиция этого знака в целой части справа - 1).
каждый знак (1 или 0) двоичного числа в дробной части умножаешь на (1/2) в степени (позиция этого знака в дробной части слева).
все сложить.
Удачи!
{$APPTYPE CONSOLE}
uses
SysUtils,Windows;
Var
st:Set of Char;
Function F(a,b:Integer):Integer;
Var
i:Integer;
Begin
Result:=a;
For i:=1 To b-1 Do
Result:=Result*a;
IF b=0 Then Result:=1;
End;
Function ConvertDec(n:ShortString; q:Integer):Integer;
Var
p,j,i:Integer;
Begin
j:=Length(n)-1;
Result:=0;
For i:=1 To Length(n) Do
Begin
IF n in [#48..#58] Then
Begin
Result:=Result+F(q,j)*StrToInt(n);
Dec(j);
End
Else
IF n in st Then
Begin
Result:=Result+F(q,j)*(Ord(n)-55);
Dec(j);
End
End;
End;
Function ConvertSS(d,q:Integer):ShortString;
Begin
Result:='';
While d<>0 Do
Begin
IF d mod q>9 Then
Result:=Chr(d mod q+55)+Result
Else
Result:=IntToStr(d mod q)+Result;
d:=d div q;
End;
End;
Function ConvertEx(n:Extended; acc,q:Integer):ShortString;
Begin
Result:=',';
IF acc=0 Then
Begin
Result:=Result+'0';
Exit;
End;
While Length(Result)<acc+1 Do
Begin
n:=n*q;
Result:=Result+IntToStr(Trunc(n));
n:=n-Trunc(n);
End;
End;
Var
eps,i,tmp,qin,qout:Integer;
t,nin:ShortString;
buf:_Input_Record;
n:Cardinal;
r:Extended;
Label cont;
begin
st:=['A'..'Z','a'..'z'];
cont:
eps:=0;
WriteLn('Input data{');
WriteLn;
Write('Enter N: ');
ReadLn(nin);
Write('Enter Q: ');
ReadLn(qin);
Write('Enter Q: ');
ReadLn(qout);
IF Pos(',',nin)<>0 Then
Begin
Write('Enter accuracy: ');
ReadLn(eps);
t:='0,'+IntToStr(ConvertDec(Copy(nin,Pos(',',nin)+1,Length(nin)),qin));
r:=StrToFloat(t);
End;
WriteLn('}');
WriteLn('Output data{');
Write('N=');
IF qin=qout Then Write(nin)
Else
Begin
IF eps<>0 Then tmp:=ConvertDec(Copy(nin,1,Pos(',',nin)-1),qin)
Else tmp:=ConvertDec(nin,qin);
Write(ConvertSS(tmp,qout)+ConvertEx(r,eps,qout));
End;
WriteLn;
WriteLn('}');
WriteLn('Press ''q'' for quit or ''enter'' for continue...');
WriteLn;
Repeat
ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE),buf,1,n);
Case buf.Event.KeyEvent.AsciiChar of
#81,#113:Break;
#13:GoTo cont;
End;
Until False;
end.