手动输入一个函数

longquan0609 2008-11-29 12:41:00
如果我写一个程序,求一个函数的定积分问题,我想通过键盘输入这个函数,应该怎么解决。
比如我想求f(x)=1/(1+x^2),这个函数的积分,而这个函数又不可以在程序中初始化,改怎么办?
谢谢各位了~~~
...全文
312 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
longquan0609 2008-12-08
  • 打赏
  • 举报
回复
谢谢大家了,很热闹啊这里。呵呵
zhanshen2891 2008-12-01
  • 打赏
  • 举报
回复
两个办法:

1: 用MATLAB
2: 用脚本,比如LUA脚本

把函数写在脚本里然后住程序调用
hhyttppd 2008-12-01
  • 打赏
  • 举报
回复
可以用js解析器来干这事。
xxgamexx 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 longquan0609 的回复:]
引用 7 楼 xxgamexx 的回复:
能否解释下 “这个函数又不可以在程序中初始化”


就是函数要在程序运行的时候输入,而不是在程序里面写。
[/Quote]

对输入字符串进行拆分和解析,行么?
iambic 2008-12-01
  • 打赏
  • 举报
回复
直接嵌个Lua解释器就行了,100KB左右。
lc19890326 2008-12-01
  • 打赏
  • 举报
回复
不过退一步来说
建议你用函数指针
可以写多个函数体 然后去调用
lc19890326 2008-12-01
  • 打赏
  • 举报
回复
有难度 试试用Matlab吧
longquan0609 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 xxgamexx 的回复:]
引用 16 楼 longquan0609 的回复:
引用 7 楼 xxgamexx 的回复:
能否解释下 “这个函数又不可以在程序中初始化”


就是函数要在程序运行的时候输入,而不是在程序里面写。


对输入字符串进行拆分和解析,行么?
[/Quote]

那样工作量很大的,自己做一个解释程序不相当与做一个简单的数学软件了嘛,呵呵
forcal 2008-12-01
  • 打赏
  • 举报
回复
由以上各位的回复可以看出,新东西再好,也很难让人接受,我还是直接给出一段代码吧。使用Forcal好像不是太难。
以下内容取自“循序渐进Forcal例程”,在我的blog有(http://blog.csdn.net/forcal),软件包中也有。

含源代码(含积分的例子):http://www.skycn.com/soft/23045.html
含源代码(含积分的例子):http://www.skycn.com/soft/50559.html
演示程序(含积分的例子):http://www.skycn.com/soft/14414.html

从这一节开始给出使用Forcal的例子,这是最简单的。
这个例子有三个函数:加载并初始化Forcal的函数InitForcal,释放Forcal的函数FreeForcal和主函数main,主函数编译并计算了一个实数表达式的值。前两个函数的内容完全可以并入主函数,但分开写显得更清晰一些。
这个例子只用到了Forcal的四个输出函数:初始化Forcal的函数InitForcal,释放Forcal的函数FreeForcal,编译实数表达式的函数RealCom和计算实数表达式的函数RealCal。例子的完整源代码如下:

#include <windows.h>
#include <cmath>
#include <iostream>
#include <iomanip>
#include "forcal32.h"

using namespace std;
HINSTANCE hForcal=NULL; //动态库Forcal32.dll的句柄;
//动态库输出函数;
fcInitForcal pInitForcal;
fcFreeForcal pFreeForcal;
fcRealCom pRealCom;
fcRealCal pRealCal;
bool InitForcal(void) //初始化Forcal;
{
hForcal=LoadLibrary("Forcal32.dll"); //加载动态库Forcal32.dll;
if(!hForcal)
{
cout<<"找不到Forcal32.dll!请将该库放到WINDOWS的搜索路径内!";
return false;
}
//以下几个语句获取Forcal32.dll中所调用函数的地址;
pInitForcal=(fcInitForcal) GetProcAddress(hForcal,"InitForcal");
pFreeForcal=(fcFreeForcal) GetProcAddress(hForcal,"FreeForcal");
pRealCom=(fcRealCom) GetProcAddress(hForcal,"RealCom");
pRealCal=(fcRealCal) GetProcAddress(hForcal,"RealCal");
if(!pInitForcal||!pFreeForcal||!pRealCom||!pRealCal)
{
cout<<"无效的动态库函数!"<<endl;
FreeLibrary(hForcal); //释放动态库Forcal32.dll;
hForcal=NULL;
return false;
}
pInitForcal(); //初始化Forcal32.dll;
return true;
}
void FreeForcal(void) //释放Forcal
{
pFreeForcal(); //释放Forcal申请的空间;
FreeLibrary(hForcal); //释放动态库;
}
void main(void)
{
void *vFor; //表达式句柄;
fcINT nPara; //存放表达式的自变量个数;
double *pPara; //存放输入自变量的数组指针;
fcINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置;
int ErrCode; //错误代码;
char ForStr[]="1+2"; //字符串表达式;可改为f(x)=1/(1+x^2),但要输入自变量,需更改这个例子。
if(!InitForcal()) return; //初始化Forcal;
vFor=0;
ErrCode=pRealCom(ForStr,0,vFor,nPara,pPara,ErrBegin,ErrEnd); //编译实数表达式;
if(ErrCode)
{
cout<<"表达式有错误!错误代码:"<<ErrCode<<endl;
}
else
{
cout<<pRealCal(vFor,pPara)<<endl; //计算实数表达式的值;
}
FreeForcal(); //释放Forcal;
}

习题:

(1)更换不同的字符串表达式ForStr,重新编译运行程序,观察计算结果。

(2)将本例计算实数表达式改为计算整数表达式或复数表达式的例子。
longquan0609 2008-11-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xxgamexx 的回复:]
能否解释下 “这个函数又不可以在程序中初始化”
[/Quote]

