Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Перевод дроби из 10 в N-ричную

Автор: s3ct 27.05.2006 23:31

Код
function FromDec(n, radix:longint):string;
var
    s: String;
const
    digit: string[16]='0123456789ABCDEF';
begin
    s:='';
    repeat
        s:=digit[(n mod radix)+1]+s;
        n:=n div radix;
    until n=0;
    FromDec:=s;
end;

в FAQ нашел код для перевода только целых чисел, а как быть с дробными ?

Автор: volvo 27.05.2006 23:35

Ищи в поиске (в разделе Дельфи), там точно был рабочий код... По-моему, тема называлась "Калькулятор", или что-то типа этого...

Автор: s3ct 27.05.2006 23:44

Код
function ToDec(n:string; radix:longint):real;
var
  _int: longint;
  _frac: real;

  s: string;
  i, p: byte;
const
  digit: string[16]='0123456789ABCDEF';

begin
  p := pos('.', n);
  if p = 0 then s := n
  else s := copy(n, 1, p - 1);

  _int := 0; _frac := 0.0;

  while s[1] = '0' do delete(s, 1, 1);
  for i := 1 to length(s) do
    _int := _int * radix + pos(n[i], digit) - 1;

  if (p <> 0) and (p < length(n)) then begin // <--- Здесь !!!

    s := copy(n, p + 1, 255);
    while s[length(s)] = '0' do delete(s, length(s), 1);

    for i := 1 to length(s) do
      _frac := _frac + 1 / stepen(radix, i);

  end;
  ToDec := _int + _frac;
end;

Нашел только ToDec, помогите модифицировать ее в FromDec smile.gif smile.gif, и думаю это можно будет запостить в FAQ smile.gif

Автор: volvo 27.05.2006 23:52

Это - неверный вариант... Верный приведен здесь:
http://forum.pascal.net.ru/index.php?s=&showtopic=10639&view=findpost&p=69916

Цитата(s3ct @ 27.05.2006 19:44)
Нашел только ToDec, помогите модифицировать ее в ToDec
blink.gif

Автор: s3ct 28.05.2006 0:01

Исправил smile.gif

Автор: antonioSP 29.05.2006 0:05

Вот мой вариант fromdec, вроде потестил работает нормально:

function FromDec(n:real; radix:longint):string;
var
q:real;
i,j:integer;
s,f,u: String;
const
digit: string[16]='0123456789ABCDEF';
begin
u:='';
if n<0 then
begin
u:='-';
n:=abs(n);
end;
if frac(n)>0 then
begin
i:=0;
q:=frac(n);
s:='';
j:=strtoint(floattostr(int(n)));
repeat
s:=digit[(j mod radix)+1]+s;
j:=j div radix;
until j=0;
repeat
q:=frac(q)*radix;
f:=f+digit[trunc(q)+1];
q:=frac(q);
i:=i+1;
until (q=0)or(i=8);;
FromDec:=s+','+f;
end
else
begin
s:='';
j:=trunc(n);
repeat
s:=digit[(j mod radix)+1]+s;
j:=j div radix;
until j=0;
FromDec:=u+s;
end;
end;