定义抽象基类Shape,由它派生出五个派生类:Circle(圆形)、Square(正方形)、Rectangle( 长方形)、Trapezoid (梯形)和Triangle (三角形),用虚函数分别计算各种图形的面积,输出它们的面积和。要求用基类指针数组,每一个数组元素指向一个派生类的对象。PI=3.14159f,单精度浮点数计算。 输入格式: 输入在一行中,给出9个大于0的数,用空格分隔,分别代表圆的半径,正方形的边长,矩形的宽和高,梯形的上底、下底和高,三角形的底和高。 输出格式: 输出所有图形的面积和,小数点后保留3位有效数字。 输入样例: 12.6 3.5 4.5 8.4 2.0 4.5 3.2 4.5 8.4 输出样例: 578.109用c++完成这道题目
时间: 2024-03-10 12:45:46 浏览: 124
以下是代码实现:
```c++
#include <iostream>
using namespace std;
const float PI = 3.14159f;
class Shape {
public:
virtual float getArea() = 0;
};
class Circle : public Shape {
private:
float radius;
public:
Circle(float r) : radius(r) {}
float getArea() { return PI * radius * radius; }
};
class Square : public Shape {
private:
float side;
public:
Square(float s) : side(s) {}
float getArea() { return side * side; }
};
class Rectangle : public Shape {
private:
float width, height;
public:
Rectangle(float w, float h) : width(w), height(h) {}
float getArea() { return width * height; }
};
class Trapezoid : public Shape {
private:
float top, bottom, height;
public:
Trapezoid(float t, float b, float h) : top(t), bottom(b), height(h) {}
float getArea() { return (top + bottom) * height / 2; }
};
class Triangle : public Shape {
private:
float base, height;
public:
Triangle(float b, float h) : base(b), height(h) {}
float getArea() { return base * height / 2; }
};
int main() {
float radius, side, width, height, top, bottom, triBase, triHeight;
cin >> radius >> side >> width >> height >> top >> bottom >> triBase >> triHeight;
Shape *shapes[5];
shapes[0] = new Circle(radius);
shapes[1] = new Square(side);
shapes[2] = new Rectangle(width, height);
shapes[3] = new Trapezoid(top, bottom, height);
shapes[4] = new Triangle(triBase, triHeight);
float totalArea = 0;
for (int i = 0; i < 5; i++) {
totalArea += shapes[i]->getArea();
}
printf("%.3f", totalArea);
return 0;
}
```
解释:
- 定义了基类 `Shape`,其中有一个纯虚函数 `getArea()`,表示获取图形面积。
- 派生了五个类 `Circle`(圆形)、`Square`(正方形)、`Rectangle`(长方形)、`Trapezoid`(梯形)和 `Triangle`(三角形),并在每个类中实现了 `getArea()` 函数。
- 在 `main` 函数中,定义了一个 `Shape` 类型的指针数组 `shapes`,并将每个派生类的对象的地址存入数组中。
- 遍历 `shapes` 数组,计算每个图形的面积并累加到 `totalArea` 变量中。
- 最后输出 `totalArea`,即所有图形的面积和。注意要保留 3 位小数。
阅读全文