Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
 Системы счисления  [new]
Tasia17
Member

Откуда:
Сообщений: 15
Можете, плиз объяснить пошагово, что происходит в каждой их этих функций. Это функции для перевода систем счисления.


function FromDec(n,r:longint):string;
var s:String;
const digit:string[16]='0123456789ABCDEF';
begin
  s:='';
  repeat
    s:=digit[(n mod r)+1]+s;
    n:=n div r;
  until n=0;
    FromDec:=s;
end;


function ToDec(n:string;r:longint):longint;
var m,i:longint;
const digit:string[16]='0123456789ABCDEF';
begin
  m:=0;
  while n[1]='0' do
    delete(n,1,1);
  for i:=1 to length(n) do
    m:=m*r+pos(n[i],digit)-1;
  ToDec:=m;
end;

Модератор: Просьба использовать тэг [ SRC ] для оформления кода
7 окт 17, 21:19    [20851363]     Ответить | Цитировать Сообщить модератору
 Re: Системы счисления  [new]
Aleksandr Sharahov
Member

Откуда: Москва
Сообщений: 1314
function FromDec(n,r:longint):string;
запись числа n в виде строки-представления в системе счисления с основанием r

var s:String;
временная локальная строка, где будет формироваться результат

const digit:string[16]='0123456789ABCDEF';
константная строка (массив) с "изображениями" цифр системы счисления, ее длиной (16) ограничивается максимальное значение параметра r, иначе произойдет выход за границу массива

begin
s:='';
формируем пустое "изображение" числа, в него будем добавлять циферки, в принципе "длинные" локальные строки и так инициализируются пустым значением, но не помешает.

repeat
цикл, обрабатываем циферки числа n, вычеркивая по одной справа налево, пока их не останется (n=0),
для числа n=0 должны получить результат '0', поэтому важно что repeat, а не while

s:=digit[(n mod r)+1]+s;
n mod r взяли самую правую циферку
+ 1 и увеличили на 1, т.к. нумерация изображений для циферок в строке digit у нас с 1, а не с 0
digit[(n mod r)+1] взяли изображение циферки самой правой циферки
s:=digit[(n mod r)+1]+s; и приписали его к текущему накопленному результату слева

n:=n div r;
откусили обработанную циферку от числа, уменьшив число в r раз

until n=0;
если число опустело, выходим, иначе обработаем оставшиеся цифры

FromDec:=s;
end;
присваиваем результату нашу временную строку


function ToDec(n:string;r:longint):longint;
обратная функция - получить число по его представлению в виде строки в системе счисления с основанием r

var m,i:longint;
временные переменные для "накопления" результата и организации цикла

const digit:string[16]='0123456789ABCDEF';
уже знаем что это

begin
m:=0;
пока накопили результат=0

while n[1]='0' do
delete(n,1,1);
цикл для отброса лидирующих нулей - лишнее - и без него все будет прекрасно работать

for i:=1 to length(n) do
цикл по всем изображения циферок в строке n

m:=m*r+pos(n[i],digit)-1;
pos(n[i],digit) ищем позицию изображения n[i] в строке digit, если не найдем - получим 0 и результат будет кривой для кривых данных на входе
pos(n[i],digit)-1 уменьшили на 1, чтобы получить циферку по ее позиции,
m:=m*r+pos(n[i],digit)-1; приписали циферку справа к накопленному результату, увеличив результат в r раз и добавив циферку

ToDec:=m;
end;
присваиваем результату текущее накопленное значение
8 окт 17, 12:17    [20852003]     Ответить | Цитировать Сообщить модератору
Все форумы / Программирование Ответить