Перевод из одной с.с. в другую при помощи рекурсии.

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

Ответить
Lgun
Сообщения: 4
Зарегистрирован: 03 май 2008, 20:16

Нужно реализовать перевод целого числа из одной системы счисления в другую (между основными - 2, 8, 10, 16), используя рекурсивные функции или процедуры. Алгоритм самого перевода ясен, а вот куда там припахать рекурсию, идей нет. Подскажите плиз.
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Вместо того, чтобы проводить вычисления в цикле, который наверняка присутствует в алгоритме перевода, используйте рекурсивную функцию.
Ни что так не ограничивает фантазию программиста, как компилятор...
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Ну к примеру, из восьмеричной в двоичную. Задана строка s8

Код: Выделить всё

function s8_to_s2(s8:string): string;
var tmp:string;
begin
  if s8='' then s8_to_s2:=''
  else 
  begin
     if s8[1]='0' then tmp:='000' else
     if s8[1]='1' then tmp:='001' else
   {и так далее}
     if s8[1]='7' then tmp:='111';
     s8_to_s2=tmp+s8_to_s2(copy(s8,2, length(s8));
  end;
end;
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Lgun
Сообщения: 4
Зарегистрирован: 03 май 2008, 20:16

Спасибо, я что-то подобное и буду делать, но через две функции - "любая в 10-ую" и "10-ая в любую" при помощи стандартных формул. Следовательно, встает вопрос: в pascale есть более удобные средства для работы с 16-ричными числами? Чтобы не описывать каждую букву подобно вышеприведенному примеру?
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

&quot писал(а):в pascale есть более удобные средства для работы с 16-ричными числами
нет.
можно так - описывайте
const
Digits:array[0..$F]of char='0123456789ABCDEF';
и работайте с ним (Digits...)
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

кстати, вот, может поможет.
программа перевода из 10-й системы в любую (<=16)
чем (с) не знаю, но код чужой!

Код: Выделить всё

CONST Digit: STRING[16]='0123456789ABCDEF';
FUNCTION Fromdec(N, Radix: LONGINT): STRING;
VAR
  S: STRING;
BEGIN
  S := '';
  REPEAT
    S := Digit[(N MOD Radix) + 1] + S;
    N := N DIV Radix;
  UNTIL N = 0;
  Fromdec := S;
END;
...
Lgun
Сообщения: 4
Зарегистрирован: 03 май 2008, 20:16

Всем спасибо, код написан) Если кому интересно, вот рабочие функции:
function HDig(Ch: CHAR): BYTE;
var
i,n: byte;

begin
n := 0;
for i := 1 to length(HexDig) do
if Ch = HexDig then n := i-1;
HDig := n;
end;

function ToDec(s:string;i:byte):extended;
begin
if length(s)=1 then ToDec:=HDig(UpCase(s[1]))
else ToDec:=HDig(UpCase(s[1]))*exp((length(s)-1)*ln(i))+ToDec(copy(s,2,length(s)),i);
end;

function FromDec(s:integer;i:byte):string;
begin
if s < i then FromDec := HexDig[s+1]
else
FromDec:= FromDec(s div i,i)+ HexDig[(s mod i)+1];
end;
Ответить