/// <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>(); }
/// <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; }
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(); }
/// <summary> /// 累乗演算子ノードを初期化します。 /// </summary> /// <param name="left">左側演算対象ノード</param> /// <param name="right">右側演算対象ノード</param> public PowerNode(Node left, Node right) : base(left, right) { }
/// <summary> /// 加算演算子ノードを初期化します。 /// </summary> /// <param name="left">左側演算対象ノード</param> /// <param name="right">右側演算対象ノード</param> public PlusNode(Node left, Node right) : base(left, right) { }
/// <summary> /// 正弦関数ノードを初期化します。 /// </summary> /// <param name="functionExpression">関数に与える式を表すノード</param> public SinNode(Node functionExpression) : base(functionExpression) { }
/// <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)); }
/// <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; }
/// <summary> /// 除算演算子ノードを初期化します。 /// </summary> /// <param name="left">左側演算対象ノード</param> /// <param name="right">右側演算対象ノード</param> public DivideNode(Node left, Node right) : base(left, right) { }
/// <summary> /// 余弦関数ノードを初期化します。 /// </summary> /// <param name="functionExpression">関数に与える式を表すノード</param> public CosNode(Node functionExpression) : base(functionExpression) { }
/// <summary> /// 減算演算子ノードを初期化します。 /// </summary> /// <param name="left"></param> /// <param name="right"></param> public SubtractNode(Node left, Node right) : base(left, right) { }
/// <summary> /// 自然対数ノードを初期化します。 /// </summary> /// <param name="functionExpression">関数に与える式を表すノード</param> public LogNode(Node functionExpression) : base(functionExpression) { }
/// <summary> /// 乗算演算子ノードを初期化します。 /// </summary> /// <param name="left">左側演算対象ノード</param> /// <param name="right">右側演算対象ノード</param> public MultiplyNode(Node left, Node right) : base(left, right) { }