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

    技术2025-09-23  50

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

    最新回复(0)