Блог учителя Информатики

Комментарии отключены

Перевод десятичных чисел в двоичные на Pascal

Сегодня мы напишем программу используя язык программирования Pascal, которая будет переводить числа из десятичной системы счисления в двоичную и обратно.

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

В нашем случае — это на два. В результате такого деления мы получаем остатки, числа 0 или 1, которые и составляют наше двоичной число. После каждой операции получения остатка, мы уменьшаем исходное десятичное число на 2, деля его нацело. И так, пока не получим 0.
Для выполнения этих операций нам понадобятся следующие переменные: dec — наше десятичное число, которое мы будем переводить в двоичное; bin — двоичное число, которое мы будем получать в результате вычислений; modulo — переменная в которой будем хранить текущий остаток от деления на 2; rank — текущий разряд двоичного числа.

var
  dec, bin, rank, modulo: integer;
  
begin
  read(dec);
  bin := 0;
  rank := 1;

Теперь введем наше десятичное число используя оператор ввода read(), инициализируем переменные: bin нулем, а rank единицей, указывая на текущий разряд нашего двоичного числа.
Так как при переводе числа мы не знаем сколько операций получения остатка нам придется выполнить, то будем использовать цикл while с условием пока наше десятичное число dec больше нуля.

  while dec > 0 do
  begin
    modulo := dec mod 2;
    dec := dec div 2;
    bin := bin + modulo * rank;
    rank := rank * 10;  
  end;
  write(bin);
end.

Внутри цикла будем получать в modulo текущий остаток от деления десятичного числа на 2. Затем уменьшать его деля нацело на 2. После чего записывать остаток в наше двоичное число умножая его на текущий разряд rank. Затем увеличиваем текущий разряд двоичного числа умножая его на 10.
После прекращения работы цикла выведем наше двоичное число используя оператор вывода write().
У нашей программы есть один недостаток связанный с тем, что мы не сможем переводить числа больше чем 1023. При попытке перевести 1024 мы получим результат равный 1410065408, что не будет являться двоичным числом. Получается это от того, что тип данных integer (а в PascalABC integer является синонимом longint) не может содержать значение больше чем в 10 разрядов. Но при переводе больших чисел, мы получаем двоичную последовательность превышающую допустимые для этого типа данных разрядность.
Решить эту проблему можно двумя способами. Первый заключается в том, что мы будем собирать двоичное число не как число, а как строку. Второй способ заключается в использовании другого типа данных, позволяющего использовать намного больше разрядов, чем integer. В PascalABC добавлен такой тип данных, который называется BigInteger. Это целые числа без ограничения.
Давайте исправим нашу программу за одно превратим ее в функцию dec_to_bin(), которая переводит числа из десятичной системы счисления в двоичную.
В функцию мы передаем любое целое число. Функция возвращает нам целое число типа BigInteger.

function dec_to_bin(dec: BigInteger): BigInteger;
var
  bin, rank, modulo: BigInteger;
begin
  bin := 0;
  rank := 1;
  while dec > 0 do
  begin
    modulo := dec mod 2;
    dec := dec div 2;
    bin := bin + modulo * rank;
    rank := rank * 10;  
  end;
  result := bin;
end;

Чтобы перевести число из двоичной системы счисления в десятичное, мы справа на лево берем по разряду и умножаем его на степень двойки соответствующую текущему разряду, начиная их с нуля.

Для обратного перевода так же напишем функцию. Принимать будем в функцию наше целое двоичное число в переменную bin. Возвращать будем целое десятичное число dec. Так же нам понадобится переменная rank — это текущий разряд двоичного числа и two — значение двойки возведенное в текущее значение разряда. Переменную two инициализируем единицей, т.к. двойка в нулевой степени равна единице. А dec нулем.
Для преобразования нам понадобится цикл с условием. Внутри которого мы будем получать за каждую итерацию крайний правый разряд двоичного числа, находя остаток от деления на 10 и записывая его в переменную rank. Затем наше двоичное число будем уменьшать на один разряд деля его нацело на 10. Будем делать так, пока у нас не закончатся все разряды и мы не получим ноль. Собирать десятичное число будем складывая предыдущее значение с текущим остатком умноженным на степень двойки возведенную в текущее значение разряда. Чтобы получать следующее значение степени двойки будем умножать переменную two на 2.

function bin_to_dec(bin: BigInteger): BigInteger;
var dec, two, rank: BigInteger;
begin
  two := 1;
  dec := 0;
  while bin > 0 do
  begin
    rank := bin mod 10;
    bin := bin div 10;
    dec := dec + rank * two;
    two := two * 2;
  end;
  result := dec;
end;
Поделиться:
Вам также может понравится
Делаем Черепашку в виде снежинки
Решение задачи ExamBegin80
Решение задачи ExamBegin79
Решение задачи ExamBegin78