Простая библиотека или реализация для математического выражения выражения - PullRequest
15 голосов
/ 23 октября 2010

у меня есть один текстовый файл, который содержит только одну строку, строка содержит только одно математическое выражение, например, 12+ (3.0 * (4) -1) / sqrt (121)

моей программе необходимо прочитать этовыразить в виде строки, а затем дать результат
13

Есть ли какой-нибудь простой способ или DLL / lib стороннего производителя, чтобы сделать это?

КОММЕНТАРИЙ ДОБАВЛЕН:

Оценка строки простых математических выражений

вот решение, но многие решения содержат только + - / * на самом деле, мне нужно как можно больше операторов, таких как потолочный квадратный квадратный корень иpower ()

, так что эта ссылка, возможно, является лучшим решением
http://www.codeproject.com/KB/recipes/sota_expression_evaluator.aspx

Ответы [ 7 ]

13 голосов
/ 29 сентября 2015

Используя библиотеку ExprTk , можно легко получить следующее решение simple :

#include <cstdio>
#include <string>

#include "exprtk.hpp"

int main()
{
   typedef exprtk::expression<double> expression_t;
   typedef exprtk::parser<double>         parser_t;

   std::string expression_string = "12 + (3.0 * (4) - 1) / sqrt(121)";

   expression_t expression;

   parser_t parser;

   if (parser.compile(expression_string,expression))
   {
     double result = expression.value();

     printf("Result: %19.15\n",result);
   }
   else
     printf("Error in expression\n.");

   return 0;
}
1 голос
/ 23 октября 2010
1 голос
/ 23 октября 2010

Если вы хотите отважиться на исходный код, вы всегда можете посмотреть на bc.Он обрабатывает все благости Lex / Yacc для вас.И если вам нужно чистое решение C ++, вы можете попробовать написать код в Boost Spirit .

1 голос
/ 23 октября 2010

Я бы рассмотрел встраивание lua . Он быстрый, легкий и компактный. Он был специально разработан для встраивания. Используется многими играми в качестве языка сценариев. (IMO гораздо проще встраивать, чем python или perl)

Вот пример complete , чтобы показать, насколько это просто

extern "C"
{
  #include "lua.h"
  #include "lauxlib.h"
  #include "lualib.h"
}

#include <string>
#include <iostream>

int main()
{
   std::string expression = "12+(3.0*(4)-1)/math.sqrt(121)";
   lua_State * L = lua_open();
   luaopen_math(L);
   if( luaL_dostring(L, ("return "+expression).c_str()) != 0 )
   {
      std::cout<<"ERROR : "<<lua_tostring(L,-1)<<std::endl;
   }
   if( lua_type(L,-1) == LUA_TNUMBER )
   {
      std::cout<<"GOT "<<lua_tonumber(L,-1)<<std::endl;
   }
   lua_close(L);
}
1 голос
/ 23 октября 2010

In Среда программирования UNIX , я думаю, это был простой калькулятор под названием hoc (IIRC). Возможно, его исходный код доступен где угодно.

Приветствия & hth.,

1 голос
/ 23 октября 2010

Для C et al, вот быстрый и грязный чит, который требует Perl:

double eval(const char* expr) {
    char buf[1024];
    snprintf(buf, sizeof(buf), "perl -e 'print (%s)'", expr);
    FILE* p = popen(buf, "r");
    double d;
    fscanf(p, "%lf", &d);
    fclose(p);
    return d;
}
1 голос
/ 23 октября 2010

.NET решений:

Вот пара тем по SO:


Также два проекта, которые я уже использовал перед:

C #: NCalc - Оценщик математических выражений для .NET

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


VB.NET: Быстрый легкий анализатор выражений

Flee - это анализатор и оценщик выражений для .NET framework. Это позволяет вам вычислить значение строковых выражений, таких как sqrt (a ^ 2 + b ^ 2) во время выполнения. Он использует собственный компилятор, язык выражений со строгой типизацией и легкий кодовый код для компиляции выражений непосредственно в IL. Это означает, что оценка выражения является чрезвычайно быстрой и эффективной. Попробуйте демоверсию , которая позволяет создавать изображения на основе выражений, и убедитесь сами.

Вы можете использовать его с C #, так как это .NET в любом случае (через ссылку на сборку).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...