コード例 #1
0
        private void F(string partOfString)
        {
            if (String.IsNullOrWhiteSpace(partOfString))
            {
                throw new EmptyMemberException();
            }

            try
            {
                switch (partOfString[0])
                {
                case '[': Value = "["; Type = NodeType.Sin; Left = new ElementOfTree(); Left.S(partOfString.Substring(2, partOfString.Length - 3)); return;

                case ']': Value = "]"; Type = NodeType.Cos; Left = new ElementOfTree(); Left.S(partOfString.Substring(2, partOfString.Length - 3)); return;

                case '!': Value = "!"; Type = NodeType.Tan; Left = new ElementOfTree(); Left.S(partOfString.Substring(2, partOfString.Length - 3)); return;

                case '?': Value = "?"; Type = NodeType.Ln; Left = new ElementOfTree(); Left.S(partOfString.Substring(2, partOfString.Length - 3)); return;

                case '#': Value = "#"; Type = NodeType.Exp; Left = new ElementOfTree(); Left.S(partOfString.Substring(2, partOfString.Length - 3)); return;

                case '%': Value = "%"; Type = NodeType.Sqrt; Left = new ElementOfTree(); Left.S(partOfString.Substring(2, partOfString.Length - 3)); return;

                default: throw new IncorrectFunctionDefinitionException();
                }
            }
            catch (ArgumentOutOfRangeException e)
            {
                throw new BracketsMissingException();
            }
        }
コード例 #2
0
        public Tree(string s)
        {
            s = Regex.Replace(s, "[s][i][n]", "[", RegexOptions.IgnoreCase);
            s = Regex.Replace(s, "[c][o][s]", "]", RegexOptions.IgnoreCase);
            s = Regex.Replace(s, "[t][a][n]", "!", RegexOptions.IgnoreCase);
            s = Regex.Replace(s, "[l][n]", "?", RegexOptions.IgnoreCase);
            s = Regex.Replace(s, "[e][x][p]", "#", RegexOptions.IgnoreCase);
            s = Regex.Replace(s, "[s][q][r][t]", "%", RegexOptions.IgnoreCase);

            Head = new ElementOfTree();
            Head.S(s);
        }
コード例 #3
0
 public void S(string partOfstring)
 {
     if (String.IsNullOrWhiteSpace(partOfstring))
     {
         throw new EmptyMemberException();
     }
     try
     {
         int sk = 0;
         for (int i = partOfstring.Length - 1; i >= 0; i--)
         {
             if (partOfstring[i] == '(')
             {
                 sk++;
                 continue;
             }
             if (partOfstring[i] == ')')
             {
                 sk--;
                 continue;
             }
             if ((partOfstring[i] == '+' || partOfstring[i] == '-' && i != 0) && sk == 0)
             {
                 Value = partOfstring[i].ToString();
                 Type  = NodeType.PlusMinus;
                 Left  = new ElementOfTree();
                 Left.S(partOfstring.Substring(0, i));
                 Right = new ElementOfTree();
                 Right.T(partOfstring.Substring(i + 1));
                 return;
             }
         }
         if (partOfstring[0] == '-')
         {
             Value = partOfstring[0].ToString();
             Type  = NodeType.MinusU;
             Left  = new ElementOfTree();
             Left.T(partOfstring.Substring(1, partOfstring.Length - 1));
             return;
         }
         T(partOfstring);
     }
     catch (ExpressionException e)
     {
         e.Node = GetNormalNodeState(partOfstring);
         throw;
     }
 }
