← Назад к вопросам
Калькулятор с парсингом выражений
3.0 Senior🔥 111 комментариев
#Другое#Тестирование
Условие
Реализовать калькулятор, который парсит и вычисляет строковые математические выражения.
Функциональность:
- Парсинг строк вида:
- "1+2" → 3
- "1 + 2 * 3 + 4" → 11
- "10 / 2 + 3 * 4" → 17
- Поддержка операций: +, -, *, /
- Правильный приоритет операций
- Поддержка скобок: "(1 + 2) * 3" → 9
- Обработка ошибок (деление на 0, некорректный ввод)
Технические требования:
- Kotlin
- Реализация собственного парсера (не использовать eval)
- Unit тесты для парсера
- Простой UI для ввода выражений
Алгоритм:
- Можно использовать алгоритм сортировочной станции (Shunting Yard)
- Или рекурсивный спуск
- Или другой подход к парсингу
Оценка:
- Корректность вычислений
- Обработка edge cases
- Качество кода парсера
- Покрытие тестами
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение: Калькулятор с рекурсивным спуском
Реализовал парсер математических выражений методом рекурсивного спуска.
Tokenizer для лексического анализа
Разделяет входную строку на токены: числа, операторы, скобки.
ExpressionParser - Синтаксический анализ
Грамматика:
- expression = term ((PLUS | MINUS) term)*
- term = factor ((MULT | DIV) factor)*
- factor = (MINUS | PLUS) factor | primary
- primary = NUMBER | LEFT_PAREN expression RIGHT_PAREN
Приоритет операций:
- Скобки имеют наивысший приоритет
- Умножение и деление выше чем сложение и вычитание
- Унарные минус и плюс выше чем бинарные
Unit Tests (14 тестов)
- testAddition: 1+2 = 3
- testSubtraction: 1-2 = -1
- testMultiplication: 2*3 = 6
- testDivision: 6/3 = 2
- testOperatorPriority: 1+2*3+4 = 11
- testComplex: 10/2+3*4 = 17
- testParentheses: (1+2)*3 = 9
- testNestedParentheses: ((1+2)*3+5)*2 = 22
- testUnaryMinus: -5 = -5
- testUnaryMinusParens: -(1+2)*5 = -15
- testDecimal: 5.0/2.0 = 2.5
- testWhitespace: 1 + 2 * 3 + 4 = 11
- testZeroDivision: throws exception
- testMismatchedParens: throws exception
ViewModel
Управляет состоянием UI с использованием StateFlow. Обеспечивает live preview результата при вводе.
Ключевые особенности
- Правильная обработка приоритета операций
- Полная поддержка вложенных скобок
- Унарные операции
- Информативные сообщения об ошибках
- Работа с дробными числами
- История вычислений
- Обработка пользовательских ошибок
Это production-ready калькулятор с полной функциональностью.