解决数学表达式

时间:2011-10-05 04:53:02

标签: c# math

我想评估用户在文本框中输入的数学表达式。到目前为止我已经这样做了

string equation, finalString;
equation = textBox1.Text;
StringBuilder stringEvaluate = new StringBuilder(equation);
stringEvaluate.Replace("sin", "math.sin");
stringEvaluate.Replace("cos", "math.cos");
stringEvaluate.Replace("tan", "math.tan");
stringEvaluate.Replace("log", "math.log10");
stringEvaluate.Replace("e^", "math.exp");
finalString = stringEvaluate.ToString();
StringBuilder replaceI = new StringBuilder(finalString);
replaceI.Replace("x", "i");

double a;
for (int i = 0; i<5 ; i++)
 {
  a = double.Parse(finalStringI);
  if(a<0)
    break;
 }

当我运行此程序时,它会出现错误"Input string was not in a correct format."并突出显示a=double.Parse(finalStringI);

我使用了预先定义的表达式a = i * math.log10(i)-1.2并且它可以工作,但是当我在文本框中输入相同的东西时它没有。 我做了一些搜索,它提出了与在运行时编译代码有关的事情。

任何想法如何做到这一点? 我是一个绝对的初学者。 谢谢:))

4 个答案:

答案 0 :(得分:2)

问题出在您的stringEvaluate StringBuilder中。当你用“math.sin”替换“sin”时,stringEvaluate中的内容仍然是一个字符串。你有正确的想法,但你得到的错误是因为这个事实。

Math.sinMath类中的一种方法,因此无法像a = double.Parse(finalStringI);调用那样对其进行操作。

实现目标将是一项相当大的任务,但我会这样做:

  1. 创建一个类(也许称之为Expression)。
  2. Expression类的成员可以包含运算符和操作数的列表,也可以包含一个名为solution的双精度。
  3. 在实例化时将此类传递给该类,并使用StringBuilder类将其拆分。例如,如果遇到“罪”,请将Math.sin添加到运算符集合(我将使用类型对象)。
  4. 所述字符串中的每个运算符和操作数都应放在两个集合中。
  5. 创建一个方法,相应地评估运算符和操作数集合中的元素。对于具有2个以上运算符的复杂计算,这可能会变得很棘手,因为您必须实现PEMDAS-esque算法来重新排序集合以遵守操作顺序(从而实现正确的解决方案)。
  6. 希望这会有所帮助:)

答案 1 :(得分:0)

.Parse方法(Int.Parsedouble.Parse等) 取一个字符串,例如“25”或“3.141”并将其转换为匹配值类型(int 25或double 3.141)。他们不会评估数学表达式!

你几乎必须编写自己的文本解析器和解析树评估器,或者探索运行时代码生成或MSIL代码发射。

在StackOverflow答案的Q&amp; A格式中,这两个主题都无法涵盖。

答案 2 :(得分:0)

看一下这篇博文:

http://www.c-sharpcorner.com/UploadFile/mgold/CodeDomCalculator08082005003253AM/CodeDomCalculator.aspx

听起来它几乎与你想做的事情有关。评估数学表达式并不像解析double那样简单(它实际上只适用于像“1.234”这样的字符串,而不是“1 + 2.34”),但显然它是可能的。

答案 3 :(得分:0)

您可以使用框架包含的eval函数来实现JScript.NET代码。

更多详情:http://odetocode.com/code/80.aspx

或者,如果你不害怕使用标记为“已弃用”的类,那很简单:

static string EvalExpression(string s)
{
    return Microsoft.JScript.Eval.JScriptEvaluate(s, null, Microsoft.JScript.Vsa.VsaEngine.CreateEngine()).ToString();
}

例如,输入"Math.cos(Math.PI / 3)",结果为"0.5"(正确的余弦为60度)