Калькулятор, обрабатывабщий сложные математические выражения, с возможностью определения переменных.
- На вход подается одно или несколько выражений.
- Выражения могут содержать переменные.
- Строки могут содержать коментарии, отмеченные
#
, пробелы, табуляции или быть пустыми. - Числа могут быть комплексными.
- Имена переменных состоят из букв, цифр и знака
_
.
# пример входного файла
exp(-j*PI*alpha*len/v0) # финальное выражение
alpha = sqrt(PI*len/(s1+s2))
s1 = cos(real(S11)*real(S22)) # промежуточный результат
s2 = (sin(imag(S11*S22)))^2
# ------ блок переменных ------
len = 191.76
v0 = 299.799 # скорость
S11 = -0.01-0.92j
S22 = 0.0001+0.997j
# S22 = 0.0002+0.995j
Кальлулятор выводит в консоль значения всех переменных, перечисленных в программе (переменная с отсутствующим значением
определяется как 0
). После переменных осуществляется вывод всех ариметических выражений не содержащих имён в своем
определении. Ниже представлена выходная информация после работы с данными выше.
v0 = 299.799000
len = 191.760000
s11 = -0.010000 - 0.920000i
s22 = 0.000100 + 0.997000i
s1 = 1
s2 = 0.000101
alpha = 24.543244
exp(-j*PI*alpha*len/v0) = 0.584118 + 0.811669i
Программа получает из входного файла значения переменных и выражений, разделяет на смысловые конструкции, очищает от мусора. После, программа сортирует выражения в порядке возрастания количества зависимых переменных. Затем производится постороение обратной польской нотации (RPN). На основе уже составленной польской записи, производится постоение дерева операций с поседующим вычислением результатов.
-
Парсер
- Игнорирует пробелы, табуляции, пустые строки и комментарии
- Обрабатывает следующий список исключений:
# FILE PROBLEM: Can't open input file. # BAD EXPRESSION NOTATION - ошибки формата ввода a = () # empty brackets b = (4 + 5 # wrong bracket sequence c = 5 + (,) # wrong place for ',' d = 5+^6 # operator '+' must have two correct operands # BAD NUMBER - ошибки формата чисел 012.1312 # wrong number input 12.321.3 # wrong float value notation 123?2133 # wrong symbol '?' 234j8234 # wrong complex value notation # BAD VAR NAME - ошибки формата имен переменных a>b # explicit char in variable name 6ab # explicit char in variable name _bc # explicit char in variable name # FUNCTION ERROR - ошибки математических функций zhma(54) # unknown function: 'zhma()' sin(a, b, c) # function 'sin()' required one argument but more given max(a,) # function 'max()' required two arguments
-
Сортировка выражений
- Сортирует выражения по количеству зависимостей в определении
- Путем построения графа, производит подсчет зависимосей для каждой перемменной, одновременно проверяя граф на ацикличность
- Обрабатывает следующий список исключений:
# отсутсвует переменная (k) a = sqrt(k) # Have an unrecognized variable 'k' in definition of 'a' # рекурсивное определение a = b + 6 b = log(c) c = a ^ 6 # Have cycle in variable definition: ['a' -> 'b' -> 'c' -> 'a'] # пример сортировки выражений # входной файл: d = b a = pi b = a + 9 + c c = e + -9 # после сортировки: a = pi c = e + -9 b = a + 9 + c d = b
-
Обратная польская нотация (RPN)
- Обрабатывает левосторонние и правосторонние операции, функции
# левосторонние -5 - 6 - 9 = (((-5) - 6) - 9) # но не (-5 - (6 - 9)) # правосторонние a ^ b ^ c ^ d = (a ^ (b ^ (c ^ d))) # но не (((a ^ b) ^ c) ^ d)
- Обрабатывает левосторонние и правосторонние операции, функции
-
Дерево операций
- Ничего особенного 👽
-
Математические операции
- Программа обрабатывает все исключения, связанные с областями определения функций и операций
- Типы операндов описаны в списке поддерживаемых конструкций
Калькулятор при отсутсвии аргументов командной строки используе в качестве входного файла input.txt
. В противном
случае открывается переданный файл. Поэтому выбрана система ctest
. (см. CmakeLists.txt
)
Конструкция | Имя | оп-ды | int | double | complex |
---|---|---|---|---|---|
- |
унарный минус | 1 | + | + | + |
~ |
побитовое отрицание | 1 | + | - | - |
~ |
комплексное сопряженное | 1 | - | - | + |
! |
факториал | 1 | + | - | - |
+ |
сложение | 2 | + | + | + |
- |
вычитание | 2 | + | + | + |
* |
умножение | 2 | + | + | + |
/ |
деление | 2 | + | + | + |
% |
остаток от деления | 2 | + | - | - |
^ |
возведение в степень | 2 | + | + | - |
& |
побитовое И | 2 | + | - | - |
| |
побитовое ИЛИ | 2 | + | - | - |
@ |
симметрическая разность | 2 | + | - | - |
sin() |
синус | 1 | + | + | + |
cos() |
косинус | 1 | + | + | + |
tg() |
тангенс | 1 | + | + | + |
ctg() |
котангенс | 1 | + | + | + |
radians() |
перевод градусов в радианы | 1 | + | + | - |
floor() |
округление числа "вниз" | 1 | + | + | - |
ceil() |
округление числа "вверх" | 1 | + | + | - |
ln() |
натуральный логарифм | 1 | + | + | + |
log() |
десятичный логарифм | 1 | + | + | + |
sqrt() |
квадратный корень | 1 | + | + | + |
abs() |
модуль числа | 1 | + | + | + |
exp() |
экспонента | 1 | + | + | + |
real() |
действительная часть числа | 1 | + | + | + |
imag() |
комплексная часть числа | 1 | + | + | + |
mag() |
модуль комплексного числа | 1 | + | + | + |
phase() |
аргумент комплексного числа | 1 | + | + | + |
pow() |
возведение в степень | 2 | + | + | + |
min() |
минимум | 2 | + | + | - |
max() |
максимум | 2 | + | + | - |
rand() |
случайное число из отрезка | 2 | + | - | - |
pi |
число Пи | 0 | - | - | - |
e |
число Эйлера | 0 | - | - | - |
j |
мнимая единица | 0 | - | - | - |