我是C#的初学者。我在将字符串转换为数学表达式时遇到问题。我有一个UI,用户可以使用随机公式字段创建公式。在另一个UI中,用户将提供这些公式字段的输入。
例如,首次公式可能为(a+b)^n
而另一公式可能为((a+b+c)^n+b)
。
在我的计算用户界面中,用户首次为a,b,n输入输入,对于第二个公式,用户将为a,b,c,n输入。任何人都可以帮助我如何获得这两个方案的程序性结果?提前致谢
答案 0 :(得分:1)
我认为这是解决方案
Expression e = new Expression("((a+b+c)^n+b)");
e.Evaluate();
答案 1 :(得分:1)
这是应该做的:
string formula = "type your formula here"; //or get it from DB
StringToFormula stf = new StringToFormula();
double result = stf.Eval(formula);
像这样调用类和方法:
Directory.GetCurrentDirectory();
答案 2 :(得分:0)
有很多公式评估方法,
take a look.只需接受您的输入,将字符串中的a
,b
,n
字符替换为用户提供的值,并使用上述方法之一解析方程式。
答案 3 :(得分:0)
string input= "(12 + 4 * 6) * ((2 + 3 * ( 4 + 2 ) ) ( 5 + 12 ))";
string str4 = "(" + input`enter code here`.Replace(" ", "") + ")";
str4 = str4.Replace(")(", ")*(");
while (str4.Contains('('))
{
string sub1 = str4.Substring(str4.LastIndexOf("(") + 1);
string sub = sub1.Substring(0, sub1.IndexOf(")"));
string sub2 = sub;
string str21 = sub2.Replace("^", "~^~").Replace("/", "~/~").Replace("*", "~*~").Replace("+", "~+~").Replace("-", "~-~");
List<string> str31 = str21.Split('~').ToList();
while (str31.Count > 1)
{
while (str31.Contains("*"))
{
for (int i = 0; i < str31.Count; i++)
{
if (str31[i] == "*")
{
val = Convert.ToDouble(str31[i - 1]) * Convert.ToDouble(str31[i + 1]);
str31.RemoveRange(i - 1, 3);
str31.Insert(i - 1, val.ToString());
}
}
}
while (str31.Contains("/"))
{
for (int i = 0; i < str31.Count; i++)
{
if (str31[i] == "/")
{
val = Convert.ToDouble(str31[i - 1]) / Convert.ToDouble(str31[i + 1]);
str31.RemoveRange(i - 1, 3);
str31.Insert(i - 1, val.ToString());
}
}
}
while (str31.Contains("+"))
{
for (int i = 0; i < str31.Count; i++)
{
if (str31[i] == "+")
{
val = Convert.ToDouble(str31[i - 1]) + Convert.ToDouble(str31[i + 1]);
str31.RemoveRange(i - 1, 3);
str31.Insert(i - 1, val.ToString());
}
}
}
while (str31.Contains("-"))
{
for (int i = 0; i < str31.Count; i++)
{
if (str31[i] == "-")
{
val = Convert.ToDouble(str31[i - 1]) - Convert.ToDouble(str31[i + 1]);
str31.RemoveRange(i - 1, 3);
str31.Insert(i - 1, val.ToString());
}
}
}
}
str4 = str4.Replace("(" + sub + ")", str31[0].ToString());
}
string sum = str4;
答案 4 :(得分:0)
我想到的最结构化的方法是定义一个由运算符符号组成的语法(在你的例子中显然是+, - ,*,/和^)和操作数;那么,如果存在定义语法中的输入的派生,则派生基本上是表达式树,然后可以在操作符被直接转换为实际操作时递归遍历该表达式树。我承认描述有点模糊,但好的解析可能有点困难。或许看一下LL parser可能有所帮助。