怎样做函数发生器?

时间:2021-08-14 23:31:45
各位高手,本人现在做一个项目,牵涉一些行业运算,其运算公式比较复杂,鉴于我们对运算公式的不熟悉,且客户要求可以自定义计算公式,现在客户要求我们做一个函数发生器,客户使用自定义函数来完成数据之间的复杂运算后将结果输出。该函数发生器会要完成类似微分、积分等运算,而输入又是不确定的,请问有没有好的解决办法。

18 个解决方案

#1


很急呀!救命!

#2


呵呵,关注:)

#3


靠~~~~~不会是人工智能吧

#4


使用ms script 控件,允许嵌入代码,不过没使用过。

#5


就是函数转发器嘛

很简单的

把处理运算的操作转发给客户自己的DLL函数处理
是这个意思吧?

#6


up

#7


gz

#8


你的什么微分、积分熟不熟啊? 不熟,那就~~~~~ 

给你点建议,客户的运算应该无非就 + - * / 微分 积分 固定的算法吧。

用stack原理处理运算法则,如下:

当程序遇到同级别的运算符时就把运算数和运算符PUSH到Stack中。

遇到级别比Stack最高的运算符的级别低的运算符时就Pop Stack中所有运算数和运算符进行计算得到的结果与级别低的运算符的一同放入Stack中。

遇到级别高的运算符就Pop Stack中最后进来的运算数与新运算符进行计算得结果Push到Stack

直到公式毕以后,Pop Stack所有的运算数和运算符进行最后运算。

例子:
7 + 2 - 3 * 8 -1 / 7 = ????

7   -> Push Stack 
+   -> Push Stack
2   -> Push Stack
-   -> Push Stack
3   -> Push Stack
*   -> Pop Stack 出 3
3 * 8 = 24 -> Push Stack 
-   -> Push Stack
1   -> Push Stack
/   -> Pop Stack 出 1
1 / 7 = 0.14285714285714285714285714285714

最后Pop 所有运算数和运算符一一进行计算。

7 + 2 - 24 - 0.14285714285714285714285714285714 = ????

原理比较粗略, 大概就这个意思。

#9


微分积分,难
我做过类似的,稍简单些
1,直接表达式解析并求值,如采用逆波兰式
2,将用户需求改写成VC表达式,用VC编译器编成DLL中的一个函数再调用。
常用函数均可应付。

#10


嵌入matlab吧,很通用的做法,需matlab引擎,可以处理普通的微积分

#11


JJONY()你所说的stack肯定会要用的;
zady(森林木)能讲得更明白些吗?
wacky(我爱我家)matlab是控件吧,VB本身就带了吗?如果没有,哪里可以找到呢?

#12


l_agang(阿刚):须装matlab,
用vc调用其引擎须libeng.lib和libmx.lib两个库。
用vb也是同样的吧。仅供参考

#13


wacky(我爱我家)在哪里有matlab的安装程序?

#14


去电脑城看看吧。

#15


up

#16


方法1,直接表达式解析并求值,如采用逆波兰式
很多编程教材有,参考例子
http://lsyz.3322.net/article.html
方法2,将用户需求改写成VC表达式,用VC编译器编成DLL中的一个函数再调用。
首先保留一个最小的VC编译内核(大概有7,8个文件),再让程序根据用户需求动态生成CPP(或C)源码,并调用命令行进行编译,生成dll,

例:(假设用户定义新函数为输入参数的3次方)
...
#define FUNCTION(n, a)  extern "C" __declspec( dllexport ) long fnMyFun##n(long lParam) {return long(a);}
...
//动态添加下行
FUNCTION(101,pow(lParam,3))
...
上述代码生成一个DLL,包含一个fnMyFun101的函数。

其它程序通过动态加载DLL,并调用该函数
long lResult=fnMyFun101(200);
就可获得预定的函数功能。
这里仅仅是抛砖引玉,详细内容还需仔细实践。

#17


