11 个解决方案
#1
解析
#2
Javascript中的eval("a+b")在C#应该是没有办法解释的.
也就是说有意义的字符串转换成程序语句应该是不成的,不知道高手们有没有办法
也就是说有意义的字符串转换成程序语句应该是不成的,不知道高手们有没有办法
#3
*************************************************
具体问题是这样的,如果没有“有意义的字符串转换成程序语句”的话,不用上述方法也行。
我的问题是:我输入了一个公式,公式是随时会变化的,是人为输入的,是穷举不尽的,怎么能让程序中的数据按照这个公式计算?
*************************************************
具体问题是这样的,如果没有“有意义的字符串转换成程序语句”的话,不用上述方法也行。
我的问题是:我输入了一个公式,公式是随时会变化的,是人为输入的,是穷举不尽的,怎么能让程序中的数据按照这个公式计算?
*************************************************
#4
反射反射
#5
做得简单一点的话就用解析
如果比较复杂的公式,可能就要用到人工智能或者神经网络的了
如果比较复杂的公式,可能就要用到人工智能或者神经网络的了
#6
只是简单的加减乘除括号的话有现成的类 但是要用到更复杂的东西的话就要自己分析文法了。。。
编译原理的东西。。很头大
编译原理的东西。。很头大
#7
通过CODEDOM+反射来处理,不过你的语句一定要正确.
CODEDOM可以临时生成代码及编译成DLL,反射可以调用生成的DLL
CODEDOM可以临时生成代码及编译成DLL,反射可以调用生成的DLL
#8
请参考这篇文章:
动态地生成用户输入的函数表达式(C#)
http://www.cnblogs.com/skyivben/archive/2005/10/31/265861.html
动态地生成用户输入的函数表达式(C#)
http://www.cnblogs.com/skyivben/archive/2005/10/31/265861.html
// 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 });
}
}
}
// 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);
}
}
}
}
#9
学习
帮顶
帮顶
#10
如果只是解析数学公式的话方法也不少,差不多5到6种
1.按逆波兰表达式自己解析
2.使用第三方语言引擎ironpython ,jscript,javascript,vbscript
3.使用codedom
4.反射
5.借用dataTable运算
6.使用第三方科学计算工具如:matlab,labview,excel
1.按逆波兰表达式自己解析
2.使用第三方语言引擎ironpython ,jscript,javascript,vbscript
3.使用codedom
4.反射
5.借用dataTable运算
6.使用第三方科学计算工具如:matlab,labview,excel
#11
谢谢大家的帮助!!!
#1
解析
#2
Javascript中的eval("a+b")在C#应该是没有办法解释的.
也就是说有意义的字符串转换成程序语句应该是不成的,不知道高手们有没有办法
也就是说有意义的字符串转换成程序语句应该是不成的,不知道高手们有没有办法
#3
*************************************************
具体问题是这样的,如果没有“有意义的字符串转换成程序语句”的话,不用上述方法也行。
我的问题是:我输入了一个公式,公式是随时会变化的,是人为输入的,是穷举不尽的,怎么能让程序中的数据按照这个公式计算?
*************************************************
具体问题是这样的,如果没有“有意义的字符串转换成程序语句”的话,不用上述方法也行。
我的问题是:我输入了一个公式,公式是随时会变化的,是人为输入的,是穷举不尽的,怎么能让程序中的数据按照这个公式计算?
*************************************************
#4
反射反射
#5
做得简单一点的话就用解析
如果比较复杂的公式,可能就要用到人工智能或者神经网络的了
如果比较复杂的公式,可能就要用到人工智能或者神经网络的了
#6
只是简单的加减乘除括号的话有现成的类 但是要用到更复杂的东西的话就要自己分析文法了。。。
编译原理的东西。。很头大
编译原理的东西。。很头大
#7
通过CODEDOM+反射来处理,不过你的语句一定要正确.
CODEDOM可以临时生成代码及编译成DLL,反射可以调用生成的DLL
CODEDOM可以临时生成代码及编译成DLL,反射可以调用生成的DLL
#8
请参考这篇文章:
动态地生成用户输入的函数表达式(C#)
http://www.cnblogs.com/skyivben/archive/2005/10/31/265861.html
动态地生成用户输入的函数表达式(C#)
http://www.cnblogs.com/skyivben/archive/2005/10/31/265861.html
// 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 });
}
}
}
// 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);
}
}
}
}
#9
学习
帮顶
帮顶
#10
如果只是解析数学公式的话方法也不少,差不多5到6种
1.按逆波兰表达式自己解析
2.使用第三方语言引擎ironpython ,jscript,javascript,vbscript
3.使用codedom
4.反射
5.借用dataTable运算
6.使用第三方科学计算工具如:matlab,labview,excel
1.按逆波兰表达式自己解析
2.使用第三方语言引擎ironpython ,jscript,javascript,vbscript
3.使用codedom
4.反射
5.借用dataTable运算
6.使用第三方科学计算工具如:matlab,labview,excel
#11
谢谢大家的帮助!!!