就是函数要在程序运行的时候输入,而不是在程序里面写。
longquan0609 2008-11-30
  • 打赏
  • 举报
回复
谢谢各位了,我曾经问过很多人知道这个问题用vc做比较棘手。想在这里找到一个解决的方案~谢谢各位捧场
forcal 2008-11-30
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 toadzw 的回复:]
现存的系统下都不支持这种技术,你这样等真正的人工智能实现以后看一下有没有可能了;
[/Quote]

有了Forcal。现存的系统下就都支持这种技术了。

通常,使用各种高级语言如C/C++、VB、delphi、FORTRAN等设计的程序,不能对源代码进行动态编译,Forcal可为所有这些应用程序增加对字符串源代码的动态编译功能。Forcal可用作报表处理、web、组态软件、游戏等的脚本,具有很高的执行效率。像以上这种问题,Forcal的计算速度约为(C/C++)或FORTRAN速度的50%左右。没人相信吗?

我的blog:http://blog.csdn.net/forcal
ken_scott 2008-11-30
  • 打赏
  • 举报
回复
难,还是用专用的数学软件吧
toadzw 2008-11-30
  • 打赏
  • 举报
回复
现存的系统下都不支持这种技术,你这样等真正的人工智能实现以后看一下有没有可能了;
bfhtian 2008-11-30
  • 打赏
  • 举报
回复
你初始化的时候只要传进去积分区域和函数就行了,可以用char *argv[]来存储。不知道有没理解错
lsldd 2008-11-29
  • 打赏
  • 举报
回复
这个比较麻烦...帮顶
帅得不敢出门 2008-11-29
  • 打赏
  • 举报
回复
只能先生成
double f(type x)
{
return 1/(1+pow((double)x,2));
}
然后调用

如果要在运行时输入函数是如何的,这个有点难吧.
forcal 2008-11-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 chen_de_sheng 的回复:]
用MATLAB吧MATLAB简单
[/Quote]

MATLAB计算引擎太庞大,计算速度慢,以前我测试过,forcal比MATLAB至少快2倍,遇到循环就更慢了。不知MATLAB的新版本速度如何?
动态库版本的forcal不到100k,静态库版本的forcal有200~300k,而且免安装。
deerwin1986 2008-11-29
  • 打赏
  • 举报
回复
编译器前端设计...
呵呵 LZ加油!
deerwin1986 2008-11-29
  • 打赏
  • 举报
回复
编译器前端设计...
呵呵 LZ加油!
加载更多回复(9)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