Skip to content

Калькулятор сложных выражений

Notifications You must be signed in to change notification settings

shustrov38/Advanced-Calculator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Advanced-Calculator

Калькулятор, обрабатывабщий сложные математические выражения, с возможностью определения переменных.

Формат входных данных

  • На вход подается одно или несколько выражений.
  • Выражения могут содержать переменные.
  • Строки могут содержать коментарии, отмеченные #, пробелы, табуляции или быть пустыми.
  • Числа могут быть комплексными.
  • Имена переменных состоят из букв, цифр и знака _.
# пример входного файла 
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). На основе уже составленной польской записи, производится постоение дерева операций с поседующим вычислением результатов.

Особенности программы и обрабатываемые исключения

  1. Парсер

    • Игнорирует пробелы, табуляции, пустые строки и комментарии
    • Обрабатывает следующий список исключений:
      # 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
      
  2. Сортировка выражений

    • Сортирует выражения по количеству зависимостей в определении
    • Путем построения графа, производит подсчет зависимосей для каждой перемменной, одновременно проверяя граф на ацикличность
    • Обрабатывает следующий список исключений:
      # отсутсвует переменная (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
      
  3. Обратная польская нотация (RPN)

    • Обрабатывает левосторонние и правосторонние операции, функции
      # левосторонние 
      -5 - 6 - 9 = (((-5) - 6) - 9) # но не (-5 - (6 - 9)) 
      
      # правосторонние
      a ^ b ^ c ^ d = (a ^ (b ^ (c ^ d))) # но не (((a ^ b) ^ c) ^ d)
      
  4. Дерево операций

    • Ничего особенного 👽
  5. Математические операции

    • Программа обрабатывает все исключения, связанные с областями определения функций и операций
    • Типы операндов описаны в списке поддерживаемых конструкций

Тестрование

Калькулятор при отсутсвии аргументов командной строки используе в качестве входного файла 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 - - -