我有一个只包含一行的文本文件,该行只包含一个数学表达式 例如12+(3.0 *(4)-1)/ sqrt(121)
我的程序需要将此express表示为字符串,然后给出结果
13
有没有简单的方法或第三方dll / lib来解决这个问题?
评论已添加:
Evaluating a string of simple mathematical expressions
这里是解决方案,但许多解决方案只包含+ - / *,我需要尽可能多的运算符,例如天花板方形平方根和幂()
所以这个链接可能是最好的解决方案
http://www.codeproject.com/KB/recipes/sota_expression_evaluator.aspx
答案 0 :(得分:13)
使用ExprTk库可以轻松获得以下简单解决方案:
#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 :(得分:1)
.NET解决方案:
这里有关于SO的几个主题:
我已经使用过的两个项目:
C#:NCalc - Mathematical Expressions Evaluator for .NET
NCalc是.NET中的数学表达式计算器。 NCalc可以解析任何表达式并评估结果,包括静态或动态参数和自定义函数。
VB.NET:Fast Lightweight Expression Evaluator
Flee是.NET框架的表达式解析器和评估器。它允许您在运行时计算字符串表达式的值,例如sqrt(a ^ 2 + b ^ 2)。它使用自定义编译器,强类型表达式语言和轻量级codegen将表达式直接编译为IL。这意味着表达式评估非常快速有效。试试demo,它可以让你根据表情生成图像,并亲自看看。
您可以将它与C#一起使用,因为它无论如何都是.NET(通过程序集引用)。
答案 2 :(得分:1)
对于C等人来说,这是一个需要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;
}
答案 3 :(得分:1)
在 UNIX编程环境中,我认为是,开发了一个名为hoc
(IIRC)的简单计算器。可能它的源代码几乎可以在任何地方使用。
干杯&amp;第h。,
答案 4 :(得分:1)
我考虑嵌入lua。它快速,轻便且安全。它专为嵌入而设计。被许多游戏用作他们的脚本语言。 (IMO比python或perl更容易嵌入)
这是一个完整的示例,以显示它是多么微不足道
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);
}
答案 5 :(得分:1)
如果您想要勇敢地使用源代码,可以随时查看bc
。它可以为您处理所有Lex / Yacc的优点。如果您需要纯C ++解决方案,可以尝试使用Boost Spirit进行编码。
答案 6 :(得分:1)
对于c ++,请试用muParser: