Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > [Исходники][Delphi][Пример]Перевод числа из десятичной системы счисления в двоичную


Автор: THandle 24.3.2008, 19:15
Задание.

Дана строка изображающая десятичную запись целого положительного числа.
Вывести строку, изображающую двоичную запись этого же числа.


Решение.

Код

program problem;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var
  sDv: string;
  iMod, iDch, iDchr :integer;

begin
  Write('Decatichnoe chislo: ');
  Readln(iDch);
  iDchr := iDch;
  while iDch >= 2 do
    begin
      iMod := iDch mod 2;
      iDch := iDch div 2;
      sDv := IntToStr(iMod) + sDv;
    end;
  sDv := IntToStr(iDch) + sDv;
  Writeln(iDchr, '(10) = ', sDv, '(2)');
  Readln;
end.



Объяснение.


iDch - наше десятичное число.

sDv - двоичное.



Код

  Write('Decatichnoe chislo: ');
  Readln(iDch);
  iDchr := iDch;


Вводим десятичное число.


Код


  while iDch >= 2 do
    begin
      iMod := iDch mod 2;
      iDch := iDch div 2;
      sDv := IntToStr(iMod) + sDv;
    end;


В цикле делаем следующие действия:

Код

  iMod := iDch mod 2;


Получаем остаток от деления десятичного числа на 2.

Код

  iDch := iDch div 2;


Делим десятичное число на два без остатка.

Код

  sDv := IntToStr(iMod) + sDv;


Добавляем в начало нашего двоичного числа остаток от деления
Код

  iMod := iDch mod 2;



Если поделенное на 2 без остатка десятичное число меньше двух, то цикл завершает работу,
так как если десятичное число меньше 2, оно равно либо 1, либо 0, а эти цифры переводить уже не нало, так как они сами собой и останутся.

Код

  sDv := IntToStr(iDch) + sDv;


Ставим в начало нашего двоичного числа оставшееся после цикла десятичное число(1 или 0).

Код

  Writeln(iDchr, '(10) = ', sDv, '(2)');
  Readln;



Выводим на экран десятичное число и его представление в двоичной системе.

Конец программы.





В прикрепленном к сообщению файле находится полный проект этой программы.

Автор: Alix 24.3.2008, 22:06
А можно сразу универсальную написать
Код
type
  TBase = 2..36;

function convert(n : integer; base : TBase) : string;
const
  symbols : array [0..36] of char = '01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var
  digit : byte;

begin
  result := '';
  while n > 0 do begin
    digit := n mod base;
    n     := n div base;
    result := symbols[digit] + result;
  end;
end;

Автор: Demogargon 13.4.2008, 14:54
Нолик лишний после 9, в строке где ты массив создаешь. 

Автор: Alix 14.4.2008, 11:40
точно, молодец! а я сейчас смотрю и думаю, почему в массиве 37 элементов, когда должно быть 36... ))
заодно еще одна ошибка, если передается число ноль, то возвращается пустая строка, как пофиксить, думаю, понятно.

Автор: THandle 14.4.2008, 12:03
Demogargon, молодец, заметил.

Пока сделал вот так: 

Код

type
  TBase = 2..36;
function Convert(n : integer; base : TBase) : string;
const
  cSymbols : array [0..35] of char = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var
  bDigit : byte;
begin
  if n = 0 then
    result := '0'
  else
    result := '';
  while n > 0 do
    begin
      bDigit := n mod base;
      n := n div base;
      result := cSymbols[bDigit] + result;
    end;
end;


В FAQ тоже подправил.

Автор: mrDollar93 20.1.2012, 20:20
Цитата(THandle @ 14.4.2008,  12:03)
Demogargon, молодец, заметил.

Пока сделал вот так: 

Код

type
  TBase = 2..36;
function Convert(n : integer; base : TBase) : string;
const
  cSymbols : array [0..35] of char = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var
  bDigit : byte;
begin
  if n = 0 then
    result := '0'
  else
    result := '';
  while n > 0 do
    begin
      bDigit := n mod base;
      n := n div base;
      result := cSymbols[bDigit] + result;
    end;
end;


В FAQ тоже подправил.

Хороший пример,
но не пойму зачем cSymbols описывать как массив,
если тип STRING и есть тот же массив

var
cSymbols: string;
...
begin
 cSymbols:='0123456...';
...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)