team-work-it-penguinqq

0
4 месяца назад
4 месяца назад
4 месяца назад
4 месяца назад
4 месяца назад
4 месяца назад
README.md

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.

📁 Структура репозитория

  • Файл
    codex.md
    содержит формальное описание System Prompt, данных, функциональных требований, ограничений и критериев приёмки для варианта 3.
  • Файл
    solution.cs
    реализует все описанные классы и консольное меню.
  • Файл
    artefacts.md
    содержит реальные логи общения с приложением: корректные вычисления и обработку ошибок.

💻 Описание кода

Архитектура приложения

Основной код расположен в пространстве имён

MathExpressionCalculator
и разделён на несколько ключевых компонентов.

1.
TokenType
и
Token

Перечисление

TokenType
описывает типы токенов: Number, Operator, LeftParen, RightParen, Invalid. Класс
Token
хранит:

  • Type
    — тип токена.
  • Value
    — строковое значение (например,
    "5"
    ,
    "+"
    ,
    "("
    ).
  • Position
    — индекс символа в исходном выражении для точной диагностики ошибок.

2.
ExpressionTokenizer

Отвечает за лексический разбор строки выражения в список токенов.

Основные задачи:

  • Пропуск пробелов и разделение по символам.
  • Распознавание:
    • скобок
      (
      и
      )
      ,
    • операторов
      +
      ,
      -
      ,
      *
      ,
      /
      ,
      ^
      ,
    • чисел (целые и вещественные, с проверкой формата).
  • Генерация
    FormatException
    при некорректных символах или числе.

3.
ExpressionValidator

Проверяет корректность структуры выражения до конвертации и вычисления.

  • Validate()
    — общий вход: проверка непустого списка, баланса скобок и корректной последовательности токенов.
  • ValidateParentheses()
    — стек для проверки баланса
    (
    /
    )
    .
  • ValidateTokenSequence()
    — отфильтровывает скобки и проверяет:
    • что выражение не начинается/не заканчивается оператором;
    • что не встречаются подряд два оператора или два числа;
    • формирует человекочитаемые сообщения об ошибках с указанием позиции.

Примеры из

artefacts.md
подтверждают корректную обработку ошибок:
5++
,
5+
,
0 + (9 * 0))
,
y - 3
.

4.
InfixToPostfixConverter

Реализует алгоритм Shunting Yard для преобразования списка токенов из инфиксной формы в postfix.

  • Используется стек операторов и список выходных токенов.
  • Учитывается приоритет (
    +/- < */ < ^
    ) и ассоциативность (для
    ^
    — правая).
  • Выбрасывает ошибку при несоответствии скобок (дополнительная защита).

5.
PostfixEvaluator

Вычисляет значение postfix-выражения с помощью стека чисел.

  • Числа парсятся в
    double
    и помещаются в стек.
  • При встрече оператора достаются два операнда и выполняется операция в
    ApplyOperator()
    .
  • Деление на ноль генерирует
    DivideByZeroException
    , который затем преобразуется в сообщение
    Division by zero
    для пользователя.
  • Возведение в степень реализовано вручную в методе
    Power()
    , без
    Math.Pow()
    .

6.
Calculator

Высокоуровневый фасад, который связывает все этапы:

  1. Tokenize → 2. Validate → 3. Convert (Infix→Postfix) → 4. Evaluate.

Возвращает кортеж: успешность, результат, строку postfix и сообщение об ошибке.

7.
Program

Точка входа с интерактивным меню.

Команды:

  1. Calculate expression
    — ввод выражения, показ postfix и результата, цикл с
    Continue? (y/n)
    .
  2. Show operator precedence
    — вывод таблицы приоритетов и ассоциативности.
  3. Show example expressions
    — демонстрация корректных выражений и ожидаемых результатов.
  4. Exit
    — завершение работы.

🎯 Ключевые особенности реализации

✅ Соответствие спецификации (codex.md)

  • Используются все требуемые классы:
    ExpressionTokenizer
    ,
    ExpressionValidator
    ,
    InfixToPostfixConverter
    ,
    PostfixEvaluator
    ,
    Calculator
    ,
    Program
    .
  • Соблюдены ограничения:
    • нет встроенных вычислителей выражений и
      DataTable.Compute()
      ;
    • возведение в степень реализовано вручную, без
      Math.Pow()
      ;
    • стек используется как основная структура данных для вычисления.
  • Обрабатываются все описанные в спецификации граничные случаи: пустой ввод, некорректные числа, неверные символы, несбалансированные скобки, деление на ноль и др.

🔧 Алгоритмы и сложность

  • Shunting Yard и стековая интерпретация работают за O(n) по длине выражения (один проход по токенам).
  • Память — O(n) за счёт хранения списка токенов и стека операторов/операндов.

🧪 Демонстрационные артефакты

Логи в

artefacts.md
показывают:

  • Корректные вычисления:
    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-ассистентов и документирование артефактов работы.