Розробити застосування, яке допомагатиме вчителю математики. Застосування повинне надавати такі можливості:
- Вводити математичні рівняння, що містять числа (цілі, або десяткові дроби), а також математичні операції +, -, *, / та круглі дужки, рівень вкладеності дужок – довільний. У всіх рівняннях невідома величина позначається англійською літерою x.
- Перевіряти введене рівняння на коректність розміщення дужок
- Перевіряти коректність введеного виразу (не повинно бути 2 знаків математичних операцій поспіль, наприклад, неприпустимий вираз 3+•4, в той же час, вираз 4•-7 є допустимим). Приклади коректних рівнянь: 2•x+5=17, -1.3•5/x=1.2, 2•x=10, 2•x+5+х+5=10, 17=2•x+5
- Якщо рівняння є коректним, зберегти його у БД.
- Надати можливість ввести корені рівняння, під час введення перевіряти, чи є задане число коренем, і якщо так – зберігати його в БД.
- Реалізувати функції пошуку рівнянь у БД за їхніми коренями. Наприклад, можливий запит: знайти всі рівняння, що мають один із зазначених коренів або знайти всі рівняння, які мають рівно один корінь.
- Проект має бути реалізований з використанням системи збирання Maven в одному із середовищ розробки: IntelliJ IDEA або Eclipse.
- Проект має бути завантажений у репозиторій GitHub та надано посилання для його отримання. Також допустимо надіслати архів із проектом.
-
(1) Було створено контролер, методи якого приймають на вхід математичний вираз (
MathExpression
entity). У ньому створені допоміжні методи:getFormattedExpression()
, який форматує вираз, прибираючи зайві символи; таisEquation()
, який перевіряє, чи є вираз рівнянням. -
(2, 3) Перевірка на валідність виразу здійснюється в першу чергу на рівні контроллера за допомогою анотації
@Valid
. Перед цим у класіMathExpression
було розставлено потрібні анотації та створена власна:@MathematicalExpression
@MathematicalExpression private String expression;
Для цієї анотації було створено валідатор
@Constraint(validatedBy = MathExpressionValidator.class)
. Його публічний методpublic boolean isValid(String expression, ConstraintValidatorContext context)
гарантує коректність розміщення дужок та порядку розставлення операторів за допомогою приватних методівboolean validParenthesesSymmetry(String expression)
таboolean validOperatorOrder(String expression)
. -
(4) У контролері було створено метод
saveMathExpression(@Valid @RequestBody MathExpression expression)
, який валідує вираз і потім викликається метод сервісного класуMathExpressionService#save(MathExpression expression)
, який форматує вираз та перевіряє, чи не існує такого ж самого в базі даних. Якщо даний вираз вже існує, то такий самий вираз не буде створено. Якщо ні, то новий вираз буде збережено. Приклад запиту:POST http://localhost:8080/expression/expression Content-Type: application/json { "expression": "52+-3*4/2+(2-3)*2" }
Також було створено метод
MathExpressionController#calculateAndSave(@Valid @RequestBody MathExpression expression)
, який також валідує вираз та відправляє на виконання уMathExpressionService#calculateAndSave(MathExpression expression)
. Там проводиться перевірка, чи не є вираз рівнянням, щоб його можна було розв'язати. Потім, вираз форматується та йде на виконання уCalculatorService#calculate(MathExpression expression)
. Вираз конвертується в RPN (Reverse Polish Notation) за допомогою ReversePolishNotation#convertToRpn(MathExpression mathExpression), задля подальших обчислень. Після, RPN обчислюється за допомогою методаcalculateRpnExpression#(String expression)
та повертається результат обчислень. Після всіх обрахунків, у методіMathExpressionService#calculateAndSave
перевіряється, чи не існує такий самий вираз у базі даних. Якщо існує, то нова відповідь обрахнку буде додана (якщо у минулому її не було). Якщо ні, то буде створено новий вираз у базі даних. Приклад запиту:POST http://localhost:8080/expression/calculate Content-Type: application/json { "expression": "2+3*(40-23*(5+2))" }
-
(5) Для цього було створено метод в контролері
checkEquationAndSave(@Valid @RequestBody MathExpression equation)
. Приклад запиту:POST http://localhost:8080/expression/checkEquation Content-Type: application/json { "expression": "5x+3=8", "answers": [1, 3, 5] }
answers
- корені рівняння. Для збереження рівняння в базі даних, у методіMathExpressionService#checkRootsOfEquationAndSave
виконується ітерація кожного кореня та робиться перевірка його правильності відносно рівняння за допомогою методуCalculatorService#checkRootOfEquation
, де рівняння розбивається на дві частини, з кожної сторони створюється RPN та відбувається їх розрахунок. Якщо різниця розрахунків <= 0.1E-9, то корінь вважається правильним. Якщо хоча б один з коренів є неправильним, то рівняння не буде збережено. -
(6) У контролері було реалізовано пошук
MathExpression
: за самим виразом та за відповідями -MathExpressionController#getMathExpression(@RequestBody String expression)
таMathExpressionController#getMathExpressions(@RequestBody List<Double> answers)
відповідно. Приклади запитів:GET http://localhost:8080/expression/searchByAnswers Content-Type: application/json [-361, 2]
GET http://localhost:8080/expression/searchByExpression Content-Type: application/json 52+-3*4/2+(2-3)*2