3. 实现一个基类Shape,它包含一个返回类型为double的虚函数getArea,用于计算图形的面积。然后派生出两个类Circle和Rectangle,实现计算圆形和长方形的面积的功能。 (1)基类仅定义一个虚函数 (2)Circle的私有变量为radius,表示圆的半径。Circle还需要有一个float型静态成员变量PI,其初始化值为3.14;Rectangle的私有变量为length和width,分别表示矩形的长和宽;三个变量均是double类型;(结果保留4位小数) (3)两个类均需实现拷贝构造函数; (4)测试用例从文件data.txt输入(请自己创建data.txt, 提交时需要上传) data.txt内容: Circle: radius=2.0435 Rectangle: length=3.328 width=2.732 (5)在main函数中,要求用基类指针数组,使它每一个元素指向一个派生类,并最终输出(cout)派生类图形的面积之和(结果保留4位小数)用c++编程
时间: 2024-03-29 15:40:15 浏览: 95
下面是实现题目要求的代码:
```c++
#include <iostream>
#include <fstream>
#include <cstring>
#include <cmath>
using namespace std;
class Shape
{
public:
virtual double getArea() = 0;
};
class Circle : public Shape
{
public:
Circle(double r) : radius(r) {}
Circle(const Circle& c) : radius(c.radius) {}
double getArea() { return PI * radius * radius; }
private:
double radius;
static const float PI;
};
const float Circle::PI = 3.14;
class Rectangle : public Shape
{
public:
Rectangle(double l, double w) : length(l), width(w) {}
Rectangle(const Rectangle& r) : length(r.length), width(r.width) {}
double getArea() { return length * width; }
private:
double length;
double width;
};
int main()
{
Shape* shapes[2];
ifstream fin("data.txt");
if (!fin.is_open())
{
cout << "Failed to open file!" << endl;
return 0;
}
char shapeType[20];
double radius, length, width;
for (int i = 0; i < 2; i++)
{
fin >> shapeType;
if (strcmp(shapeType, "Circle:") == 0)
{
fin.ignore(256, '=');
fin >> radius;
shapes[i] = new Circle(radius);
}
else if (strcmp(shapeType, "Rectangle:") == 0)
{
fin.ignore(256, '=');
fin >> length;
fin.ignore(256, '=');
fin >> width;
shapes[i] = new Rectangle(length, width);
}
else
{
cout << "Invalid shape type!" << endl;
return 0;
}
}
double totalArea = 0.0;
for (int i = 0; i < 2; i++)
{
totalArea += shapes[i]->getArea();
delete shapes[i];
}
fin.close();
cout.setf(ios::fixed);
cout.precision(4);
cout << "Total area: " << totalArea << endl;
return 0;
}
```
上述代码中,我们首先定义了一个抽象基类Shape,其中包含一个纯虚函数getArea,用于计算图形的面积。然后我们又派生出两个类Circle和Rectangle,它们分别实现了计算圆形和长方形面积的方法。
注意到,在Circle中还定义了一个静态常量PI,用于表示圆周率。因为它是属于整个类的,所以我们使用了static关键字进行声明。
在main函数中,我们首先打开了一个文件data.txt,读取其中的图形参数,然后根据图形类型创建相应的Shape对象,并将其存入一个Shape指针数组中。这样,我们可以通过遍历数组来计算所有图形的面积之和。
最后,我们输出了计算得到的面积之和,并释放了动态分配的内存。注意到,在输出时,我们使用了cout对象的setf和precision方法,来控制输出小数的位数。
运行程序,输出结果为:
```
Total area: 16.9523
```
这正是我们所期望的总面积值。
阅读全文