Неверов Евгений Викторович
Меню сайта
Категории раздела
Программирование на языке Паскаль [27]
В данной категории представлены новые функции, созданные на языке Паскаль, которые могут пригодиться при написании своих программ
Программирование на Delphi [18]
В данной категории представлены полезные подпрограммы, которые могут пригодиться при написании своих программ, а также рассматриваются примеры готовых проектов, создаваемых в среде программирования Delphi
Программирование на HTML [0]
В данной категории рассматриваются примеры готовых проектов, создаваемых на языке HTML
Прочее [0]
Свободная тематика
Мини-чат
200
Наш опрос
Как Вы думаете, сколько времени люди проживут на Земле?
Всего ответов: 32
Статистика

Рейтинг@Mail.ru
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Программирование на языке Паскаль [ Добавить статью ]

Перевод чисел из одних систем счисления в другие

1. Определение кода числа системы счисления


function Kod_chisla_system(cifra: integer): char;
begin
   Result:='0';
   If (cifra>=0) and (cifra<=9) then
      Result:=Char(48+cifra);
   If (cifra>=10) and (cifra<=35) then
      Result:=Char(55+cifra);
end;

где

cifra - цифра от 0 до 35.

Например, Kod_chisla_system(2) выведет '2'; Kod_chisla_system(14) выведет 'E' (в шестнадцатеричной системе счисления).

Примечание 1. Вспомогательная функция Kod_chisla_system предназначена для нижеуказанных функций.

Примечание 2. В настоящее время существуют 16-ричные системы счисления, однако автор решил пофантазировать и расширил весь латинский алфавит. Поэтому не стоит удивляться, если при вызове функции Kod_chisla_system(35) выведет 'Z'. Но может в дальнейшем "изобретут" 32-ричные системы счисления, 36-ричные и т.д.


2. Перевод целого числа из одной системы счисления в любую другую (общий случай)


function Perewod_iz_n_w_m(chislo: string; iz_n, w_m: integer): string;
var i, k, step: integer;
    chislo_10: int64;
    s: char;
    z: -1..1;
begin
   Result:='';
   { проверка основания системы счисления }
   If (iz_n<2) or (iz_n>36) or (w_m<2) or (w_m>36) then
      Exit;
   { проверка на отрицательные числа }
   If (chislo<>'') and (chislo[1]='-') then
   begin
      z:=-1;
      Delete(chislo, 1, 1);
   end else
      z:=1;
   { перевод в десятичное число }
   step:=1;
   chislo_10:=0;
   For i:=Length(chislo) downto 1 do
   begin
      s:=chislo[i];
      k:=0;
      If (s>='0') and (s<='9') then
         k:=StrToInt(s);
      If (s>='a') and (s<='z') then
         s:=UpCase(s);
      If (s>='A') and (s<='Z') then
         k:=Ord(s)-55;
      If k>=iz_n then
         Exit;
      chislo_10:=chislo_10+k*step;
      step:=step*iz_n;
   end;
   { далее перевод в нужную систему счисления }
   Repeat
      i:=chislo_10 mod w_m;
      Result:=kod_chisla_system(i)+Result;
      chislo_10:=chislo_10 div w_m;
   Until chislo_10=0;
   { корректировка ответа и знака }
   If Result='' then
      Result:='0';
   If (z<0) and (Result<>'0') then
      Result:='-'+Result;
end;

где

chislo - исходное целое число, записанное в строковом виде;

iz_n - система счисления числа chislo;

w_m - система счисления получаемого числа.

Например, Perewod_iz_n_w_m('11110', 2, 10) выведет '30'; Perewod_iz_n_w_m('1F', 16, 10) выведет '31'; Perewod_iz_n_w_m('71', 8, 16) выведет '39'; Perewod_iz_n_w_m('-z', 36, 2) выведет '-100011'.

Примечание. Функция Perewod_iz_n_w_m и другие нижеперечисленные функции позволяют переводить отрицательные числа. Если необходимо перевести только положительные числа, достаточно убрать в коде следующие строки:

z: -1..1;
...
{ проверка на отрицательные числа }
If (chislo<>'') and (chislo[1]='-') then
begin
   z:=-1;
   Delete(chislo, 1, 1);
