Skip to content

Latest commit

 

History

History

README.md

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

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

Алгоритм должен работать за линейное время.

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

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

Результат division by zero (overflow) означает, что в процессе вычисления произошло деление на ноль (переполнение).

При выполнении задания следует обратить внимание на дизайн и обработку исключений.

Человеко-читаемые сообщения об ошибках должны выводиться на консоль.

Программа не должна «вылетать» с исключениями (как стандартными, так и добавленными).