Пример #1
0
        // добавляет нули вместо пустой строки в дереве разбора
        private void setZero(BinaryTree tree)
        {
            if (tree.getLeft()  != null)  setZero(tree.getLeft());
            if (tree.getRight() != null) setZero(tree.getRight());

            if (tree.getData().Equals(""))
                tree.setData("0");
        }
Пример #2
0
 // добавление к дереву триг функции
 private void parseTrigFunction(BinaryTree tree, int pos)
 {
     String tmp = tree.getData();
     BinaryTree left = new BinaryTree();
     tree.setData(tmp.Substring(pos, 3)); // триг функцию добавляем в вершину
     left.setData(tmp.Substring(pos + 3)); // а аргумент в левого потомка
     tree.addLeftChild(left);
     parse(tree.getLeft()); // парсим левого потомка
 }
Пример #3
0
 // добавление потомков и последующий парсинг левого и правого потомков
 private void parseNext(BinaryTree tree, String sign, int pos)
 {
     addChilds(tree, sign, pos);
     parse(tree.getLeft());
     parse(tree.getRight());
 }
Пример #4
0
 // поиск мат знака
 private void findMathSign(BinaryTree tree, String sign)
 {
     int pos = 0;
     if (tree != null)
     {
         if (tree.getLeft() == null && tree.getRight() == null)
         {
             if (sign.Equals("-") && CountMinus > 1) // если - и их больше 1
             {
                 pos = tree.getData().LastIndexOf(sign);
                 CountMinus--;
             }
             else
                 pos = tree.getData().IndexOf(sign);
             if (pos != -1 && !isVariable(tree.getData()) && !isDigit(tree.getData()))
                 parseNext(tree, sign, pos);
         }
         else if (tree.getLeft() != null && tree.getRight() != null)
         {
             findMathSign(tree.getLeft(), sign);
             findMathSign(tree.getRight(), sign);
         }
         else
             throw new Exception("Ошибка при построении дерева!");
     }
 }
Пример #5
0
        // подсчет кол-ва переменных в дереве
        private void getCountVariables(BinaryTree tree)
        {
            if (tree.getLeft() != null) getCountVariables(tree.getLeft());
            if (tree.getRight() != null) getCountVariables(tree.getRight());

            if (isVariable(tree.getData()) && !isMathFunction(tree.getData()))
            {
                for (int i = 0; i < var.Count; i++)
                {
                    if (var[i].Equals(tree.getData())) // если такая переменная уже была посчитана
                    {
                        return;
                    }
                }
                var.Add(tree.getData()); // иначе добавляем ее
            }
        }
Пример #6
0
 // вычисление дерева
 private double calculateTree(BinaryTree tree, List<double> args)
 {
     double left = 0, right = 0, res = 0;
     if (tree.getData().Equals("+"))
     {
         left = calculate(tree.getLeft(), args); // считаем левую часть
         right = calculate(tree.getRight(), args); // считаем правую часть
         res = left + right;
     }
     else if (tree.getData().Equals("-"))
     {
         left = calculate(tree.getLeft(), args); // считаем левую часть
         right = calculate(tree.getRight(), args); // считаем правую часть
         res = left - right;
     }
     else if (tree.getData().Equals("*"))
     {
         left = calculate(tree.getLeft(), args); // считаем левую часть
         right = calculate(tree.getRight(), args); // считаем правую часть
         res = left * right;
     }
     else if (tree.getData().Equals("/"))
     {
         left = calculate(tree.getLeft(), args); // считаем левую часть
         right = calculate(tree.getRight(), args); // считаем правую часть
         res = left / right;
     }
     else if (tree.getData().Equals("^"))
     {
         left = calculate(tree.getLeft(), args); // считаем левую часть
         right = calculate(tree.getRight(), args); // считаем правую часть
         res = Math.Pow(left, right);
     }
     else if (tree.getData().Equals("cos"))
     {
         left = calculate(tree.getLeft(), args); // считаем левую часть
         res = Math.Cos(left);
     }
     else if (tree.getData().Equals("sin"))
     {
         left = calculate(tree.getLeft(), args); // считаем левую часть
         res = Math.Sin(left);
     }
     else if (tree.getData().Equals("exp"))
     {
         left = calculate(tree.getLeft(), args); // считаем левую часть
         res = Math.Exp(left);
     }
     else if (tree.getData().Equals("log"))
     {
         left = calculate(tree.getLeft(), args); // считаем левую часть
         res = Math.Log(left);
     }
     return res;
 }