题目描述
请编写程序,从图形数组中找出最大面积。基类框架如下所示:
class Geometry{
public:
virtual double getArea()=0; //计算面积,结果保留小数点后两位
};
以Geometry为基类,构建出Rect(矩形,数据成员为长和宽)和Circle(圆,数据成员为半径)两个类,重写getArea()方法,其他方法根据需要自拟。
写一个TotalArea类,该类结构如下:
class TotalArea{
public:
static void computerMaxArea(Geometry** t,int n);//t为基类二级指针,指向一个基类动态数组,数组的每个元素指向一个子类图形,n为数组的大小
};
生成上述四个类并编写主函数,结果保留两位小数。
输入
第一行表示测试次数。从第二行开始,每个测试用例占一行,每行数据意义如下:图形类型(1为Rect(矩形),2为Circle(圆))、基本信息(Rect是长和宽,Circle是半径)。
输出
最大图形的面积
IO模式
本题IO模式为标准输入/输出(Standard IO),你需要从标准输入流中读入数据,并将答案输出至标准输出流中。
//
输入样例:
3
1 3 4
2 5
2 6
输出样例:
最大面积=113.04
AC代码:
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
class Geometry {
public:
virtual double getArea() = 0;
};
class Rect : public Geometry {
private:
double length;
double width;
public:
Rect(double l, double w) : length(l), width(w) {}
virtual double getArea() {
return length * width;
}
};
// 圆形类
class Circle : public Geometry {
private:
double radius; // 半径
public:
Circle(double r) : radius(r) {}
virtual double getArea() {
return 3.14 * radius * radius;
}
};
class TotalArea {
public:
static void computerMaxArea(Geometry** t, int n) {
double maxArea = 0;
for (int i = 0; i < n; ++i) {
double area = t[i]->getArea();
if (area > maxArea) {
maxArea = area;
}
}
cout << "最大面积="<< fixed << setprecision(2) << maxArea << endl;
}
};
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int test_cases;
cin >> test_cases;
Geometry** shapes = new Geometry*[test_cases];//创造空间
for (int i = 0; i < test_cases; ++i) {
int type;
cin >> type;
if (type == 1) {
double l, w;
cin >> l >> w;
shapes[i] = new Rect(l, w);//可以这样赋值
} else if (type == 2) {
double r;
cin >> r;
shapes[i] = new Circle(r);
}
}
TotalArea::computerMaxArea(shapes, test_cases);
// 清理内存
for (int i = 0; i < test_cases; ++i) {
delete shapes[i];
}
return 0;
}