Разработайте классы Const, Variable, Add, Subtract, Multiply, Divide для вычисления выражений с одной переменной. Классы должны позволять составлять выражения вида
expr = Subtract(
Multiply(
Const(2),
Variable("x")
),
Const(3)
)
print(expr.evaluate({ "x": 5 }))
При вычислении такого выражения вместо каждой переменной подставляется значение из словаря, переданного в качестве параметра методу evaluate. Таким образом, результатом вычисления приведенного примера должно стать число 7.
Метод to_string должен выдавать запись выражения в полноскобочной форме. Например
expr = Subtract(
Multiply(
Const(2),
Variable("x")
),
Const(3)
)
print(expr.to_string())
должен выдавать ((2 * x) - 3)
.
Сложный вариант. Метод to_mini_string должен выдавать выражение с минимально необходимым числом скобок. Например
expr = Subtract(
Multiply(
Const(2),
Variable("x")
),
Const(3)
)
print(expr.to_mini_string())
должен выдавать 2 * x - 3
.
Реализуйте метод equals, проверяющий, что два выражения совпадают. Например,
expr1 = Multiply(Const(2), Variable("x"))
expr2 = Multiply(Const(2), Variable("x"))
print(expr1.equals(expr2))
должно выдавать true
, а
expr1 = Multiply(Const(2), Variable("x"))
expr2 = Multiply(Variable("x"), Const(2))
print(expr1.equals(expr2))
должно выдавать false
.
Для тестирования программы должен быть создан скрипт main.py, который вычисляет значение выражения x2−2x+1, для x, заданного в командной строке.
При выполнении задания следует обратить внимание на:
- Выделение общего интерфейса создаваемых классов.
- Выделение абстрактного базового класса для унарных операций.
- Выделение абстрактного базового класса для бинарных операций.
Доработайте предыдущее домашнее задание, так что бы выражение строилось по записи вида
x * (x - 2)*x + 1
В записи выражения могут встречаться: умножение *
, деление /
, сложение +
, вычитание -
, унарный минус -
, целочисленные константы (в десятичной системе счисления), круглые скобки, переменные (x
) и произвольное число пробельных символов в любом месте (но не внутри констант).
Приоритет операторов, начиная с наивысшего
- унарный минус;
- умножение и деление;
- сложение и вычитание.
Разбор выражений рекомендуется производить методом рекурсивного спуска. Алгоритм должен работать за линейное время.
Добавьте в программу вычисляющую выражения обработку ошибок, в том числе:
- ошибки разбора выражений;
- ошибки вычисления выражений.
При выполнении задания следует обратить внимание на дизайн и обработку исключений. Человеко-читаемые сообщения об ошибках должны выводится на консоль. Программа не должна «вылетать» с исключениями (как стандартными, так и добавленными).