Tasia17
Дата: 07.10.2017 21:19:46
Можете, плиз объяснить пошагово, что происходит в каждой их этих функций. Это функции для перевода систем счисления.
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 ] для оформления кода |
Aleksandr Sharahov
Дата: 08.10.2017 12:17:21
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;
присваиваем результату текущее накопленное значение