解决一个数学表达式

3
我希望能够评估用户在文本框中输入的数学表达式。到目前为止,我已经完成了这个任务。
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;
 }

当我运行这个程序时,它会出现错误并突出显示"a=double.Parse(finalStringI);",错误提示为"输入字符串的格式不正确"。我使用了一个预定义的表达式"a=i*math.log10(i)-1.2",它可以正常工作,但是当我在文本框中输入相同的内容时却不能正常工作。经过一些搜索,发现可能与运行时编译代码有关。你有什么好的想法吗?我是一个绝对的初学者。谢谢 :)

1
框架中没有任何实用程序可以评估任意表达式字符串,就像您正在尝试的那样。最好实际解析字符串并编写执行评估的逻辑。就目前而言,没有简单的方法可以做到您想要做的事情。 - Jeff Mercado
1
@JeffMercado:说“框架里没有任何东西”总是很危险的,因为很容易出错。而事实上你就犯了这个错误。 - Ben Voigt
4个回答

2
问题出在你的 stringEvaluate StringBuilder 中。当你用 "math.sin" 替换 "sin" 时,stringEvaluate 中的内容仍然是一个字符串。你的想法是正确的,但你得到错误是因为这个事实。 Math.sinMath 类中的一个方法,因此它不能像你在 a = double.Parse(finalStringI); 调用中那样操作。
要实现你的目标需要付出相当大的努力,但我会这样做:
  1. 创建一个类(可能称之为 Expression)。
  2. Expression 类的成员可以包括运算符和操作数的列表,以及一个名为 solution 的 double。
  3. 在实例化时将该字符串传递给该类,并使用 StringBuilder 类进行分解。例如,如果遇到 "sin",则将 Math.sin 添加到运算符集合中(我会使用对象类型)。
  4. 应该将所述字符串中的每个运算符和操作数放置在这两个集合中。
  5. 创建一个方法,根据运算符和操作数集合内的元素进行计算。对于具有超过2个运算符的复杂计算,这可能会变得棘手,因为您必须实现一种 PEMDAS-esque 算法来重新排序集合以遵守运算顺序(从而获得正确的解决方案)。
希望这有所帮助 :)

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度的正确余弦值)。

0

.Parse 方法(如 Int.Parsedouble.Parse 等)仅接受字符串,例如 "25" 或 "3.141",并将其转换为相应的值类型(int 25 或 double 3.141)。它们不会评估数学表达式!

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

这两个主题都无法在 StackOverflow 回答的问答格式中涵盖。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接