示例#1
0
        }//End of Operand class


        //Actual tree construction from the expression
        private OperandClass BuildTreeOperand()
        {
            OperandClass tree = null;

            string expression = AnsBox.Text;

            if (!char.IsNumber(expression.Last()))
            {
                expression = expression.Substring(0, expression.Length - 1);
            }

            string numberStr = string.Empty;

            foreach (char c in expression.ToCharArray())
            {
                if (char.IsNumber(c) || c == '.' || numberStr == string.Empty && c == '-')
                {
                    numberStr += c;
                }
                else
                {
                    AddOperandToTree(ref tree, new OperandClass()
                    {
                        value = double.Parse(numberStr)
                    });
                    numberStr = string.Empty;

                    Operands op = Operands.MINUS; //Set default case

                    switch (c)
                    {
                    case '-': op = Operands.MINUS; break;

                    case '+': op = Operands.PLUS; break;

                    case '/': op = Operands.DIV; break;

                    case 'x': op = Operands.TIMES; break;
                    }
                    AddOperandToTree(ref tree, new OperandClass()
                    {
                        opp = op
                    });
                }
            }

            //Last number
            AddOperandToTree(ref tree, new OperandClass {
                value = double.Parse(numberStr)
            });
            return(tree);
        }
示例#2
0
        //Display results
        private void Eqbtn_Click(object sender, RoutedEventArgs e)
        {
            //Qualify input

            if (string.IsNullOrEmpty(AnsBox.Text))
            {
                return;
            }

            OperandClass tree = BuildTreeOperand();

            double value = CalcTree(tree);

            AnsBox.Text = value.ToString();
        }
示例#3
0
 private void AddOperandToTree(ref OperandClass tree, OperandClass elem)
 {
     if (tree == null)
     {
         tree = elem;
     }
     else
     {
         if (elem.opp < tree.opp)
         {
             OperandClass auxTree = tree;
             tree      = elem;
             elem.left = auxTree;
         }
         else
         {
             AddOperandToTree(ref tree.right, elem);// recursion used to loop through operands
         }
     }
 }
示例#4
0
        private double CalcTree(OperandClass tree)
        {
            if (tree.left == null && tree.right == null)
            {
                return(tree.value);
            }
            else //its an operation
            {
                double subResult = 0;
                switch (tree.opp)
                {
                case Operands.MINUS: subResult = CalcTree(tree.left) - CalcTree(tree.right); break;

                case Operands.PLUS: subResult = CalcTree(tree.left) + CalcTree(tree.right); break;

                case Operands.DIV: subResult = CalcTree(tree.left) / CalcTree(tree.right); break;

                case Operands.TIMES: subResult = CalcTree(tree.left) * CalcTree(tree.right); break;
                }

                return(subResult);
            }
        }