Перевести дробное недесятичное число с основанием p в десятичную систему - Pascal

Узнай цену своей работы

Формулировка задачи:

Составьте программу на Паскале, переводящую дробное (меньшее единицы) недесятичное число с основанием p (2..9) в десятичную систему счисления. Выполните тестирование программы. Помогите, пожалуйста)))

Решение задачи: «Перевести дробное недесятичное число с основанием p в десятичную систему»

textual
Листинг программы
var n, d, s: string; {строки: исходное число, десятичное число, знак числа}
    i, j, k, p, e, r, c: integer; {счётчики, система счисления, точность перевода, значение разряда, перенос}
    dd: double; {число в 10сс}
    f: boolean; {флаг верного результата}
begin
  {ввод системы счисления с проверкой}
  repeat
    write('Введите основание системы счисления в диапазоне [2..9]: ');
    readln(p)
  until p in [2..9];
  {ввод числа с проверкой}
  repeat
    write('|n| < 1;  n = ');
    readln(n);
    f := length(n) > 0; {если не пустая строка, то верно}
    if f {если верно, то проверяем дальше}
      then begin
        s := ''; {знак пока +}
        if n[1] in ['+', '-'] {если знак написан явно,}
          then begin {то}
            if n[1] = '-' then s := n[1]; {если число отрицательное, то знак -}
            delete(n, 1, 1) {удаляем знак}
          end;
        while (length(n) > 2) and (n[1] = '0') do delete(n, 1, 1); {удаляем незначащие 0, если они есть}
        f := (length(n) >= 2) and (n[1] in ['.', ',']); {если длина строки больше двух и есть разделитель, то верно}
        if f {если верно, то проверяем дальше}
          then begin
            delete(n, 1, 1); {удаляем разделитель}
            for i := 1 to length(n) do {проверяем цифры числа}
              begin
                f := n[i] in ['0'..char(byte('0') + p - 1)]; {если цифра в диапазоне 0..p-1, то верно}
                if not f then break {если неверно, то прерываем проверку}
              end
          end
      end;
    if not f then writeln('Это не число, по модулю меньшее 1, и в системе счисления ', p, ', повторите ввод.')
  until f;
  {ввод точности перевода с проверкой}
  repeat
    write('Введите количество цифр после десятичной точки в диапазоне [1..15]');
    readln(e)
  until e in [1..15];
  {перевод числа в десятичную систему счисления}
  d := ''; {пока цифр нет}
  for i := 1 to e + 1 do {делаем на одну цифру больше, чтобы потом была возможность округлить число}
    begin
      for j := length(n) downto 1 do {цикл умножения числа на 10 в системе счисления p}
        begin
          r := (byte(n[j]) - byte('0')) * 10; {умножаем текущий разряд числа на 10}
          n[j] := char(byte('0') + r mod p); {записываем разряд в исходное число}
          c := r div p; {перенос}
          for k := j - 1 downto 1 do {распространяем перенос на старшие разряды}
            if c = 0 {если переноса нет,}
              then break {то выходим}
              else begin {иначе складываем разряд и перенос}
                r := (byte(n[k]) - byte('0')) + c; {складываем текущий разряд и перенос}
                n[k] := char(byte('0') + r mod p); {записываем разряд в исходное число}
                c := r div p {перенос}
              end
        end;
      d := d + char(byte('0') + c) {дописываем полученную цифру (последний перенос) к выходному числу}
    end;
  if d[length(d)] >= '5' {если младший разряд выходного числа не менее 5,}
    then begin {то округляем}
      c := 1; {перенос = 1}
      for k := length(d) - 1 downto 1 do {распространяем перенос на старшие разряды}
        if c = 0
          then break
          else begin
            r := (byte(d[k]) - byte('0')) + c;
            d[k] := char(byte('0') + r mod 10);
            c := r div 10
          end
    end;
  delete(d, length(d), 1); {убираем лишний младший разряд}
  while (length(d) > 1) and (d[length(d)] = '0') do delete(d, length(d), 1); {убираем младшие незначащие разряды}
  d := s + '0.' + d; {добавляем знак и целую часть}
  {печать результата}
  writeln(d);
  {val(d, dd, c);} {если нужна не строка, представляющая число, а само число}
  readln
end.

Объяснение кода листинга программы

  1. Объявление переменных:
    • n, d, s: строковые переменные для исходного числа, десятичного числа и знака числа
    • i, j, k, p, e, r, c: целочисленные переменные - счётчики, система счисления, точность перевода, значение разряда, перенос
    • dd: переменная типа double - число в десятичной системе
    • f: булевая переменная, используемая в качестве флага для верного результата
  2. Ввод основания системы счисления с проверкой, чтобы оно находилось в диапазоне от 2 до 9.
  3. Ввод числа с проверкой, чтобы оно было меньше 1 и соответствовало выбранной системе счисления.
  4. Ввод точности перевода с проверкой, чтобы она находилась в диапазоне от 1 до 15.
  5. Перевод числа в десятичную систему счисления:
    • Удаление незначащих нулей, если они есть.
    • Выполнение умножения числа на 10 в системе счисления p и распространение переноса на старшие разряды.
    • Получение выходного числа с заданной точностью после десятичной точки.
  6. Округление результата, если младший разряд выходного числа не менее 5.
  7. Печать результата. Здесь представлен алгоритм перевода дробного числа из выбранной системы счисления в десятичную систему с использованием строки ввода и вывода пользовательского интерфейса.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5
Похожие ответы