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

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

Форум «Всё о Паскале» _ Задачи _ Задача на перевод с.с

Автор: Lodar' 29.01.2009 15:08

Составить программу, которая вводит натуральное число N и основание системы счисления p, а затем выводит цифры Aк представления N в p – ричной системе.
Вот нашел функцию. Можете подробно прокоментировать каждую строчку плииз?


function _10toR(x:longint;R:word):string;
var x,ost:longint;
s,st,chislo:string;
begin
repeat
ost:=x mod R;
x:=x div R;
if ost>9 then st:=chr(ord('A')-10+ost)
else str(ost,st);
s:=s+st;
until x=0;
for i:=1 to length(s) do
chislo:=chislo+s[length(s)-i+1];
_10toR:=chislo;
end;


Автор: volvo 29.01.2009 15:55

Откуда ты находишь эти функции - непонятно. Вот же есть:
http://forum.pascal.net.ru/index.php?s=&showtopic=4535&view=findpost&p=38226

Автор: Lodar' 29.01.2009 16:02

 
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;


тут я так понял максимальная система счисления 16-ричная, а в задаче в любую надо.
и еще не понятны вот эти строки

s:=digit[(n mod radix)+1]+s;
n:=n div radix;


если не трудно поясните подробно плииз

Автор: Lodar' 29.01.2009 16:45

а какая система счисления максимальная?

Добавлено через 2 мин.


s:=digit[(n mod radix)+1]+s;
n:=n div radix;


сам разобрался) но про максимальную с.с вопрос остается открытым

Автор: volvo 29.01.2009 16:49

Цитата
а в задаче в любую надо
Любую, говоришь? Ну, попробуй сделать
  writeln(_10toR(50652, 37));
, когда исправишь в самой функции все ошибки, чтоб она заработала. Посмотри, что будет... А ты говоришь "любую".

Хочешь до С/С с основанием 36 - меняй digit:
digit: string[36]='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
Можешь еще алфавит увеличить, добавить еще какие-нибудь символы, тогда можно будет переводить к бОльшему основанию.

Цитата
поясните подробно плииз
Сначала идешь сюда: http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F#.D0.9F.D0.B5.D1.80.D0.B5.D0.B2.D0.BE.D0.B4_.D0.B8.D0.B7_.D0.B4.D0.B5.D1.81.D1.8F.D1.82.D0.B8.D1.87.D0.BD.D0.BE.D0.B9_.D0.B2_.D0.BF.D1.80.D0.BE.D0.B8.D0.B7.D0.B2.D0.BE.D0.BB.D1.8C.D0.BD.D1.83.D1.8E_.D0.BF.D0.BE.D0.B7.D0.B8.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.83.D1.8E_.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D1.83_.D1.81.D1.87.D0.B8.D1.81.D0.BB.D0.B5.D0.BD.D0.B8.D1.8F , а потом читаешь комментарии к строкам:

{
Сначала получаем остаток от деления числа на основание С/С, а потом
дописываем к строке-результату _спереди_ символ, который в выбранной
системе счисления (radix) соответствует полученному остатку. Вот и все,
никаких преобразований число->строка, никаких условий, остаток больше
или меньше 10... Все просто. (+1) - потому, что символы в строке индексируются с 1
}
s:=digit[(n mod radix)+1]+s;
{
Ну, остаток мы записали в результат, теперь осталось обработать остальное:
получаем целую часть от деления на основание, и продолжаем по тому же алгоритму.
}
n:=n div radix;

Автор: Lodar' 29.01.2009 17:20

Спасибо большое разобрался!