team-work-it-penguinqq
Mathematical Expression Calculator - Variant 3
👥 Участники проекта
Student 1: Specification Engineer
- GitVerse аккаунт: @penguinqq
- Роль: Создание системной спецификации (codex.md) на основе варианта 3
Student 2: Developer
- GitVerse аккаунт: @alisa_boules
- Роль: Реализация кода калькулятора по спецификации
- Инструменты: VS Code + AI-ассистент (cursor)
Student 3: Code Reviewer
- GitVerse аккаунт: @JohnReed7
- Роль: Код-ревью и контроль соответствия спецификации
Дополнительно: @penguinqq был в роли Student 2: Developer у @alisa_boules
📋 Описание проекта
Mathematical Expression Calculator — консольное приложение на C#, которое парсит математические выражения в инфиксной нотации, преобразует их в обратную польскую запись (postfix) с помощью алгоритма Shunting Yard и вычисляет результат с использованием стека.
Основные возможности
- 📥 Ввод выражений в инфиксной форме:
,5 + 3 * 2,(10 - 2) * 5.2 ^ 3 ^ 2 - 🔃 Конвертация Infix → Postfix (Reverse Polish Notation) по алгоритму Shunting Yard.
- 🧮 Вычисление postfix-выражения с помощью стека с поддержкой операторов
,+,-,*,/.^ - 🧱 Обработка скобок и приоритета операций, включая право-ассоциативный оператор возведения в степень.
- 🚫 Детальная обработка ошибок: деление на ноль, некорректные символы, подряд идущие операторы, несбалансированные скобки и т.п.
🛠️ Технологии и инструменты
- Язык: C# (.NET 6.0+).
- Тип приложения: Console Application.
- Парадигма: Object-Oriented Programming (OOP) с выделенными классами для токенизации, валидации, конвертации и вычисления.
- Алгоритмы:
- Shunting Yard (Dijkstra) — преобразование инфиксной нотации в postfix.
- Стековая интерпретация postfix-выражений.
- Собственная реализация возведения в степень без
(через цикл и аппроксимации).Math.Pow()
- Библиотеки:
,System, ограниченноSystem.Collections.Generic(System.Linq,Select,Where).ToList
- IDE: Visual Studio Code.
📁 Структура репозитория
- Файл
содержит формальное описание System Prompt, данных, функциональных требований, ограничений и критериев приёмки для варианта 3.codex.md - Файл
реализует все описанные классы и консольное меню.solution.cs - Файл
содержит реальные логи общения с приложением: корректные вычисления и обработку ошибок.artefacts.md
💻 Описание кода
Архитектура приложения
Основной код расположен в пространстве имён и разделён на несколько ключевых компонентов.
1. TokenType и Token
Перечисление описывает типы токенов: Number, Operator, LeftParen, RightParen, Invalid.
Класс хранит:
— тип токена.Type— строковое значение (например,Value,"5","+")."("— индекс символа в исходном выражении для точной диагностики ошибок.Position
2. ExpressionTokenizer
Отвечает за лексический разбор строки выражения в список токенов.
Основные задачи:
- Пропуск пробелов и разделение по символам.
- Распознавание:
- скобок
и(,) - операторов
,+,-,*,/,^ - чисел (целые и вещественные, с проверкой формата).
- скобок
- Генерация
при некорректных символах или числе.FormatException
3. ExpressionValidator
Проверяет корректность структуры выражения до конвертации и вычисления.
— общий вход: проверка непустого списка, баланса скобок и корректной последовательности токенов.Validate()— стек для проверки балансаValidateParentheses()/(.)— отфильтровывает скобки и проверяет:ValidateTokenSequence()- что выражение не начинается/не заканчивается оператором;
- что не встречаются подряд два оператора или два числа;
- формирует человекочитаемые сообщения об ошибках с указанием позиции.
Примеры из подтверждают корректную обработку ошибок: , , , .
4. InfixToPostfixConverter
Реализует алгоритм Shunting Yard для преобразования списка токенов из инфиксной формы в postfix.
- Используется стек операторов и список выходных токенов.
- Учитывается приоритет (
) и ассоциативность (для+/- < */ < ^— правая).^ - Выбрасывает ошибку при несоответствии скобок (дополнительная защита).
5. PostfixEvaluator
Вычисляет значение postfix-выражения с помощью стека чисел.
- Числа парсятся в
и помещаются в стек.double - При встрече оператора достаются два операнда и выполняется операция в
.ApplyOperator() - Деление на ноль генерирует
, который затем преобразуется в сообщениеDivideByZeroExceptionдля пользователя.Division by zero - Возведение в степень реализовано вручную в методе
, безPower().Math.Pow()
6. Calculator
Высокоуровневый фасад, который связывает все этапы:
- Tokenize → 2. Validate → 3. Convert (Infix→Postfix) → 4. Evaluate.
Возвращает кортеж: успешность, результат, строку postfix и сообщение об ошибке.
7. Program
Точка входа с интерактивным меню.
Команды:
— ввод выражения, показ postfix и результата, цикл сCalculate expression.Continue? (y/n)— вывод таблицы приоритетов и ассоциативности.Show operator precedence— демонстрация корректных выражений и ожидаемых результатов.Show example expressions— завершение работы.Exit
🎯 Ключевые особенности реализации
✅ Соответствие спецификации (codex.md)
- Используются все требуемые классы:
,ExpressionTokenizer,ExpressionValidator,InfixToPostfixConverter,PostfixEvaluator,Calculator.Program - Соблюдены ограничения:
- нет встроенных вычислителей выражений и
;DataTable.Compute() - возведение в степень реализовано вручную, без
;Math.Pow() - стек используется как основная структура данных для вычисления.
- нет встроенных вычислителей выражений и
- Обрабатываются все описанные в спецификации граничные случаи: пустой ввод, некорректные числа, неверные символы, несбалансированные скобки, деление на ноль и др.
🔧 Алгоритмы и сложность
- Shunting Yard и стековая интерпретация работают за O(n) по длине выражения (один проход по токенам).
- Память — O(n) за счёт хранения списка токенов и стека операторов/операндов.
🧪 Демонстрационные артефакты
Логи в показывают:
- Корректные вычисления:
,6 / 3 → 2,000000,5+7 → 12,000000.5-7 → -2,000000 - Правильную обработку ошибок: деление на ноль, лишняя скобка, неверные символы, отсутствующие операнды.
🚀 Как запустить
Требования
- Установленный .NET SDK 6.0 или новее.
Шаги
При запуске появится меню:
📊 Процесс работы над проектом
Этап 1: Спецификация (Student 1)
- Анализ варианта 3 «Калькулятор с обработкой выражений» из
.task_variants.md - Подготовка формальной спецификации в
:codex.md- System Prompt, ограничения, форматы ввода/вывода;
- структура данных (Token, Operator Metadata);
- функциональные требования к классам и методам;
- список edge cases и критерии приёмки.
Этап 2: Реализация (Student 2)
- Импорт спецификации в контекст AI-ассистента и последовательная генерация кода.
- Реализация всех классов и меню в одном файле
для упрощения проверки.solution.cs - Тестирование на примерах из
и дополнительных сценариях.codex.md
Этап 3: Демонстрация и ревью (Student 3)
- Запуск приложения и запись логов работы в
.artefacts.md - Визуальная фиксация процесса командной работы и пары «spec → code → review» в
.teamcoding*.jpg - Проверка соответствия кода требованиям спецификации и корректности обработки ошибок.
🎓 Выводы
В ходе проекта команда:
- Закрепила навыки работы с парсингом строк, стеками и алгоритмом Shunting Yard на C#.
- Научилась строить приложение строго по формальной спецификации и проверять его по чек-листу критериев приёмки.
- Отработала процесс командной разработки: разделение ролей (Specification Engineer, Developer, Reviewer), использование AI-ассистентов и документирование артефактов работы.