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