[C++/PTA] 多边形周长计算(继承)

[C++/PTA] 多边形周长计算(继承)

题目要求

给出下面的多边形基类框架:

class polygon

{ protected:

   int number;//边数,最多不超过100条边

private:

   int side_length[100];//边长数组

public:

   polygon();//构造函数根据需要重载
   int perimeter();//计算多边形边长
   void display();//输出多边形边数和周长

}

建立一个派生类rectangle(矩形),增加以下数据成员:

  int height;
  int width;

增加以下成员函数:

 rectangle类的无参和参数化构造函数
 int perimeter();//计算矩形边长
 void display();//输出多边形边数和周长

建立一个派生类equal_polygon(等边多边形),增加以下数据成员:

  int side_len;

增加以下成员函数:

 equal_polygon类的无参和参数化构造函数
 int perimeter();//计算等边多边形边长
 void display();//输出多边形边数和周长

生成上述类并编写主函数,根据输入的多边形信息,相应建立一个多边形类对象或矩形类对象或等边多边形类对象,计算每一个多边形的周长并且输出其边数和周长。

输入格式: 测试输入包含一个测试用例,该测试用例的第一行输入多边形的个数n,接下来n行每一行给出一个多边形的基本信息,每行的第一个数字为当前多边形的类型,0为一般多边形,后面跟随m个数字为m条边的边长,-1为一般多边形边长输入结束标志,1为矩形,后面跟随两个数字,分别为height和width,2为等边多边形,后面跟随两个数字为等边多边形的边数和边长。

输入样例:
3
0 32 54 76 88 24 -1
1 32 54
2 3 32

输出样例:
5 274
4 172
3 96

解题思路

实现了一个多边形类及其两个派生类——矩形和等边多边形。

其中,多边形类包含边数、边长数组这两个数据成员,以及计算多边形周长和输出多边形信息的成员函数。

矩形类继承了多边形类,并添加了高度和宽度两个数据成员和计算矩形周长的成员函数。

等边多边形类同样继承了多边形类,并添加了边长和计算等边多边形周长的成员函数。

在main函数中,首先读入多边形个数n,之后根据输入的字符ch,判断要创建的对象类型:

  • 如果ch=0,读入该多边形的边数和各边长度,并创建一个多边形对象进行周长计算和输出;
  • 如果ch=1,读入矩形的高度和宽度,并创建一个矩形对象进行周长计算和输出;
  • 如果ch=2,读入等边多边形的边数和边长,并创建一个等边多边形对象进行周长计算和输出。循环n次后结束程序。

代码

#include<iostream>
using namespace std;

// 定义一个多边形类
class polygon {
protected:
    int number; // 边数,最多不超过100条边
private:
    int side_length[10]; // 边长数组,最多存储10条边的长度
public:
    polygon() {
        number = 0;
        for (int i = 0; i < 100; i++) {
            side_length[i] = 0;
        }
    }

    // 重载构造函数,初始化边数
    polygon(int Number) {
        number = Number;
    }

    // 设置多边形各边的长度
    void setside(int side[]) { 
        for (int i = 0; i < number; i++) {
            side_length[i] = side[i];
        }
    }

    // 计算多边形周长
    int perimeter() {
        int circum = 0;
        for (int i = 0; i < number; i++) {
            circum += side_length[i];
        }
        return circum;
    }

    // 输出多边形边数和周长
    void display() {
        cout << number << " " << perimeter() << endl;
    }
};

// 定义一个矩形类,继承自多边形类
class rectangle : public polygon {
private:
    int height; // 矩形高度
    int width;  // 矩形宽度
public:
    rectangle() {
        height = 0;
        width = 0;
    }

    // 重载构造函数,初始化边数、高度和宽度
    rectangle(int number, int a, int b) :polygon(number) {
        height = a;
        width = b;
    }

    // 计算矩形周长
    int perimeter1() {
        int circum = 0;
        circum = 2 * (height + width);
        return circum;
    }

    // 输出矩形边数和周长
    void display1() {
        cout << "4 " << perimeter1() << endl;
    }
};

// 定义一个等边多边形类,继承自多边形类
class equal_polygon : public polygon {
private:
    int side_len; // 等边多边形的边长
public:
    equal_polygon() {
        side_len = 0;
    }

    // 重载构造函数,初始化边数和边长
    equal_polygon(int number, int side) :polygon(number) {
        side_len = side;
    }

    // 计算等边多边形周长
    int perimeter2() {
        int circum = 0;
        circum = side_len * number;
        return circum;
    }

    // 输出等边多边形边数和周长
    void display2() {
        cout << number << " " << perimeter2() << endl;
    }
};

int main() {
    int n;
    cin >> n; // 输入多边形个数

    // 循环读入每个多边形的信息
    for (int i = 0; i < n; i++) {
        int ch;
        cin >> ch; // 输入多边形类型

        if (ch == 0) { // 多边形
            int a[100];
            int j = 0;
            while (cin >> a[j] && (a[j] != -1)) {
                j++; // 读入多边形各边的长度
            }
            polygon p1(j);
            p1.setside(a);
            p1.perimeter();
            p1.display();
        }
        else if (ch == 1) { // 矩形
            int a, b;
            cin >> a >> b; // 输入矩形的高度和宽度
            rectangle p2(4, a, b);
            p2.perimeter1();
            p2.display1();
        }
        else if (ch == 2) { // 等边多边形
            int number, side;
            cin >> number >> side; // 输入等边多边形的边数和边长
            equal_polygon p3(number, side);
            p3.perimeter2();
            p3.display2();
        }
    }

    return 0;
}

总结

该题考察类的构造函数成员函数的使用循环语句的运用等知识点,读者可躬身实践。
我是秋说,我们下次见。

posted @ 2023-05-30 18:39  秋说  阅读(79)  评论(0编辑  收藏  举报  来源