Сведения о вопросе

Htmlщик

13:54, 22nd August, 2020

Теги

c++    

вычисление пользовательских формул (с c++)

Просмотров: 435   Ответов: 8

Мы хотели бы иметь пользовательские формулы в нашей программе c++. например, значение v = x + (y - (z-2)) / 2 . Позже в программе пользователь определит x, y и z - > программа должна вернуть результат вычисления.
Через некоторое время формула может быть изменена, поэтому в следующий раз программа должна проанализировать формулу и добавить новые значения.

Любые идеи / подсказки, как сделать что-то подобное ?

До сих пор я просто пришел к решению написать парсер для вычисления этих формул - может быть, какие-то идеи об этом ?



  Сведения об ответе

9090

00:34, 10th August, 2020

Если он будет использоваться часто и если он будет расширен в будущем, я бы почти рекомендовал добавить в ваш код либо python, либо LUA. LUA - это очень легкий язык сценариев, который вы можете подключить и предоставить новые функции, операторы и т. д. Если вы хотите делать более надежные и сложные вещи, используйте вместо этого Python.


  Сведения об ответе

P_S_S

14:47, 27th August, 2020

Вы можете представить свою формулу в виде дерева операций и вложенных выражений. Вы можете определить типы или константы для типов операций и переменных.

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


  Сведения об ответе

nYU

02:40, 8th August, 2020

Создание собственного парсера для этого должно быть простой операцией:

) преобразование уравнения из инфикса в постфиксную нотацию (типичное назначение compsci) (я бы использовал стек) ) подождите, чтобы получить нужные вам значения ) поп стек элементов инфикса, сбрасывая значение для переменной в случае необходимости ) отображаемые результаты


  Сведения об ответе

SKY

12:22, 15th August, 2020

Использование Spirit (например) для синтаксического анализа (и 'semantic actions', который он предоставляет для построения дерева выражений, которым вы можете затем манипулировать, например, оценивать) кажется довольно простым решением. Вы можете найти grammar для арифметических выражений там , например, если это необходимо... (это довольно просто придумать самостоятельно).

Примечание: дух очень прост в освоении и вполне приспособлен для таких задач.


  Сведения об ответе

prince

03:04, 25th August, 2020

Как правило, есть два способа сделать это, с тремя возможными реализациями:

  1. как вы уже коснулись себя, библиотека для оценки формул
  2. компиляция формулы в код

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

Для C++ я бы предположил, что библиотека для оценки, вероятно, где-то существует, поэтому я бы начал именно с этого.


  Сведения об ответе

park

13:50, 9th August, 2020

Если вы хотите написать свой собственный, найдите "formal automata" и / или "finite state machine grammar"

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


  Сведения об ответе

SILA

12:04, 12th August, 2020

Чтобы сделать вашу жизнь проще, я думаю, что получение такого рода ввода лучше всего делать через GUI, где пользователи ограничены в том, что они могут вводить.

Если вы планируете делать это из командной строки (именно такое впечатление я получаю от вашего поста), то вам, вероятно, следует определить строгий набор допустимых входных данных (например, только однобуквенные переменные, no whitespace и только определенные математические символы: ()+-*/ и т. д.).

Тогда вам нужно будет::
Чтение в массиве входных символов
Проанализируйте его, чтобы построить список переменных и действий
Выполните эти действия - в порядке BOMDAS


  Сведения об ответе

darknet

04:45, 24th August, 2020

С помощью ANTLR вы можете создать синтаксический анализатор / компилятор, который будет интерпретировать пользовательский ввод, а затем выполнять вычисления с использованием шаблона посетителя. Хороший пример здесь, но именно в C#. вы должны быть в состоянии быстро адаптировать его к вашим потребностям и по-прежнему использовать C++ в качестве платформы разработки.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться