题目要求
从立方体、圆柱体抽象出一个公共基类Container,定义抽象类Container,模拟实现一个容器类层次结构,在主函数进行多态机制测试。各派生类要求实现基类的所有纯虚函数。
抽象类class Container {
protected:
static double pi;
public:
virtual double area()=0; //纯虚函数,计算对象的表面积
virtual double volume()=0; //纯虚函数,计算对象的体积
static double sumofarea(Container *c[],int n) ; //静态成员函数,计算所有对象的面积之和
static double sumofvolume(Container *c[],int n); //静态成员函数,计算所有对象的体积之和
};
double Container::pi=3.1415926;
Cube类、Cylinder类均继承抽象类Container。
Cube类(属性:边长double类型)、Cylinder类(属性:底圆半径、高,double类型)。
在主函数用new运算符生成若干容器类的堆对象,定义基类指针数组,其元素分别指向不同容器类对象,实现多态的异质数组,通过调用Container::sumofarea、Container::sumofvolume计算所有容器对象的表面积之和、体积之和 。
输入格式:
第一行n表示对象个数,对象类型用cube、cylinder区分,cube表示立方体对象,后面输入边长,cylinder表示圆柱体对象,后面是底圆半径、高。
输出格式:
分别输出所有容器对象的表面积之和、体积之和,结果保留小数点后2位。
输入样例:
在这里给出一组输入。例如:
4
cube
15.7
cylinder
23.5 100
cube
46.8
cylinder
17.5 200
输出样例:
在这里给出相应的输出。例如:
56771.13
472290.12
解题思路
主要思路:
-
定义抽象类 Container,包含纯虚函数 area 和 volume,以及静态成员函数 sumofarea 和 sumofvolume。
-
定义 Cube 类和 Cylinder 类,它们分别继承自 Container,实现其所有纯虚函数。
-
在主函数中使用 new 运算符生成若干个容器对象,并将它们存储到基类指针数组 pShapes[] 中。通过输入的对象类型来判断需要生成 Cube 对象还是 Cylinder 对象。
-
调用 Container 类的静态成员函数 sumofarea 和 sumofvolume 分别计算所以对象的表面积和体积之和。
代码
#include <iostream>
#include <iomanip> //用于控制输出格式
using namespace std;
class Container {
protected:
static double pi; //静态成员变量,表示π
public:
virtual double area() = 0; //纯虚函数,计算对象的表面积
virtual double volume() = 0; //纯虚函数,计算对象的体积
static double sumofarea(Container *c[], int n); //静态成员函数,计算所有对象的面积之和
static double sumofvolume(Container *c[], int n); //静态成员函数,计算所有对象的体积之和
};
double Container::pi = 3.1415926;
Container *pShapes[100]; //定义基类指针数组
//Cube 类
class Cube : public Container {
public:
double lenth; //边长
double area() { return lenth * lenth * 6; } //重载 area 函数,计算立方体的表面积
double volume() { return lenth * lenth * lenth; } //重载 volume 函数,计算立方体的体积
};
//Cylinder 类
class Cylinder : public Container {
public:
double round, height; //底圆半径和高
double area() { return 2 * pi * round * height + 2 * pi * round * round; } //重载 area 函数,计算圆柱体的表面积
double volume() { return pi * round * round * height; } //重载 volume 函数,计算圆柱体的体积
};
//计算所有对象的面积之和
double Container::sumofarea(Container *c[], int n) {
int i;
double sum = 0;
for (i = 0; i < n; i++) {
sum += c[i]->area();
}
cout << fixed << setprecision(2) << sum << endl; //保留小数点后两位输出
return sum;
}
//计算所有对象的体积之和
double Container::sumofvolume(Container *c[], int n) {
int i;
double sum = 0;
for (i = 0; i < n; i++) {
sum += c[i]->volume();
}
cout << fixed << setprecision(2) << sum << endl; //保留小数点后两位输出
return sum;
}
int main() {
Cube *pbe;
Cylinder *per;
int n, i;
cin >> n;
for (i = 0; i < n; i++) {
string c;
cin >> c;
if (c == "cube") {
pbe = new Cube();
cin >> pbe->lenth;
pShapes[i] = pbe; //将生成的立方体指针存储到基类指针数组中
}
if (c == "cylinder") {
per = new Cylinder();
cin >> per->round >> per->height;
pShapes[i] = per; //将生成的圆柱体指针存储到基类指针数组中
}
}
Container::sumofarea(pShapes, n);
//调用静态成员函数计算所有对象的表面积之和
Container::sumofvolume(pShapes, n);
//调用静态成员函数计算所有对象的体积之和
return 0;
}
总结
该题考察继承
和多态
的知识点,包括抽象类、纯虚函数、静态成员变量和函数、基类指针和动态内存分配等。
同时也涉及了控制台格式化输出等基础知识点。
我是秋说,我们下次见。
标签:正方体,表面积,Container,函数,对象,double,C++,PTA,计算 From: https://www.cnblogs.com/qiushuo/p/17481201.html