コード例 #4
0
        private void Z(string pertOfString)
        {
            if (String.IsNullOrWhiteSpace(pertOfString))
            {
                throw new EmptyMemberException();
            }

            try
            {
                if (pertOfString[0] == '(' && pertOfString[pertOfString.Length - 1] == ')')
                {
                    if (pertOfString[1] == '-')
                    {
                        Value = "-";
                        Type  = NodeType.MinusU;
                        Left  = new ElementOfTree();
                        Left.N(pertOfString.Substring(2, pertOfString.Length - 3));
                    }
                    else
                    {
                        Type = NodeType.Const;
                        N(pertOfString.Substring(1, pertOfString.Length - 2));
                    }
                }
                else
                {
                    Regex constant = new Regex("^([a-w]|[y-z])$", RegexOptions.IgnoreCase);
                    if (constant.IsMatch(pertOfString))
                    {
                        Value = pertOfString;
                        Type  = NodeType.Const;
                        return;
                    }
                    N(pertOfString);
                }
            }
            catch (ExpressionException e)
            {
                e.Node = GetNormalNodeState(pertOfString);
                throw;
            }
        }
コード例 #5
0
 public void ProcessTree(IContext processContext)
 {
     Head = processContext.Process(Head);
 }
コード例 #6
0
        public void Determinate(ElementOfTree element)
        {
            if (element.Left != null)
            {
                Determinate(element.Left);
            }
            if (element.Right != null)
            {
                Determinate(element.Right);
            }
            Regex Const = new Regex("[x]", RegexOptions.IgnoreCase);

            switch (element.Value)
            {
            case "-":
                if (element.Right == null)
                {
                    element.Type = NodeType.MinusU;
                    return;
                }
                element.Type = NodeType.PlusMinus;
                return;

            case "+": element.Type = NodeType.PlusMinus; return;

            case "*": element.Type = NodeType.Multiply; return;

            case "/": element.Type = NodeType.Divide; return;

            case "^":
                element.Type = NodeType.Degree;
                return;

            case "[":
                element.Type = NodeType.Sin;
                return;

            case "]":
                element.Type = NodeType.Cos;
                return;

            case "!":
                element.Type = NodeType.Tan;
                return;

            case "?":
                element.Type = NodeType.Ln;
                return;

            case "#":
                element.Type = NodeType.Exp;
                return;

            case "%":
                element.Type = NodeType.Sqrt;
                return;

            case "X":
            case "x": element.Type = NodeType.X; return;

            default: element.Type = NodeType.Const; return;
            }
        }
コード例 #7
0
        private void T(string partOfString)
        {
            if (String.IsNullOrWhiteSpace(partOfString))
            {
                throw new EmptyMemberException();
            }
            try
            {
                int sk       = 0;
                int divide   = -1;
                int multiply = -1;
                int degree   = -1;
                for (int i = partOfString.Length - 1; i >= 0; i--)
                {
                    if (partOfString[i] == '(')
                    {
                        sk++;
                    }
                    else
                    if (partOfString[i] == ')')
                    {
                        sk--;
                    }
                    else
                    if (sk == 0)
                    {
                        if (partOfString[i] == '/' && divide == -1)
                        {
                            divide = i;
                        }
                        else
                        if (partOfString[i] == '*' && multiply == -1)
                        {
                            multiply = i;
                        }
                        else
                        if (partOfString[i] == '^' && degree == -1)
                        {
                            degree = i;
                        }
                    }
                }

                if (divide != -1)
                {
                    Value = partOfString[divide].ToString();
                    Type  = NodeType.Divide;
                    Left  = new ElementOfTree();
                    Left.T(partOfString.Substring(0, divide));
                    Right = new ElementOfTree();
                    Right.T(partOfString.Substring(divide + 1));
                    return;
                }
                if (multiply != -1)
                {
                    Value = partOfString[multiply].ToString();
                    Type  = NodeType.Multiply;
                    Left  = new ElementOfTree();
                    Left.T(partOfString.Substring(0, multiply));
                    Right = new ElementOfTree();
                    Right.T(partOfString.Substring(multiply + 1));
                    return;
                }
                if (degree != -1)
                {
                    Value = partOfString[degree].ToString();
                    Type  = NodeType.Degree;
                    Left  = new ElementOfTree();
                    Left.T(partOfString.Substring(0, degree));
                    Right = new ElementOfTree();
                    Right.Z(partOfString.Substring(degree + 1));
                    return;
                }
                M(partOfString);
            }
            catch (ExpressionException e)
            {
                e.Node = GetNormalNodeState(partOfString);
                throw;
            }
        }