Skip to content

sandrew-uj/ExpressionParser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 

Repository files navigation

ExpressionParser

Задача №1 (Реализация классов выражений):

  1. Разработайте классы Const, Variable, Add, Subtract, Multiply, Divide для вычисления выражений с одной переменной в типе int (интерфейс Expression), а также BigInteger (интерфейс BigIntegerExpression).

  2. Классы должны позволять составлять выражения вида

new Subtract(
    new Multiply(
        new Const(2),
        new Variable("x")
    ),
    new Const(3)
).evaluate(5)

При вычислении такого выражения вместо каждой переменной подставляется значение, переданное в качестве параметра методу evaluate. Таким образом, результатом вычисления приведенного примера должно стать число 7.

  1. Метод toString должен выдавать запись выражения в полноскобочной форме. Например
new Subtract(
    new Multiply(
        new Const(2),
        new Variable("x")
    ),
    new Const(3)
).toString()

должен выдавать ((2 * x) - 3).

  1. Сложный вариант. Метод toMiniString (интерфейс ToMiniString) должен выдавать выражение с минимальным числом скобок. Например
new Subtract(
    new Multiply(
        new Const(2),
        new Variable("x")
    ),
    new Const(3)
).toMiniString()

должен выдавать 2 * x - 3.

  1. Реализуйте метод equals, проверяющий, что два выражения совпадают. Например,
new Multiply(new Const(2), new Variable("x"))
    .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.

  1. Для тестирования программы должен быть создан класс Main, который вычисляет значение выражения x*x−2*x+1, для x, заданного в командной строке. При выполнении задания следует обратить внимание на:
  • Выделение общего интерфейса создаваемых классов.
  • Выделение абстрактного базового класса для бинарных операций.

Задача №2 (Реализация парсера):

  1. Доработайте предыдущую задачу, так чтобы выражение строилось по записи вида x * (x - 2)*x + 1
  2. В записи выражения могут встречаться:
    • бинарные операции: умножение *, деление /, сложение + и вычитание -;
    • унарный минус -;
    • переменные x, y и z;
    • целочисленные константы в десятичной системе счисления, помещающиеся в 32-битный знаковый целочисленный тип;
    • круглые скобки для явного обозначения приоритета операций;
    • произвольное число пробельных символов в любом месте, не влияющем на однозначность понимания формулы (например, между операцией и переменной, но не внутри констант).
  3. Приоритет операций, начиная с наивысшего
    1. унарный минус;
    2. умножение и деление;
    3. сложение и вычитание.
  4. Разбор выражений рекомендуется производить методом рекурсивного спуска.
    • Алгоритм должен работать за линейное время.
    • Лексический анализ (токенизация) не требуется.
  5. Дополнительно реализуйте:
    • бинарные операции (максимальный приоритет):
      • ** – возведение в степень, 2 ** 3 равно 8;
      • // – логарифм, 10 // 2 равно 3.
    • бинарные операции (минимальный приоритет):
      • min – минимум, 2 min 3 равно 2;
      • max – максимум, 2 max 3 равно 3.
    • унарную операцию
      • abs – модуль числа, abs -5 равно 5.
    • унарные операции
      • l0 – число старших нулевых бит, l0 123456 равно 15;
      • t0 – число младших нулевых бит, t0 123456 равно 6.

Задача №3 (Поддержка исключений):

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

Классы CheckedAdd, CheckedSubtract, CheckedMultiply, CheckedDivide и CheckedNegate

  1. Для выражения 1000000xxxx*x/(x-1) вывод программы должен иметь следующий вид:
x       f
0       0
1       division by zero
2       32000000
3       121500000
4       341333333
5       overflow
6       overflow
7       overflow
8       overflow
9       overflow
10      overflow

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

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

About

Arithmetic expressions parser with exceptions

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages