[C++/PTA] 计算正方体、圆柱体的表面积、体积

简介: [C++/PTA] 计算正方体、圆柱体的表面积、体积

题目要求

立方体、圆柱体抽象出一个公共基类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

解题思路

主要思路:

  1. 定义抽象类 Container,包含纯虚函数 area 和 volume,以及静态成员函数 sumofarea 和 sumofvolume。
  2. 定义 Cube 类和 Cylinder 类,它们分别继承自 Container,实现其所有纯虚函数。
  3. 在主函数中使用 new 运算符生成若干个容器对象,并将它们存储到基类指针数组 pShapes[] 中。通过输入的对象类型来判断需要生成 Cube 对象还是 Cylinder 对象。
  4. 调用 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;
}

总结

该题考察继承多态的知识点,包括抽象类、纯虚函数、静态成员变量和函数、基类指针和动态内存分配等。

同时也涉及了控制台格式化输出等基础知识点。

我是秋说,我们下次见。

目录
相关文章
|
3月前
|
C++
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
47 0
|
5月前
|
安全 编译器 C++
C++一分钟之-编译时计算:constexpr与模板元编程
【6月更文挑战第28天】在C++中,`constexpr`和模板元编程用于编译时计算,提升性能和类型安全。`constexpr`指示编译器在编译时计算函数或对象,而模板元编程通过模板生成类型依赖代码。常见问题包括误解constexpr函数限制和模板递归深度。解决策略包括理解规则、编写清晰代码、测试验证和适度使用。通过实战示例展示了如何使用`constexpr`计算阶乘和模板元编程计算平方。
92 13
|
5月前
|
存储 C++
【PTA】L1-039 古风排版(C++)
【PTA】L1-039 古风排版(C++)
38 1
|
3月前
|
C++
C++ PCL 计算多个RT矩阵变换后的变换矩阵
C++ PCL 计算多个RT矩阵变换后的变换矩阵
48 0
|
3月前
|
C++
C++代码来计算一个点围绕另一个点旋转45度后的坐标
C++代码来计算一个点围绕另一个点旋转45度后的坐标
80 0
|
4月前
|
机器学习/深度学习 算法 C++
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
|
4月前
|
C++ 开发者
C++一分钟之-编译时计算:constexpr与模板元编程
【7月更文挑战第2天】C++的`constexpr`和模板元编程(TMP)实现了编译时计算,增强代码效率。`constexpr`用于声明编译时常量表达式,适用于数组大小等。模板元编程则利用模板进行复杂计算。常见问题包括编译时间过长、可读性差。避免方法包括限制TMP使用,保持代码清晰。结合两者可以解决复杂问题,但需明确各自适用场景。正确使用能提升代码性能,但需平衡复杂性和编译成本。
130 3
|
5月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
5月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
5月前
|
存储 人工智能 C++
【PTA】L1-064 估值一亿的AI核心代码(详C++)
【PTA】L1-064 估值一亿的AI核心代码(详C++)
38 1