0
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 です。ありがとうございました。

4

1 に答える 1

1

それを行う最善の方法は、自分でそれをしないことです:)、このリンクの下に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);
}

より複雑な計算もサポートされており、構文は私が提供したリンクで定義されています。

于 2013-06-24T10:37:01.997 に答える