IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Суть работы, функция FromDec ToDec
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


Люди помогите, очень нужно подробное описание этих функций.
Точнее как она работает и значения всех переменных.

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; - что происходит в данном выражении?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


В начало строки дописывается очередная цифра.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


а для чего прибавляется +1 а потом ко всему выражению +s?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Ты скажи, откуда это взялось, для чего нужно и что ты хочешь сделать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Из FAQ-а это взялось! Вот отсюда: Общие вопросы по математике.

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

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


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Цитата(volvo @ 18.12.2007 9:16) *

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

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


Гость






Сходи уже к окулисту, а? Я что, где-то написал, с каким ПРЕДСТАВЛЕНИЕМ работает функция? Или ты опять выдрал из контекста только то, что тебе было удобно? Я, вообще-то говорил о том, что число переводится из десятичной системы счисления (заметь, в моем посте НЕТ слова представление, мне в данном случае по барабану, как представлено число в памяти, мне надо перевести его в другую систему счисления, естественно, что при этом придется хранить результат в текстовом виде).

Цитата
число переводится из двоичной системы в бинарном представлении в систему по основанию radix
dry.gif Да? Тогда будь последователен, и объясни автору, что 12 в памяти компьютера хранится как 1100 без его участия, иначе сейчас начнутся претензии: "мне надо перевести 12 в с/с с основанием X, я прочел пост №6, и, поскольку функция переводит из 'двоичной системы', вызвал ее: FromDec(1100, X). Че-то не работает..." Может, тебе это и выгодно (посты набивать), а вот мне - нисколько!
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Ты всерьез утверждаешь, что число var i : integer; в десятичной системе считсления?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


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. заранее большое спасибо.

Сообщение отредактировано: Taur -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


В этой строчке:
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
- то получится как раз то, что написано в той строчке.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 5:52
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name