http://www.csdn.net/cnshare/soft/4/4589.shtm
这是一个算法解析器,一般常用的表达式它都能求解
你去下载一下把!!

#18


http://www.csdn.net/cnshare/soft/4/4589.shtm
这是一个算法解析器,一般常用的表达式它都能求解
你去下载一下把!!

#1


很急呀!救命!

#2


呵呵,关注:)

#3


靠~~~~~不会是人工智能吧

#4


使用ms script 控件,允许嵌入代码,不过没使用过。

#5


就是函数转发器嘛

很简单的

把处理运算的操作转发给客户自己的DLL函数处理
是这个意思吧?

#6


up

#7


gz

#8


你的什么微分、积分熟不熟啊? 不熟,那就~~~~~ 

给你点建议,客户的运算应该无非就 + - * / 微分 积分 固定的算法吧。

用stack原理处理运算法则,如下:

当程序遇到同级别的运算符时就把运算数和运算符PUSH到Stack中。

遇到级别比Stack最高的运算符的级别低的运算符时就Pop Stack中所有运算数和运算符进行计算得到的结果与级别低的运算符的一同放入Stack中。

遇到级别高的运算符就Pop Stack中最后进来的运算数与新运算符进行计算得结果Push到Stack

直到公式毕以后,Pop Stack所有的运算数和运算符进行最后运算。

例子:
7 + 2 - 3 * 8 -1 / 7 = ????

7   -> Push Stack 
+   -> Push Stack
2   -> Push Stack
-   -> Push Stack
3   -> Push Stack
*   -> Pop Stack 出 3
3 * 8 = 24 -> Push Stack 
-   -> Push Stack
1   -> Push Stack
/   -> Pop Stack 出 1
1 / 7 = 0.14285714285714285714285714285714

最后Pop 所有运算数和运算符一一进行计算。

7 + 2 - 24 - 0.14285714285714285714285714285714 = ????

原理比较粗略, 大概就这个意思。

#9


微分积分,难
我做过类似的,稍简单些
1,直接表达式解析并求值,如采用逆波兰式
2,将用户需求改写成VC表达式,用VC编译器编成DLL中的一个函数再调用。
常用函数均可应付。

#10


嵌入matlab吧,很通用的做法,需matlab引擎,可以处理普通的微积分

#11


JJONY()你所说的stack肯定会要用的;
zady(森林木)能讲得更明白些吗?
wacky(我爱我家)matlab是控件吧,VB本身就带了吗?如果没有,哪里可以找到呢?

#12


l_agang(阿刚):须装matlab,
用vc调用其引擎须libeng.lib和libmx.lib两个库。
用vb也是同样的吧。仅供参考

#13


wacky(我爱我家)在哪里有matlab的安装程序?

#14


去电脑城看看吧。

#15


up

#16


方法1,直接表达式解析并求值,如采用逆波兰式
很多编程教材有,参考例子
http://lsyz.3322.net/article.html
方法2,将用户需求改写成VC表达式,用VC编译器编成DLL中的一个函数再调用。
首先保留一个最小的VC编译内核(大概有7,8个文件),再让程序根据用户需求动态生成CPP(或C)源码,并调用命令行进行编译,生成dll,

例:(假设用户定义新函数为输入参数的3次方)
...
#define FUNCTION(n, a)  extern "C" __declspec( dllexport ) long fnMyFun##n(long lParam) {return long(a);}
...
//动态添加下行
FUNCTION(101,pow(lParam,3))
...
上述代码生成一个DLL,包含一个fnMyFun101的函数。

其它程序通过动态加载DLL,并调用该函数
long lResult=fnMyFun101(200);
就可获得预定的函数功能。
这里仅仅是抛砖引玉,详细内容还需仔细实践。

#17


http://www.csdn.net/cnshare/soft/4/4589.shtm
这是一个算法解析器,一般常用的表达式它都能求解
你去下载一下把!!

#18


http://www.csdn.net/cnshare/soft/4/4589.shtm
这是一个算法解析器,一般常用的表达式它都能求解
你去下载一下把!!