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