Суть работы, функция FromDec ToDec |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Суть работы, функция FromDec ToDec |
Taur |
Сообщение
#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; - что происходит в данном выражении? |
andriano |
Сообщение
#2
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
В начало строки дописывается очередная цифра.
|
Taur |
Сообщение
#3
|
Группа: Пользователи Сообщений: 3 Пол: Мужской Репутация: 0 |
а для чего прибавляется +1 а потом ко всему выражению +s?
|
andriano |
Сообщение
#4
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Ты скажи, откуда это взялось, для чего нужно и что ты хочешь сделать.
|
volvo |
Сообщение
#5
|
Гость |
Из FAQ-а это взялось! Вот отсюда: Общие вопросы по математике.
А что, по названию (FromDec) уже не понятно, что что-то переводится Из десятичной системы счисления? Или флейм неискореним? Автору: s:=digit[(n mod radix)+1]+s;По алгоритму перевода из десятичной системы счисления в другую переводимое число надо делить на основание другой С/С и остатки от деления записывать в ОБРАТНОМ порядке. Что и делается в приведенной строке: число делится на основание новой С/С (n mod radix), прибавляется единица (поскольку в Турбо-Паскале нумерация элементов строки начинается с единицы, а не с нуля, то есть, при получении остатка = 0 нам надо взять первый символ строки S, в котором этот ноль записан), и потом остаток в символьной форме (для этого мы берем содержимое digit[...]) добавляется ПЕРЕД полученной на предыдущей итерации строкой, то есть, сначала остаток, потом строка, содержащая предыдущие остатки. И все это забрасывается опять же в строку, для работы на следующей итерации... |
andriano |
Сообщение
#6
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
А что, по названию (FromDec) уже не понятно, что что-то переводится Из десятичной системы счисления? Или флейм неискореним? volvo, 1. Я лично, слава Богу, вижу и понимаю, что делает данная программа, но цель, очевидно, в том, чтобы это видел и понимал Taur. Поэтому с моей стороны вполне логичен вопрос с целью узнать, что он УЖЕ понимает, а что ему еще нужно объяснить. 2. Несмотря на незамысловатое название FromDec программа, на самом деле, делает совсем не то, что можно было бы подумать по названию, и что написал ты в своем сообщении. Она "что-то переводит" не из десятичного представления, а из внутреннего машинного, каким в данном случае является двоичное. А именно, (да простят меня за тавтологию) число переводится из двоичной системы в бинарном представлении в систему по основанию radix (где radix <= 16dec=10hex) в текстовом. |
volvo |
Сообщение
#7
|
Гость |
Сходи уже к окулисту, а? Я что, где-то написал, с каким ПРЕДСТАВЛЕНИЕМ работает функция? Или ты опять выдрал из контекста только то, что тебе было удобно? Я, вообще-то говорил о том, что число переводится из десятичной системы счисления (заметь, в моем посте НЕТ слова представление, мне в данном случае по барабану, как представлено число в памяти, мне надо перевести его в другую систему счисления, естественно, что при этом придется хранить результат в текстовом виде).
Цитата число переводится из двоичной системы в бинарном представлении в систему по основанию radix Да? Тогда будь последователен, и объясни автору, что 12 в памяти компьютера хранится как 1100 без его участия, иначе сейчас начнутся претензии: "мне надо перевести 12 в с/с с основанием X, я прочел пост №6, и, поскольку функция переводит из 'двоичной системы', вызвал ее: FromDec(1100, X). Че-то не работает..." Может, тебе это и выгодно (посты набивать), а вот мне - нисколько! |
andriano |
Сообщение
#8
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Ты всерьез утверждаешь, что число var i : integer; в десятичной системе считсления?
|
Taur |
Сообщение
#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 - |
Lapp |
Сообщение
#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 - то получится как раз то, что написано в той строчке. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Текстовая версия | 4.05.2024 22:56 |