Помощь - Поиск - Пользователи - Календарь
Полная версия: Суть работы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Taur
Люди помогите, очень нужно подробное описание этих функций.
Точнее как она работает и значения всех переменных.

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;

n - это переменная или строка
mod - остаток
radix - та с/с в которую мы переводим

s:=digit[(n mod radix)+1]+s; - что происходит в данном выражении?
andriano
В начало строки дописывается очередная цифра.
Taur
а для чего прибавляется +1 а потом ко всему выражению +s?
andriano
Ты скажи, откуда это взялось, для чего нужно и что ты хочешь сделать.
volvo
Из FAQ-а это взялось! Вот отсюда: Общие вопросы по математике.

А что, по названию (FromDec) уже не понятно, что что-то переводится Из десятичной системы счисления? Или флейм неискореним? dry.gif

Автору:
s:=digit[(n mod radix)+1]+s;
По алгоритму перевода из десятичной системы счисления в другую переводимое число надо делить на основание другой С/С и остатки от деления записывать в ОБРАТНОМ порядке. Что и делается в приведенной строке: число делится на основание новой С/С (n mod radix), прибавляется единица (поскольку в Турбо-Паскале нумерация элементов строки начинается с единицы, а не с нуля, то есть, при получении остатка = 0 нам надо взять первый символ строки S, в котором этот ноль записан), и потом остаток в символьной форме (для этого мы берем содержимое digit[...]) добавляется ПЕРЕД полученной на предыдущей итерации строкой, то есть, сначала остаток, потом строка, содержащая предыдущие остатки. И все это забрасывается опять же в строку, для работы на следующей итерации...
andriano
Цитата(volvo @ 18.12.2007 9:16) *

А что, по названию (FromDec) уже не понятно, что что-то переводится Из десятичной системы счисления? Или флейм неискореним? dry.gif

volvo,
1. Я лично, слава Богу, вижу и понимаю, что делает данная программа, но цель, очевидно, в том, чтобы это видел и понимал Taur. Поэтому с моей стороны вполне логичен вопрос с целью узнать, что он УЖЕ понимает, а что ему еще нужно объяснить.
2. Несмотря на незамысловатое название FromDec программа, на самом деле, делает совсем не то, что можно было бы подумать по названию, и что написал ты в своем сообщении. Она "что-то переводит" не из десятичного представления, а из внутреннего машинного, каким в данном случае является двоичное. А именно, (да простят меня за тавтологию) число переводится из двоичной системы в бинарном представлении в систему по основанию radix (где radix <= 16dec=10hex) в текстовом.
volvo
Сходи уже к окулисту, а? Я что, где-то написал, с каким ПРЕДСТАВЛЕНИЕМ работает функция? Или ты опять выдрал из контекста только то, что тебе было удобно? Я, вообще-то говорил о том, что число переводится из десятичной системы счисления (заметь, в моем посте НЕТ слова представление, мне в данном случае по барабану, как представлено число в памяти, мне надо перевести его в другую систему счисления, естественно, что при этом придется хранить результат в текстовом виде).

Цитата
число переводится из двоичной системы в бинарном представлении в систему по основанию radix
dry.gif Да? Тогда будь последователен, и объясни автору, что 12 в памяти компьютера хранится как 1100 без его участия, иначе сейчас начнутся претензии: "мне надо перевести 12 в с/с с основанием X, я прочел пост №6, и, поскольку функция переводит из 'двоичной системы', вызвал ее: FromDec(1100, X). Че-то не работает..." Может, тебе это и выгодно (посты набивать), а вот мне - нисколько!
andriano
Ты всерьез утверждаешь, что число var i : integer; в десятичной системе считсления?
Taur
C s:=digit[(n mod radix)+1]+s; все понятно. спс volvo.
что касается зачем:
Я понимаю что эти функции предназначены для перевода чисел из 1-й с/с в другую, и что они прекрасно работают.
Но препод не станет принимать программу если я буду не в силах ему обьяснить принцип ее работы.

Еще если не сложно мне бы хотелось узнать что происходит в данном условии и выражении:
while (n[1]='0') and (length(n) > 1) do delete(n,1,1);
for i:=1 to length(n) do m:=m*radix+pos(n[i],digit)-1;
(функция ToDec)

p.s. заранее большое спасибо.
Lapp
В этой строчке:
while (n[1]='0') and (length(n) > 1) do delete(n,1,1);
- убираются левые нули. То есть число 000123 приводится к виду 123.

Вторая строчка:
 for i:=1 to length(n) do m:=m*radix+pos(n[i],digit)-1;

- это по сути реализация определения записи в n-ричной СС.
На примере десятичной (то есть radix=10):
a4a3a2a1a0 = a4*10000 + a3*1000 + a2*100 + a1*10 + a0
например:
620722 = 6*10000 + 2*1000 + 0*100 + 7*10 + 2
Если сгруппировать вот так:
620722 = ((((6*10) + 2)*10 + 0)*10 + 7)*10 + 2
- то получится как раз то, что написано в той строчке.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.