powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Системы счисления
2 сообщений из 2, страница 1 из 1
Системы счисления
    #39532796
Tasia17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можете, плиз объяснить пошагово, что происходит в каждой их этих функций. Это функции для перевода систем счисления.


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
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 ] для оформления кода
...
Рейтинг: 0 / 0
Системы счисления
    #39532887
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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;
присваиваем результату текущее накопленное значение
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Системы счисления
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]