动态地生成用户输入的函数表达式(C#)

http://www.cnblogs.com/skyivben/archive/2005/10/31/265861.html

C# code
   
   
// Expression.cs - 动态生成数学表达式并计算其值 // 表达式使用 C# 语法,可带一个的自变量(x)。 // 表达式的自变量和值均为(double)类型。 // 使用举例: // Expression expression = new Expression("Math.Sin(x)"); // Console.WriteLine(expression.Compute(Math.PI / 2)); // expression = new Expression("double u = Math.PI - x;" + // "double pi2 = Math.PI * Math.PI;" + // "return 3 * x * x + Math.Log(u * u) / pi2 / pi2 + 1;"); // Console.WriteLine(expression.Compute(0)); using System; using System.CodeDom.Compiler; using Microsoft.CSharp; using System.Reflection; using System.Text; namespace Skyiv.Util { sealed class Expression { object instance; MethodInfo method; public Expression( string expression) { if (expression.IndexOf( " return " ) < 0 ) expression = " return " + expression + " ; " ; string className = " Expression " ; string methodName = " Compute " ; CompilerParameters p = new CompilerParameters(); p.GenerateInMemory = true ; CompilerResults cr = new CSharpCodeProvider().CompileAssemblyFromSource(p, string . Format( " using System;sealed class {0}{{public double {1}(double x){{{2}}}}} " , className, methodName, expression)); if (cr.Errors.Count > 0 ) { string msg = " Expression(/" " + expression + " /"): /n " ; foreach (CompilerError err in cr.Errors) msg += err.ToString() + " /n " ; throw new Exception(msg); } instance = cr.CompiledAssembly.CreateInstance(className); method = instance.GetType().GetMethod(methodName); } public double Compute( double x) { return ( double )method.Invoke(instance, new object [] { x }); } } }



C# code
   
   
// ExpressionTest.cs - 动态生成数学表达式并计算其值的测试程序 // 编译方法: csc ExpressionTest.cs Expression.cs using System; using Skyiv.Util; namespace Skyiv.Test { class ExpressionTest { static void Main( string [] args) { try { if (args.Length > 0 ) { Console.WriteLine( " f(x): {0} " , args[ 0 ]); Expression expression = new Expression(args[ 0 ]); for ( int i = 1 ; i < args.Length; i ++ ) { double x = double .Parse(args[i]); Console.WriteLine( " f({0}) = {1} " , x, expression.Compute(x)); } } else Console.WriteLine( " Usage: ExpressionTest expression [ parameters ] " ); } catch (Exception ex) { Console.WriteLine( " 错误: " + ex.Message); } } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值