C++、VC、MFC 计算任意函数值、计算表达式、积分、线性方程组

由于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

你可能感兴趣的:(计算表达式,MFC计算任意函数值,MFC计算积分,MFC线性方程组)