定义了一个基类的指针,通过基类操纵派生类,初始化派生类对象。。粤粤大神教我的。。首先需要定义一个抽象函数类,然后派生出需要求得函数。。然后定义一个抽象的求积分的类,然后派生出不同的求函数的类。。其中加入函数作为私有成员。。。。注意()的重载。。方便求函数的值。。。
代码如下:
#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;
}