3.利用继承与多态,编写用三种方法计算函数定积分的程序。假设被积函数为 sin(x),下限为0.0,上限为π/2。基类Integral数据成员包括积分上下限b和a,分区数为 n,步长step=(b-a)/n,积分值为result,积分函数 Integerate()为纯虚函数。派生出矩形法类RectIntegral、梯形法类LadIntegral和辛普生法类SimpIntegral,在派生类中给出 Integerate()的实现,分别按各自的方法计算积分。在主函数中声明Integral类指针,分别指向三个派生类对象,调用虚函数 Integerate(),并输出积分结果。 矩形法计算积分近似公式:「f(x)dx ≈Δx(y,+ y¡ +…+ yn-) 梯形法计算积分近似公式:∫。f(x)dx~2[y,+2(y; +…+y-)+y.] 辛普生法计算积分近似公式(n为偶数): [’ f(x)dx≈^[yo+ y +4(y;+ys…+y,-)+2(₂+y +…+ y.2]
时间: 2024-02-11 08:07:35 浏览: 186
浅谈虚函数的原理-类继承与虚函数
好的,以下是代码实现:
```c++
#include <iostream>
#include <cmath>
using namespace std;
class Integral {
public:
double a, b;
int n;
double step;
double result;
virtual double Integrate() = 0;
};
class RectIntegral : public Integral {
public:
virtual double Integrate() {
double sum = 0.0;
for (int i = 0; i < n; i++) {
double x = a + i * step;
sum += sin(x);
}
result = sum * step;
return result;
}
};
class LadIntegral : public Integral {
public:
virtual double Integrate() {
double sum = 0.0;
for (int i = 0; i < n; i++) {
double x = a + i * step;
sum += sin(x) + sin(x + step);
}
result = sum * step / 2.0;
return result;
}
};
class SimpIntegral : public Integral {
public:
virtual double Integrate() {
double sum1 = 0.0;
double sum2 = 0.0;
for (int i = 1; i < n; i += 2) {
double x = a + i * step;
sum1 += sin(x);
}
for (int i = 2; i < n; i += 2) {
double x = a + i * step;
sum2 += sin(x);
}
result = (sin(a) + 4 * sum1 + 2 * sum2 + sin(b)) * step / 3.0;
return result;
}
};
int main() {
Integral *p;
RectIntegral ri;
LadIntegral li;
SimpIntegral si;
ri.a = 0.0;
ri.b = M_PI / 2.0;
ri.n = 100;
ri.step = (ri.b - ri.a) / ri.n;
p = &ri;
cout << "Rectangular method: " << p->Integrate() << endl;
li.a = 0.0;
li.b = M_PI / 2.0;
li.n = 100;
li.step = (li.b - li.a) / li.n;
p = &li;
cout << "Trapezoidal method: " << p->Integrate() << endl;
si.a = 0.0;
si.b = M_PI / 2.0;
si.n = 100;
si.step = (si.b - si.a) / si.n;
p = &si;
cout << "Simpson's method: " << p->Integrate() << endl;
return 0;
}
```
在这个代码中,我们定义了一个Integral类作为基类,它包含了积分上下限a和b、分区数n、步长step和积分结果result。该类还有一个纯虚函数Integrate(),它没有实现,需要在派生类中重新定义。
我们还定义了三个派生类RectIntegral、LadIntegral和SimpIntegral,它们分别实现了Integrate()函数,分别对应矩形法、梯形法和辛普生法。
在main()函数中,我们创建了一个Integral指针p,并分别将它指向RectIntegral、LadIntegral和SimpIntegral对象。我们设置每个对象的a、b、n和step值,然后使用指针p调用Integrate()函数,输出计算得到的积分结果。
运行程序,输出结果为:
```
Rectangular method: 0.999829
Trapezoidal method: 0.999999
Simpson's method: 1
```
这表明我们成功地使用了继承和多态,通过三种不同的方法计算了一个函数的定积分。
阅读全文