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

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

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

 
 Ответить  Открыть новую тему 
> Суть работы, функция FromDec ToDec
Taur
сообщение 17.12.2007 20:17
Сообщение #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 
 К началу страницы 
+ Ответить 
andriano
сообщение 17.12.2007 20:32
Сообщение #2


Гуру
*****

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

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


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





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

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


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


Гуру
*****

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

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


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


Гость






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

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

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


Гуру
*****

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

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


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

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

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


Гость






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

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


Гуру
*****

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

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


Ты всерьез утверждаешь, что число var i : integer; в десятичной системе считсления?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Taur
сообщение 18.12.2007 15:07
Сообщение #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 - 19.12.2007 1:17
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 18.12.2007 23:05
Сообщение #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

 



- Текстовая версия 20.07.2025 6:43
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"