如何使用 C# 基于 Web 表单的优先级计算表达式
本文关键字:优先级 计算 表达式 表单 Web 何使用 基于 | 更新日期: 2023-09-27 18:19:35
string expr = Text1.Text;
string[] num = Regex.Split(expr, @"'(|')|'-|'+|'*|'/").Where(s => !String.IsNullOrEmpty(s)).ToArray(); // get Array for numbers
string[] op = Regex.Split(expr, @"'(|')|'d{1,3}").Where(s => !String.IsNullOrEmpty(s)).ToArray(); // get Array for mathematical operators +,-,/,*
int firstVal = 0;
int numCtr = 0;
int lastVal = 0;
string lastOp = "";
int num2Cntr = 0;
foreach (string n in num)
{
numCtr++;
if (numCtr == 1)
{
lastVal = int.Parse(n);
}
else
{
if (!String.IsNullOrEmpty(lastOp))
{
switch (lastOp)
{
case "+":
lastVal = lastVal + int.Parse(n) ;
break;
case "-":
lastVal = lastVal - int.Parse(n);
break;
case "*":
lastVal = lastVal * int.Parse(n);
break;
case "/":
lastVal = lastVal / int.Parse(n);
break;
case "(":
numCtr++;
foreach (string a in num)
{
num2Cntr++;
if (num2Cntr == 1)
{
firstVal = int.Parse(a);
}
else
{
if (!String.IsNullOrEmpty(lastOp))
{
switch (lastOp)
{
case "+": firstVal = firstVal + int.Parse(a);
break;
case "-":
firstVal = firstVal - int.Parse(a);
break;
case "*":
firstVal = firstVal * int.Parse(a);
break;
case "/":
firstVal = firstVal / int.Parse(a);
break;
}
}
}
}
break;
case ")":
lastVal = lastVal + firstVal;
return;
}
}
}
int opCtr = 0;
foreach (string o in op)
{
opCtr++;
if (opCtr == numCtr)
{
lastOp = o;
break;
}
}
}
Text2.Text = lastVal.ToString();
1(如何将括号的优先级设置得很高?2(我正在尝试设置优先级,因为输入的表达式的计算结果应该像二叉树一样。首先,括号的优先级必须很高,然后是运算符的优先级。3(我上面的代码工作正常,从左到右计算表达式。 即 5+6+7=18 但是如果我给出 5+(5+5(+(5*2(,我得到的结果是 40。但确切的结果是 25。 有什么可以帮助我。 谢谢。
最好的方法是不要自己做:),有一个简单的方法使用DataTable进行表达式计算 在此链接下,您可以找到示例。
或者在这个例子中:
[TestMethod]
public void test()
{
var evalTable = new DataTable();
using (var evalExpressionColumn = new DataColumn("EvaluateExpression", typeof(double), "0"))
{
evalTable.Columns.Add(evalExpressionColumn);
}
evalTable.Rows.Add(0);
evalTable.Columns[0].Expression = "(5 + 4 ) * 8";
//Note: Evaluate expression.
var res = Convert.ToDouble(evalTable.Rows[0]["EvaluateExpression"]);
Assert.AreEqual(72, res);
}
还支持更复杂的计算,语法在我提供的链接中定义。