Calculatir extra Factorial and Logarithm

Простой калькулятор

Поддерживаются базовые арифметические операции и ввод десятичных чисел. Операции производятся над значением из единственного регистра (он же - приёмник результата) и, если операция бинарная, вторым операндом, вводимым после оператора.

Ограничения

Размер вводимых чисел ограничен 10 десятичными цифрами.

Операции

  • сложение +
  • вычитание -
  • умножение *
  • деление /
  • остаток от деления %
  • инвертирование знака _
  • возведение в степень ^
  • квадратный корень SQRT

Пользовательский интерфейс

Пользовательский ввод построчно читается из стандартного ввода, в каждой строке ожидается одна операция:

op [arg]

Результат каждой операции выводится в стандартный вывод, сообщения об ошибках - в стандартный вывод ошибок.

Поддержка операций вычисления факториала и логарифма по произвольному основанию в калькуляторе

Задание

Требуется расширить реализацию калькулятора двумя новыми операциями: факториал и логарифм по произвольному основанию.

Факториал - унарная операция над значением регистра калькулятора. Если в регистре находится что-то отличное от неотрицательного целого числа, нужно выдать ошибку.

Логарифм - бинарная операция, основание указывается в качестве аргумента, а значение регистра используется как число от которого берётся логарифм. Оба числа должны быть положительными, иначе нужно выдать ошибку.

Поменять код так, чтобы программный интерфейс не поменялся - реализация должна предоставлять в качестве интерфейса функцию double process_line(double, const std::string &).

Синтаксис

  • ! - факториал
  • LOG 10 - десятичный логарифм
  • LOG 0.1 - логарифм по основанию 0.1

Индикация ошибок

Как и в прочих случаях, при обнаружении ошибки нужно записать понятное сообщение в std::cerr и не менять значение регистра калькулятора.

Формат сообщения об ошибке для факториала:

Bad argument for factorial: xxxx

Формат сообщения об ошибке для логарифма (значение регистра не подходит):

Bad argument for logarithm: xxxx

или (значение базы не подходит):

Bad base for logarithm: yy