2016-06-16 7 views
-1

Ich verwende Dijkstra's Two-stack Calculator mit Unity Engine. Ich bekomme einen mathematischen Fehler.Rechner Mathematischer Fehler

Input: "3 + 2", Output:

BUT

Input: "30 + 20", Output:

Was falsch mit diesem Code?

CODE

using System.Collections.Generic; 
public class Calculator 
{ 
    public float Evaluate(string Input) 
    { 
     string Expression = "(" + Input + ")"; 
     Stack<string> ops = new Stack<string>(); 
     Stack<float> vals = new Stack<float>(); 
     for (int i = 0; i < Expression.Length; i++) 
     { 
      string s = Expression.Substring(i, 1); 
      if (s.Equals("(")) { } 
      else if (s.Equals("+")) ops.Push(s); 
      else if (s.Equals("-")) ops.Push(s); 
      else if (s.Equals("*")) ops.Push(s); 
      else if (s.Equals("/")) ops.Push(s); 
      else if (s.Equals(")")) 
      { 
       int count = ops.Count; 
       while (count > 0) 
       { 
        string op = ops.Pop(); 
        float v = vals.Pop(); 
        if (op.Equals("+")) v = vals.Pop() + v; 
        else if (op.Equals("-")) v = vals.Pop() - v; 
        else if (op.Equals("*")) v = vals.Pop() * v; 
        else if (op.Equals("/")) v = vals.Pop()/v; 
        vals.Push(v); 
        count--; 
       } 
      } 
      else vals.Push(float.Parse(s)); 
     } 
     return vals.Pop(); 
    } 
} 
+1

Haben Sie es debuggt? Auf einen Blick werden Werte mit zwei Ziffern nicht berücksichtigt. Es wird '2 + 0' ausgewertet. '3' und' 0' sind nur noch auf dem Stapel und werden nie untersucht – Rob

Antwort

3
else vals.Push(float.Parse(s)); 

nur diese Zeile zu einem Zeitpunkt einstelligen Bereich hält.

Run durch den Code: input = (30 + 20)

i = 0
(
vals Stack:
ops Stack:

i = 1
vals Stapel: 3
ops Stapel:

i = 2
vals Stack: 0, 3
ops Stack:

i = 3
+
vals Stack: 0, 3
ops Stack: +

i = 4
Vals Stapel: 2, 0, 3
ops Stapel: +

i = 5
vals Stack: 0, 2, 0, 3
ops Stack: +

i = 6
)
vals Stack: 0, 2, 0, 3
ops stapeln: +

Wenn Sie fertig sind, knallen Sie die 0 und 2 und fügen Sie Ihre endgültige Antwort zu erhalten: 2