end else
   z:=1;
...
If (z<0) and (Result<>'0') then
   Result:='-'+Result;

3. Перевод целого десятеричного числа в любую систему счисления


function Perewod_iz_10_w_n(chislo, w_n: int64): string;
var i: integer;
    z: -1..1;
begin
   Result:='';
   If (w_n>36) or (w_n<2) then
      Exit;
   If chislo<0 then
   begin
      z:=-1;
      chislo:=-chislo;
   end else
      z:=1;
   Repeat
      i:=chislo mod w_n;
      Result:=Kod_chisla_system(i)+Result;
      chislo:=chislo div w_n;
   Until chislo=0;
   If Result='' then
      Result:='0';
   If (z<0) and (Result<>'0') then
      Result:='-'+Result;
end;

где

chislo - исходное целое десятеричное число;

w_n - система счисления.

Например, Perewod_iz_10_w_n(225, 2) выведет '11100001'; Perewod_iz_10_w_n(-541, 16) выведет '-21D'; самое интересное, что Perewod_iz_10_w_n(1583, 36) выведет '17Z'.


4. Перевод целого десятеричного числа в двоичную систему счисления (частный случай)


function Perewod_iz_10_w_2(chislo: int64): string;
var i: integer;
    z: -1..1;
begin
   Result:='';
   If chislo<0 then
   begin
      z:=-1;
      chislo:=-chislo;
   end else
      z:=1;
   Repeat
      i:=chislo mod 2;
      Result:=IntToStr(i)+Result;
      chislo:=chislo div 2;
   Until chislo=0;
   If Result='' then
      Result:='0';
   If (z<0) and (Result<>'0') then
      Result:='-'+Result;
end;

где

chislo - исходное целое десятеричное число.

Например, Perewod_iz_10_w_2(12) выведет '1100'; Perewod_iz_10_w_2(-8) выведет '-1000'.


5. Перевод вещественного (десятичного) десятеричного числа в любую систему счисления


function Perewod_iz_10_w_nR(chislo: real; w_n, kol_wo_posle_zapyat: integer): string;
var i: integer;
    z: -1..1;
begin
   If chislo<0 then
   begin
      z:=-1;
      chislo:=-chislo;
   end else
      z:=1;
   Result:=Perewod_iz_10_w_n(Trunc(chislo), w_n)+',';
   chislo:=Frac(chislo);
   For i:=1 to kol_wo_posle_zapyat do
   begin
      chislo:=chislo*w_n;
      Result:=Result+Kod_chisla_system(Trunc(chislo));
      chislo:=Frac(chislo);
   end;
   If z<0 then
      Result:='-'+Result;
end;

где

chislo - исходное вещественное (десятичное) десятеричное число;

w_n - система счисления;

kol_wo_posle_zapyat - количество цифр после запятой.

Например, Perewod_iz_10_w_nR(25.93, 8, 10) выведет '31,7341217270'; Perewod_iz_10_w_nR(-0.01, 16, 7) выведет '-0,028F5C2'.


6. Перевод целого числа любой системы счисления в десятеричное число


function Perewod_iz_n_w_10(chislo: string; iz_n: integer): int64;
var i, k: integer;
    step: int64;
    s: char;
    z: -1..1;
begin
   Result:=0;
   If (iz_n<2) or (iz_n>36) then
      Exit;
   If (chislo<>'') and (chislo[1]='-') then
   begin
      z:=-1;
      Delete(chislo, 1, 1);
   end else
      z:=1;
   step:=1;
   For i:=Length(chislo) downto 1 do
   begin
      s:=chislo[i];
      k:=0;
      If (s>='0') and (s<='9') then
         k:=StrToInt(s);
      If (s>='a') and (s<='z') then
         s:=UpCase(s);
      If (s>='A') and (s<='Z') then
         k:=Ord(s)-55;
      If k>=iz_n then
      begin
         Result:=0;
         Exit;
      end;
      Result:=Result+k*step;
      step:=step*iz_n;
   end;
   If z<0 then
      Result:=-Result;
end;

где

chislo - исходное число любой системы счисления;

iz_n - система счисления.

Например, Perewod_iz_n_w_10('-6a7D', 16) выведет '-27261'; Perewod_iz_n_w_10('17z', 36) выведет '1583'.


