Skip to content

Instantly share code, notes, and snippets.

@egormkn
Last active August 26, 2020 19:39
Show Gist options
  • Save egormkn/79d7d2e4399f7aa52137029eca8e8760 to your computer and use it in GitHub Desktop.
Save egormkn/79d7d2e4399f7aa52137029eca8e8760 to your computer and use it in GitHub Desktop.

Домашнее задание: Выражения

Разработайте классы 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) и произвольное число пробельных символов в любом месте (но не внутри констант).

Приоритет операторов, начиная с наивысшего

  • унарный минус;
  • умножение и деление;
  • сложение и вычитание.

Разбор выражений рекомендуется производить методом рекурсивного спуска. Алгоритм должен работать за линейное время.

Дополнение: Обработка ошибок

Добавьте в программу вычисляющую выражения обработку ошибок, в том числе:

  • ошибки разбора выражений;
  • ошибки вычисления выражений.

При выполнении задания следует обратить внимание на дизайн и обработку исключений. Человеко-читаемые сообщения об ошибках должны выводится на консоль. Программа не должна «вылетать» с исключениями (как стандартными, так и добавленными).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment