hhl987805837 2024-01-02 13:34 采纳率: 66.7%
浏览 20
已结题

图形面积周长的排列和存储

对多种形状进行面积、周长等计算,并按照面积或周长进行排序。
基本要求:
(1) 几何形状需有多种,包括三角形、四边形、弧形等;四边形分正方形、长方形、平行四边形、梯形等;弧形分扇形、圆形、椭圆等。更多形状自行选择加入。
(2) 所有形状提供周长与面积计算方法。
(3) 初始化对形状进行构造时,需判断所提供的参数是否符合具体形状的要求。例如三角形,若以三边长记录该三角形的,三边长是否构成三角形是需要判断的。
(4) 以运算符(operator)的方式,提供不同形状间的面积累加或周长累加。即,任意形状的对象可以加法(+)形式进行计算;另外,重载大于或小于操作符,可实现不同形状间的面积或周长比较。周长还是面积,自行选择。
(5) 将所有形状记录在线性表中,并提供对所有形状的进行排序的功能。采用何种线性表,自行决定。
(6) 形状数据,需在程序退出前存入文件。所存内容各列为:
形状名称/标识,该形状的对象编号,面积,长度
具体列名自行决定。
(3)排序时,其中形状种类不得少于4种;每种具体形状的对象个数不得少5个。如何构造出这么多不同的对象,自行想办法。
(4)所有输入不得采用键盘输入的方式,否则扣分;若需有外部输入的,可通过程序的main参数传入,或从文件读取。

  • 写回答

2条回答 默认 最新

  • K_n_i_g_h_t_1990 2024-01-02 13:41
    关注
    
    // 引入头文件
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <fstream>
    #include <cmath>
    using namespace std;
    
    // 定义一个抽象类 Shape,表示几何形状
    class Shape {
    public:
        // 纯虚函数,计算面积
        virtual double area() = 0;
        // 纯虚函数,计算周长
        virtual double perimeter() = 0;
        // 纯虚函数,输出形状信息
        virtual void print() = 0;
        // 虚析构函数
        virtual ~Shape() {}
    };
    
    // 定义一个派生类 Rectangle,表示矩形
    class Rectangle : public Shape {
    private:
        double length; // 长
        double width; // 宽
    public:
        // 构造函数,初始化长和宽
        Rectangle(double l, double w) : length(l), width(w) {}
        // 重写 area 函数,计算矩形的面积
        double area() override {
            return length * width;
        }
        // 重写 perimeter 函数,计算矩形的周长
        double perimeter() override {
            return 2 * (length + width);
        }
        // 重写 print 函数,输出矩形的信息
        void print() override {
            cout << "Rectangle: length = " << length << ", width = " << width << ", area = " << area() << ", perimeter = " << perimeter() << endl;
        }
    };
    
    // 定义一个派生类 Circle,表示圆形
    class Circle : public Shape {
    private:
        double radius; // 半径
        const double PI = 3.14159; // 圆周率
    public:
        // 构造函数,初始化半径
        Circle(double r) : radius(r) {}
        // 重写 area 函数,计算圆形的面积
        double area() override {
            return PI * radius * radius;
        }
        // 重写 perimeter 函数,计算圆形的周长
        double perimeter() override {
            return 2 * PI * radius;
        }
        // 重写 print 函数,输出圆形的信息
        void print() override {
            cout << "Circle: radius = " << radius << ", area = " << area() << ", perimeter = " << perimeter() << endl;
        }
    };
    
    // 定义一个派生类 Triangle,表示三角形
    class Triangle : public Shape {
    private:
        double a; // 边长 a
        double b; // 边长 b
        double c; // 边长 c
    public:
        // 构造函数,初始化三条边
        Triangle(double x, double y, double z) : a(x), b(y), c(z) {
            // 判断是否能构成三角形,如果不能,抛出异常
            if (a + b <= c || a + c <= b || b + c <= a) {
                throw invalid_argument("Invalid triangle sides!");
            }
        }
        // 重写 area 函数,计算三角形的面积
        double area() override {
            // 使用海伦公式
            double p = (a + b + c) / 2.0; // 半周长
            return sqrt(p * (p - a) * (p - b) * (p - c)); // 面积
        }
        // 重写 perimeter 函数,计算三角形的周长
        double perimeter() override {
            return a + b + c;
        }
        // 重写 print 函数,输出三角形的信息
        void print() override {
            cout << "Triangle: a = " << a << ", b = " << b << ", c = " << c << ", area = " << area() << ", perimeter = " << perimeter() << endl;
        }
    };
    
    // 定义一个运算符重载函数,实现两个形状的面积相加
    double operator+(Shape& s1, Shape& s2) {
        return s1.area() + s2.area();
    }
    
    // 定义一个比较函数,按照面积从小到大排序
    bool compare(Shape* s1, Shape* s2) {
        return s1->area() < s2->area();
    }
    
    // 定义一个函数,将形状的数据写入文件
    void writeToFile(vector<Shape*>& shapes, const string& filename) {
        // 打开文件,如果不存在则创建
        ofstream fout(filename);
        // 判断文件是否打开成功
        if (fout) {
            // 遍历形状的向量
            for (int i = 0; i < shapes.size(); i++) {
                // 获取当前形状的类型
                string type;
                if (dynamic_cast<Rectangle*>(shapes[i])) {
                    type = "Rectangle";
                }
                else if (dynamic_cast<Circle*>(shapes[i])) {
                    type = "Circle";
                }
                else if (dynamic_cast<Triangle*>(shapes[i])) {
                    type = "Triangle";
                }
                // 将形状的类型、编号、面积、周长写入文件,用逗号分隔
                fout << type << "," << i + 1 << "," << shapes[i]->area() << "," << shapes[i]->perimeter() << endl;
            }
            // 关闭文件
            fout.close();
        }
        else {
            // 文件打开失败,输出错误信息
            cerr << "Failed to open file: " << filename << endl;
        }
    }
    
    // 主函数
    int main() {
        // 创建一个形状的向量,用于存储各种形状的指针
        vector<Shape*> shapes;
        // 创建一个矩形对象,长为 3,宽为 4,并将其指针加入向量
        shapes.push_back(new Rectangle(3, 4));
        // 创建一个圆形对象,半径为 5,并将其指针加入向量
        shapes.push_back(new Circle(5));
        // 创建一个三角形对象,三边长为 3,4,5,并将其指针加入向量
        shapes.push_back(new Triangle(3, 4, 5));
        // 输出形状的信息
        cout << "Shapes information:" << endl;
        for (auto s : shapes) {
            s->print();
        }
        // 计算两个形状的面积相加,并输出结果
        cout << "The sum of area of the first and second shape is: " << *shapes[0] + *shapes[1] << endl;
        // 按照面积从小到大对形状进行排序
        sort(shapes.begin(), shapes.end(), compare);
        // 输出排序后的形状信息
        cout << "Shapes information after sorting by area:" << endl;
        for (auto s : shapes) {
            s->print();
        }
        // 将形状的数据写入文件
        writeToFile(shapes, "shapes.txt");
        // 释放形状的内存
        for (auto s : shapes) {
            delete s;
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月10日
  • 已采纳回答 1月2日
  • 修改了问题 1月2日
  • 创建了问题 1月2日

悬赏问题

  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上
  • ¥15 提问一个关于vscode相关的环境配置问题,就是输入中文但是显示不出来,代码在idea可以显示中文,但在vscode不行,不知道怎么配置环境
  • ¥15 netcore使用PuppeteerSharp截图
  • ¥20 这张图页头,页脚具体代码该怎么写?
  • ¥15 关于#sql#的问题,请各位专家解答!
  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