由于1.0版本是大二的课程设计,有几个功能是针对指定函数的,所以在2.0版本给它禁用了,等有兴趣了再慢慢改吧,主要是那时写的程序变量名称可持续发展性太差了,现在不想改。
这次2.0版本主要是重写了表达式计算类,所以比1.0版本只在表达式计算方面加强了
1.0版本的限制在于:括号内的运算符只能有一个
2.0版本在其基础上增强了一点点细节,如大小写随意,可输入空格换行等
一【函数表达式】
主要功能:
1】计算任意函数类型,如sinlog......
2】计算任意复合及组合的函数表达式,如sin(log(2,x)+2x)
主要特点:
1】函数报错功能,
如不小心将sin(x)写成了sni(x),
将提示【第1项函数的类型为【sni】,暂无此函数类型】
如括号多写了sin(x)),
将提示【第2个右括号无匹配】
2】大小写随意,如SIn(x)也能识别
3】输入符合我们平时书写的习惯,如-x-1*x(-1)*x都是可以识别的
4】兼容空格、制表符Tab、换行,因此您可以书写得更美观
如sin(cos(tan(cot(x+x*2)+3)+4)+5)
可写成sin(cos(tan(cot(x+x*2)+3)+4)+5)
或者sin
(
cos
(
tan
(
cot
(
x+x*2
)
+3
)
+4
)
+5
)
总之,发挥你的想象力吧
测试数据
sin
(
cos
(
tan
(
x+x*2
)
+3
)
+4
)
/*m_Input="1"
x=1;
m_Input="x"
m_Input="-1-1";
m_Input="(-1)+(-1)";
m_Input="(-1)+1";
m_Input="-2*1";
m_Input="(-2)/1";
m_Input="2/(-1)";
m_Input="(-2)*sin(1.57)";
m_Input="-2sin(1.57)";
x=1.57;
m_Input="-sin(1.57)+2sin(x)";
x=4;
m_Input="log(2,x)*cex(0)+cxn(x,2)";
x=-1;
m_Input="1cos(2sin(tan(log(2,2cxx(-2x,2cos(2x+2cex(0)))))))";//0.959906
x=0;
m_Input="-cos(x)*sin(x)/cos(sin(x))-sin(x)/cos(x)+cos(sin(x))-cos(x)+cex(x)+4log(2,x+2)+5cxn(45.2,x)";//10
m_Input="";
m_Input="-sin(1.57+1.57*2)";
m_Input="-sin(1.57+1.57+1.57)";
*/
二【函数表达式积分】
1cos(2sin(tan(log(2,2cxx(-2x,2cos(2x+2cex(0)))))))
用这个表达式计算积分时,提示错误,因为机器是按照机器的方式工作的
有兴趣可以用MATLAB算一算
这里算法用的是龙贝格大神的,
大二的代码就献丑了
void CExpInt::OnBnClickedButtonRomberge()
{
// TODO: 在此添加控件通知处理程序代码
double T[N][N];
double a,b,h,f0,double_temp,n;
double det,esp,x;
int k,l,m;
UpdateData(TRUE);
if(m_MyInput=="")
{
MessageBox("请输入数据");
return;
}
cAnyExp.ReceiveCharacter(m_MyInput,cAnyExp);//接收表达式,cAnyExp为表达式计算类
a=atof(m_My_a);
b=atof(m_My_b);
esp=atof(m_MyEps);
det=esp;
h=b-a;
T[0][0]=(f(a)+f(b))*h/2;
l=0;n=1.0/2;
/******************************【开始积分】******************************/
while(det>=esp)
{
l++;
n=2*n;
for(f0=0,k=0;k<=n-1;k++)
{
x=a+double((2*k+1)*h)/2/n;
f0=f0+f(x);
}
T[0][l]=T[0][l-1]/2+f0*h/2/n;
for(m=1,double_temp=1;m<=l;m++)
{
double_temp=double_temp*4;
for(k=1;k<=l-m+1;k++)
T[m][k-1]=(T[m-1][k]*double_temp-T[m-1][k-1])/(double_temp-1);
}
det=T[l][0]-T[l-1][0];
if(det<0) det=-det;
}
m_MyOutput.Format("T[%d][0]=%lf",l,T[l][0]);
UpdateData(FALSE);
}
double CExpInt::f(double x)
{
returncAnyExp.f(x,cAnyExp);//返回表达式在x处的值
}
【PS】:所谓的任意只是在小编看来是任意罢了,目前我们所常用的函数应该都在此内吧,如有未包含的,请来信指教哦~
人有失足之时嘛,任何软件都不敢保证100%无误,本软件数据的正确性以10多组刁蛮数据作为测试,均正确。若有问题,请来信,不甚感激!
本软件仅供学习交流之用,不得非法商用,否则因软件本身计算有误导致严重后果的,责任自负
MathTool 1.0.zip
http://download.csdn.net/detail/qq316293804/6369469
MathTool 2.0.zip
http://download.csdn.net/detail/qq316293804/6369485