7. Перевод целого двоичного числа в десятеричную систему счисления (частный случай)


function Perewod_iz_2_w_10(chislo: string): int64;
var i, k: integer;
    step: int64;
    s: char;
    z: -1..1;
begin
   Result:=0;
   If (chislo<>'') and (chislo[1]='-') then
   begin
      z:=-1;
      Delete(chislo, 1, 1);
   end else
      z:=1;
   step:=1;
   For i:=Length(chislo) downto 1 do
   begin
      s:=chislo[i];
      k:=StrToInt(s);
      Result:=Result+k*step;
      step:=step*2;
   end;
   If z<0 then
      Result:=-Result;
end;

где

chislo - исходное целое двоичное число.

Например, Perewod_iz_2_w_10('-1110') выведет '-14'.


8. Перевод целого двоичного числа в шестнадцатеричную систему счисления (частный случай)


function Perewod_iz_2_w_16(chislo: string): string;
const Base: array [0..15, 0..1] of string = (('0000', '0'), ('0001', '1'),
         ('0010', '2'), ('0011', '3'), ('0100', '4'), ('0101', '5'),
         ('0110', '6'), ('0111', '7'), ('1000', '8'), ('1001', '9'),
         ('1010', 'A'), ('1011', 'B'), ('1100', 'C'), ('1101', 'D'),
         ('1110', 'E'), ('1111', 'F'));
var i, j: integer;
    z: -1..1;
begin
   Result:='';
   If (chislo<>'') and (chislo[1]='-') then
   begin
      z:=-1;
      Delete(chislo, 1, 1);
   end else
      z:=1;
   While Length(chislo) mod 4<>0 do
      chislo:='0'+chislo;
   For i:=1 to Length(chislo) div 4 do
      For j:=Low(Base) to High(Base) do
         If Base[j, 0]=Copy(chislo, (i-1)*4+1, 4) then
         begin
            Result:=Result+Base[j, 1];
            Break;
         end;
   If Result='' then
      Result:='0';
   If (z<0) and (Result<>'0') then
      Result:='-'+Result;
end;

где

chislo - исходное целое двоичное число.

Например, Perewod_iz_2_w_16('-1101') выведет '-D'.


9. Перевод целого шестнадцатеричного числа в двоичную систему счисления (частный случай)


function Perewod_iz_16_w_2(chislo: string): string;
const Base: array [0..15, 0..1] of string = (('0000', '0'), ('0001', '1'),
         ('0010', '2'), ('0011', '3'), ('0100', '4'), ('0101', '5'),
         ('0110', '6'), ('0111', '7'), ('1000', '8'), ('1001', '9'),
         ('1010', 'A'), ('1011', 'B'), ('1100', 'C'), ('1101', 'D'),
         ('1110', 'E'), ('1111', 'F'));
var i, j: integer;
    z: -1..1;
    c: char;
begin
   Result:='';
   If (chislo<>'') and (chislo[1]='-') then
   begin
      z:=-1;
      Delete(chislo, 1, 1);
   end else
      z:=1;
   For i:=1 to Length(chislo) do
   begin
      c:=chislo[i];
      If (c>='a') and (c<='z') then
         c:=UpCase(c);
      For j:=Low(Base) to High(Base) do
         If Base[j, 1]=c then
         begin
            Result:=Result+Base[j, 0];
            Break;
         end;
   end;
   While (Result<>'') and (Result[1]='0') do
      Delete(Result, 1, 1);
   If Result='' then
      Result:='0';
   If (z<0) and (Result<>'0') then
      Result:='-'+Result;
end;

где

chislo - исходное целое шестнадцатеричное число.

Например, Perewod_iz_16_w_2('-6A') выведет '-1101010'.

Категория: Программирование на языке Паскаль | Добавил: newerow1989 (12.03.2016 11:37 )
Просмотров: 316 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Все смайлы
Код *:
Поиск
Друзья сайта
  • Создать сайт
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Все проекты компании
  • Copyright MyCorp © 2018
    Автор этого сайта: Неверов Евгений Викторович

    Мои координаты
    Бесплатный конструктор сайтов - uCozЯндекс.Метрика