首页 > 代码库 > 定积分解法

定积分解法

定义了一个基类的指针,通过基类操纵派生类,初始化派生类对象。。粤粤大神教我的。。首先需要定义一个抽象函数类,然后派生出需要求得函数。。然后定义一个抽象的求积分的类,然后派生出不同的求函数的类。。其中加入函数作为私有成员。。。。注意()的重载。。方便求函数的值。。。

代码如下:

#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;

void menu1()   //  选择积分函数功能菜单
{
	    cout<<"            请  选  择 被 积 函 数"<<endl;
		cout<<"\n           1.  求 y=log(1.0+x)/(1.0+x*x)的 积 分\n";
        cout<<"\n           2.  求 y=x*x 的 积 分   \n";
		cout<<"\n           3.  求 y=2*x 的 积 分\n";
		cout<<"\n           0.  退 出\n";
}

void menu2()   //  选择积分方法功能菜单
{
        cout<<"\n               请  选 择 积 分 方 法"<<endl;
		cout<<"\n           1.  用 梯 形 法 求 积 分\n";
        cout<<"\n           2.  用 矩 形 法 求 积 分\n";
		cout<<"\n           3.  用 辛 普 生 法 求 积 分\n";
		cout<<"\n           4.  用 变 步 长 梯 形 法 求 积 分\n";
		cout<<"\n           0.  返 回 上 级 菜 单\n";
}

class Function
{
public:
    virtual double operator()(double x)=0;
    virtual ~Function(){}
};

class  Myfunction1:public Function
{
public:
    virtual double operator()(double x)
    {
        return log(1.0+x)/(1.0+x*x);
    }
};

class  Myfunction2:public Function
{
public:
    virtual double operator()(double x)
    {
        return x*x;
    }
};

class  Myfunction3:public Function
{
public:
    virtual double operator()(double x)
    {
        return 2*x;
    }
};


class Integration
{
public:
    virtual double operator()(double a,double b,double eps)=0;
    virtual  ~Integration(){}
};

class Trapz1:public Integration
{
private:
    Function &f;
public:
    Trapz1(Function &fun):f(fun){}
    virtual double operator()(double a,double b,double eps)
    {
        int n=200;
        double h=(b-a)/n;
        double sum=0,tmp;
        for(int i=1;i<n;i++)
        {
            tmp=2*f(a+i*h);
            sum+=tmp;
        }
        sum=(sum+f(a)+f(b))*h/2;
        return sum;
    }

};//梯形法求积分

class Trapz2:public Integration
{
private:
    Function &f;
public:
    Trapz2(Function &fun):f(fun){}
    virtual double operator()(double a,double b,double eps)
    {
        bool done=false;
        int n=1;
        double h=(b-a);
        double tn=h*(f(a)+f(b))/2;
        double t2n;
        do
        {
            double sum=0;
            for(int k=0;k<n;k++)
            {
                double  x=a+(k+0.5)*h;
                sum+=f(x);
            }
            t2n=(tn+h*sum)/2.0;
            if(fabs(tn-t2n)<eps)
                done=true;
            else
            {
                n=n*2;
                h=h/2;
                tn=t2n;
            }
        }while(!done);
    return t2n;
    }
};//变步长球积分

class Simpson:public Integration
{
private:
    Function &f;
public:
    Simpson(Function &fun):f(fun){}
    virtual double operator()(double a,double b,double eps)
    {
        int n=400;
        double h=(b-a)/(2*n);
        double sum=0;
        for(int i=1;i<=(2*n-1);i=i+2)
        {
            double tmp=4*f(a+i*h);
            sum=sum+tmp;
        }
        for(int i=2;i<=(2*n-2);i=i+2)
        {
            double tmp=2*f(a+i*h);
            sum=sum+tmp;
        }
        sum=(sum+f(a)+f(b))*h/3;
        return sum;
    }
};//辛普生法求积分

class Rectangle:public Integration
{
private:
    Function &f;
public:
    Rectangle(Function &fun):f(fun){}
    virtual double operator()(double a,double b,double eps)
    {
        double sum=0;
        int n=400;
        double h=(b-a)/n;
        for(int i=1;i<n;i++)
        {
            double tmp=h*f(a+i*h+h/2);
            sum=sum+tmp;
        }
        return sum;
    }
};//矩形法求积分
Function *f;
int main()
{
    int choose1,choose2;
	int  flag=1;
    while (flag)
	{
		system("cls");
    	menu1();
        cin>>choose1;
		system("cls");
		int flag1=1;
		switch(choose1)
		{
			case 1:
			    f=new Myfunction1;
			     while(flag1)
				{
					menu2();
					cin>>choose2;
					switch(choose2)
					{
				    case 1:
                       {
                        Trapz1 trapz1(*f);
                        cout<<trapz1(0,2,1e-7);
                       }
						break;
					case 2:
                        {
                        Rectangle rectangle(*f);
                        cout<<rectangle(0,2,1e-7);
                        }
						break;
					case 3:
                       {
                        Simpson  simpson(*f);
                        cout<<simpson(0,2,1e-7);
                       }
						break;
					case 4:
                       {
                        Trapz2 trapz2(*f);
                        cout<<trapz2(0,2,1e-7);
                       }
						break;
					case 0:
						flag1=0;break;
					default: cout<<"\n    Wrong Selection !(选择错误,重选)\n";

					}
				}//end of while(flag1)
			    break;
			case 2:
			      f=new Myfunction2;
			      while(flag1)
				{
					menu2();
					cin>>choose2;
					switch(choose2)
					{
				    case 1:
                       {
                        Trapz1 trapz1(*f);
                        cout<<trapz1(0,2,1e-7);
                       }
						break;
					case 2:
                        {
                        Rectangle rectangle(*f);
                        cout<<rectangle(0,2,1e-7);
                        }
						break;
					case 3:
                       {
                        Simpson  simpson(*f);
                        cout<<simpson(0,2,1e-7);
                       }
						break;
					case 4:
                       {
                        Trapz2 trapz2(*f);
                        cout<<trapz2(0,2,1e-7);
                       }
						break;
					case 0:
						flag1=0;break;
					default: cout<<"\n    Wrong Selection !(选择错误,重选)\n";

					}
				}//end of while(flag1)
			    break;
			case 3:
			      f=new Myfunction3;
			      while(flag1)
				{
					menu2();
					cin>>choose2;
					switch(choose2)
					{
				    case 1:
                       {
                        Trapz1 trapz1(*f);
                        cout<<trapz1(0,2,1e-7);
                       }
						break;
					case 2:
                        {
                        Rectangle rectangle(*f);
                        cout<<rectangle(0,2,1e-7);
                        }
						break;
					case 3:
                       {
                        Simpson  simpson(*f);
                        cout<<simpson(0,2,1e-7);
                       }
						break;
					case 4:
                       {
                        Trapz2 trapz2(*f);
                        cout<<trapz2(0,2,1e-7);
                       }
						break;
					case 0:
						flag1=0;break;
					default: cout<<"\n    Wrong Selection !(选择错误,重选)\n";

					}
				}//end of while(flag1)
			    break;
            case 4:
			       flag=0;
				   cout<<"\n     *** The End! ***\n";
				   break;
		    default: cout<<"\n    Wrong Selection !(选择错误,重选)\n";system("pause");
		}
	 }
	 return 0;
}