Разработайте классы Const, Variable, Add, Subtract, Multiply, Divide для вычисления выражений с одной переменной в типе int (интерфейс Expression).
Классы должны позволять составлять выражения вида
new Multiply(
new Const(2),
new Variable("x")
),
new Const(3)
).evaluate(5)
При вычислении такого выражения вместо каждой переменной подставляется значение, переданное в качестве параметра методу evaluate. Таким образом, результатом вычисления приведенного примера должно стать число 7. Метод toString должен выдавать запись выражения в полноскобочной форме. Например
new Multiply(
new Const(2),
new Variable("x")
),
new Const(3)
).toString()
должен выдавать ((2 * x) - 3).
Реализуйте метод equals, проверяющий, что два выражения совпадают. Например,
.equals(new Multiply(new Const(2), new Variable("x")))
должно выдавать true, а
new Multiply(new Const(2), new Variable("x"))
.equals(new Multiply(new Variable("x"), new Const(2)))
должно выдавать false.
Для тестирования программы должен быть создан класс Main, который вычисляет значение выражения x2−2x+1, для x, заданного в командной строке.
При выполнении задания следует обратить внимание на:
- Выделение общего интерфейса создаваемых классов.
- Выделение абстрактного базового класса для бинарных операций.
Доработайте предыдущее ## к что бы выражение строилось по записи вида
x * (x - 2)*x + 1
В записи выражения могут встречаться:
- бинарные операции: умножение *, деление /, сложение + и вычитание -;
- унарный минус -;
- переменные x, y и z;
- целочисленные константы в десятичной системе счисления, помещающиеся в 32-битный знаковый целочисленный тип;
- круглые скобки для явного обозначения приоритета операций;
- произвольное число пробельных символов в любом месте, не влияющем на однозначность понимания формулы (например, между операцией и переменной, но не внутри констант). Приоритет операций, начиная с наивысшего
- унарный минус;
- умножение и деление;
- сложение и вычитание.
Разбор выражений рекомендуется производить методом рекурсивного спуска.
Алгоритм должен работать за линейное время.
Добавьте в программу, вычисляющую выражения, обработку ошибок, в том числе:
- ошибки разбора выражений;
- ошибки вычисления выражений.
Результат division by zero (overflow) означает, что в процессе вычисления произошло деление на ноль (переполнение).
При выполнении задания следует обратить внимание на дизайн и обработку исключений.
Человеко-читаемые сообщения об ошибках должны выводиться на консоль.
Программа не должна «вылетать» с исключениями (как стандартными, так и добавленными).