Калькулятор для вычисления математических выражений. Поддерживает 6 операций и скобки.
Вычисление математического выражения проходит в три этапа.
Для парсинга реализован класс expression.Expression
, который принимает строку с математическим выражением и разбивает её на последовательность токенов. Токенами являются числа, операторы, скобки, служебные символы. В процессе преобразования происходит валидация выражения.
Валидация гарантирует:
- выходное значение состоит только из допустимых токенов;
- токены числа не имеют более 1 точки;
- первым или последним токеном не может быть оператор;
- два оператора не могут быть рядом.
После парсинга и валидации хранит последовательность токенов в одном из своих полей.
Преобразование реализовано в классе calculator.PostfixTranslator
. В преобразовании учавствует стек для хранения операторов. Преобразование происходит на основе управляющей таблицы (табл.№1). Верхняя строчка таблицы - читаемый символ последовательности. Левый столбец - токен на вершине стека операторов. Значение таблицы - номера выполняемых функций.
- $ - читаемый символ
- S - стек
- # - конец строки
- % - деление по модулю
- ^ - возведение в степень
Управляющая таблица (таблица №1):
# | ( | + | - | * | / | ) | ^ | % | |
---|---|---|---|---|---|---|---|---|---|
# | 6 | 1 | 1 | 1 | 1 | 1 | 5 | 1 | 1 |
( | 5 | 1 | 1 | 1 | 1 | 1 | 3 | 1 | 1 |
+ | 4 | 1 | 2 | 2 | 1 | 1 | 4 | 1 | 1 |
- | 4 | 1 | 2 | 2 | 1 | 1 | 4 | 1 | 1 |
* | 4 | 1 | 4 | 4 | 2 | 2 | 4 | 1 | 2 |
/ | 4 | 1 | 4 | 4 | 2 | 2 | 4 | 1 | 2 |
^ | 4 | 1 | 4 | 4 | 4 | 4 | 4 | 1 | 4 |
% | 4 | 1 | 4 | 4 | 2 | 2 | 4 | 1 | 2 |
Функции:
- Заслать $ в стек S и читать следующий токен.
- Выдать команду, заслать $ в стек S и читать следующий токен.
- Читать из S и читать следующий токен (для удаления скобок).
- Выдать команду и читать тот же токен.
- Закончить с ошибкой.
- Успешно закончить.
Каждая пункт соответствует функции calculator.PostfixTranslator.oper[n] (func)
.
После преобразования, результат сохраняется в одном из полей класса.
Вычисление реализовано в классе calculator.Calculator
, который наследуется от calculator.PostfixTranslator
. Для вычислений используется стек и постфиксная последовательность из родителя. После вычисления результат хранится в одном из полей класса Calculator
.
Больше о постфиксной нотации и вычислениях:
Интерфейс реализован при помощи графического инструмента PyQt5-Designer.
- Клонировать или скачать репозиторий.
- Создать виртуальное окружение и установить зависимости из
requirements.txt
. - Выполнить файл
main.py
.
Для Linux: https://mega.nz/file/CZ4GBaaJ#Tie4eZYn8UnK7On3a6xdT81ai2bfVNdsCkMxqC5HCBk