Ejemplo n.º 1
0
 /// <summary>
 /// 文字列で表された式を使用して<see cref="Calculator"/>クラスを初期化します。
 /// </summary>
 /// <param name="expression">式</param>
 /// <exception cref="ArgumentNullException"><paramref name="expression"/>がnullか空か、空白のみで構成されています。</exception>
 public Calculator(string expression)
 {
     if (string.IsNullOrWhiteSpace(expression))
         throw new ArgumentNullException("expression");
     rootNode = Node.Parse(Tokenizer.Tokenize(expression));
     Parameter = new Dictionary<char, double>();
 }
Ejemplo n.º 2
0
        /// <summary>
        /// 演算子ノードを初期化します。
        /// </summary>
        /// <param name="left">左側演算対象ノード</param>
        /// <param name="right">右側演算対象ノード</param>
        /// <exception cref="ArgumentNullException"><paramref name="left"/>または<paramref name="right"/>がnullです。</exception>
        protected OperatorNode(Node left, Node right)
        {
            if (left == null)
                throw new ArgumentNullException("left");
            if (right == null)
                throw new ArgumentNullException("right");

            _left = left;
            _right = right;
        }
Ejemplo n.º 3
0
        static void Main(string[] args)
        {
            //string exprString = "(a+b)*(c-d)/(e+f)";
            string exprString = "sin(x)+cos(x)*2-(9.84/2)^(a)";
            List<Token> tokens = Tokenizer.Tokenize(exprString);
            Console.WriteLine("** Tokenize **");
            tokens.ForEach(x => Console.WriteLine(x.ToString()));
            Console.WriteLine("** Analyze **");
            Node root = new Node();
            root.Parse(tokens);
            Console.WriteLine(root.ToString());
            Console.WriteLine("** Evaluate **");
            Console.WriteLine("* Parameters *");
            Dictionary<char, double> parameter = new Dictionary<char, double>()
            {
                {'a', 1.4},
                {'b', 2.8},
                {'c', 2.2},
                {'d', 2.4},
                {'e', 5.1},
                {'f', 9.7},
                {'t', Math.PI / 4},
                {'x', 2.0}
            };
            foreach (var p in parameter)
                Console.WriteLine("{0} = {1}", p.Key, p.Value);
            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            List<TimeSpan> elapsedTimes = new List<TimeSpan>();
            for (int i = 0; i < 1; i++)
            {
                sw.Start();
                root.Evaluate(parameter);
                Console.WriteLine("i = " + i + ": " + root.Evaluate(parameter));
                sw.Stop();
            //                Console.WriteLine("  Elapsed Time: " + sw.Elapsed);
                elapsedTimes.Add(sw.Elapsed);
                sw.Reset();
            }
            Console.WriteLine("Average Elapsed Time: " + TimeSpan.FromMilliseconds(elapsedTimes.Average(ts => ts.Milliseconds)));

            //Expression expr = ArithmeticExpression.Expression.Parse(exprString);

            //Console.WriteLine("-- Original");
            //Console.WriteLine(exprString);
            //Console.WriteLine("-- Postorder");
            //Console.WriteLine(expr.Root.TraversePostorder());
            //Console.WriteLine();
            //Console.WriteLine("-- Inorder");
            //Console.WriteLine(expr.Root.TraverseInorder());
            //Console.WriteLine();
            //Console.WriteLine("-- Preorder");
            //Console.WriteLine(expr.Root.TraversePreorder());
            //Console.WriteLine();
            Console.ReadKey();
        }
Ejemplo n.º 4
0
 /// <summary>
 /// 累乗演算子ノードを初期化します。
 /// </summary>
 /// <param name="left">左側演算対象ノード</param>
 /// <param name="right">右側演算対象ノード</param>
 public PowerNode(Node left, Node right)
     : base(left, right)
 {
 }
Ejemplo n.º 5
0
 /// <summary>
 /// 加算演算子ノードを初期化します。
 /// </summary>
 /// <param name="left">左側演算対象ノード</param>
 /// <param name="right">右側演算対象ノード</param>
 public PlusNode(Node left, Node right)
     : base(left, right)
 {
 }
Ejemplo n.º 6
0
 /// <summary>
 /// 正弦関数ノードを初期化します。
 /// </summary>
 /// <param name="functionExpression">関数に与える式を表すノード</param>
 public SinNode(Node functionExpression)
     : base(functionExpression)
 {
 }
Ejemplo n.º 7
0
 /// <summary>
 /// 式を設定します。
 /// </summary>
 /// <param name="expression">設定する式</param>
 /// <exception cref="ArgumentNullException"><paramref name="expression"/>がnullか空か、空白のみで構成されています。</exception>
 public void SetExpression(string expression)
 {
     if (string.IsNullOrWhiteSpace(expression))
         throw new ArgumentNullException("expression", "式がnullか空、もしくは空白のみです。");
     rootNode = Node.Parse(Tokenizer.Tokenize(expression));
 }
Ejemplo n.º 8
0
 /// <summary>
 /// 関数ノードを初期化します。
 /// </summary>
 /// <param name="functionExpression">関数に与える式を表すノード</param>
 /// <exception cref="ArgumentNullException"><paramref name="functionExpression"/>がnullです。</exception>
 protected FunctionNode(Node functionExpression)
 {
     if (functionExpression == null)
         throw new ArgumentNullException("functionExpression");
     _funcExpr = functionExpression;
 }
Ejemplo n.º 9
0
 /// <summary>
 /// 除算演算子ノードを初期化します。
 /// </summary>
 /// <param name="left">左側演算対象ノード</param>
 /// <param name="right">右側演算対象ノード</param>
 public DivideNode(Node left, Node right)
     : base(left, right)
 {
 }
Ejemplo n.º 10
0
 /// <summary>
 /// 余弦関数ノードを初期化します。
 /// </summary>
 /// <param name="functionExpression">関数に与える式を表すノード</param>
 public CosNode(Node functionExpression)
     : base(functionExpression)
 {
 }
Ejemplo n.º 11
0
 /// <summary>
 /// 減算演算子ノードを初期化します。
 /// </summary>
 /// <param name="left"></param>
 /// <param name="right"></param>
 public SubtractNode(Node left, Node right)
     : base(left, right)
 {
 }
Ejemplo n.º 12
0
 /// <summary>
 /// 自然対数ノードを初期化します。
 /// </summary>
 /// <param name="functionExpression">関数に与える式を表すノード</param>
 public LogNode(Node functionExpression)
     : base(functionExpression)
 {
 }
Ejemplo n.º 13
0
 /// <summary>
 /// 乗算演算子ノードを初期化します。
 /// </summary>
 /// <param name="left">左側演算対象ノード</param>
 /// <param name="right">右側演算対象ノード</param>
 public MultiplyNode(Node left, Node right)
     : base(left, right)
 {
 }