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

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

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

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

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

textual
Листинг программы
  1. var n, d, s: string; {строки: исходное число, десятичное число, знак числа}
  2.     i, j, k, p, e, r, c: integer; {счётчики, система счисления, точность перевода, значение разряда, перенос}
  3.     dd: double; {число в 10сс}
  4.     f: boolean; {флаг верного результата}
  5. begin
  6.   {ввод системы счисления с проверкой}
  7.   repeat
  8.     write('Введите основание системы счисления в диапазоне [2..9]: ');
  9.     readln(p)
  10.   until p in [2..9];
  11.   {ввод числа с проверкой}
  12.   repeat
  13.     write('|n| < 1;  n = ');
  14.     readln(n);
  15.     f := length(n) > 0; {если не пустая строка, то верно}
  16.     if f {если верно, то проверяем дальше}
  17.       then begin
  18.         s := ''; {знак пока +}
  19.         if n[1] in ['+', '-'] {если знак написан явно,}
  20.           then begin {то}
  21.             if n[1] = '-' then s := n[1]; {если число отрицательное, то знак -}
  22.             delete(n, 1, 1) {удаляем знак}
  23.           end;
  24.         while (length(n) > 2) and (n[1] = '0') do delete(n, 1, 1); {удаляем незначащие 0, если они есть}
  25.         f := (length(n) >= 2) and (n[1] in ['.', ',']); {если длина строки больше двух и есть разделитель, то верно}
  26.         if f {если верно, то проверяем дальше}
  27.           then begin
  28.             delete(n, 1, 1); {удаляем разделитель}
  29.             for i := 1 to length(n) do {проверяем цифры числа}
  30.               begin
  31.                 f := n[i] in ['0'..char(byte('0') + p - 1)]; {если цифра в диапазоне 0..p-1, то верно}
  32.                 if not f then break {если неверно, то прерываем проверку}
  33.               end
  34.           end
  35.       end;
  36.     if not f then writeln('Это не число, по модулю меньшее 1, и в системе счисления ', p, ', повторите ввод.')
  37.   until f;
  38.   {ввод точности перевода с проверкой}
  39.   repeat
  40.     write('Введите количество цифр после десятичной точки в диапазоне [1..15]');
  41.     readln(e)
  42.   until e in [1..15];
  43.   {перевод числа в десятичную систему счисления}
  44.   d := ''; {пока цифр нет}
  45.   for i := 1 to e + 1 do {делаем на одну цифру больше, чтобы потом была возможность округлить число}
  46.     begin
  47.       for j := length(n) downto 1 do {цикл умножения числа на 10 в системе счисления p}
  48.         begin
  49.           r := (byte(n[j]) - byte('0')) * 10; {умножаем текущий разряд числа на 10}
  50.           n[j] := char(byte('0') + r mod p); {записываем разряд в исходное число}
  51.           c := r div p; {перенос}
  52.           for k := j - 1 downto 1 do {распространяем перенос на старшие разряды}
  53.             if c = 0 {если переноса нет,}
  54.               then break {то выходим}
  55.               else begin {иначе складываем разряд и перенос}
  56.                 r := (byte(n[k]) - byte('0')) + c; {складываем текущий разряд и перенос}
  57.                 n[k] := char(byte('0') + r mod p); {записываем разряд в исходное число}
  58.                 c := r div p {перенос}
  59.               end
  60.         end;
  61.       d := d + char(byte('0') + c) {дописываем полученную цифру (последний перенос) к выходному числу}
  62.     end;
  63.   if d[length(d)] >= '5' {если младший разряд выходного числа не менее 5,}
  64.     then begin {то округляем}
  65.       c := 1; {перенос = 1}
  66.       for k := length(d) - 1 downto 1 do {распространяем перенос на старшие разряды}
  67.         if c = 0
  68.           then break
  69.           else begin
  70.             r := (byte(d[k]) - byte('0')) + c;
  71.             d[k] := char(byte('0') + r mod 10);
  72.             c := r div 10
  73.           end
  74.     end;
  75.   delete(d, length(d), 1); {убираем лишний младший разряд}
  76.   while (length(d) > 1) and (d[length(d)] = '0') do delete(d, length(d), 1); {убираем младшие незначащие разряды}
  77.   d := s + '0.' + d; {добавляем знак и целую часть}
  78.   {печать результата}
  79.   writeln(d);
  80.   {val(d, dd, c);} {если нужна не строка, представляющая число, а само число}
  81.   readln
  82. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы