对多种形状进行面积、周长等计算,并按照面积或周长进行排序。
基本要求:
(1) 几何形状需有多种,包括三角形、四边形、弧形等;四边形分正方形、长方形、平行四边形、梯形等;弧形分扇形、圆形、椭圆等。更多形状自行选择加入。
(2) 所有形状提供周长与面积计算方法。
(3) 初始化对形状进行构造时,需判断所提供的参数是否符合具体形状的要求。例如三角形,若以三边长记录该三角形的,三边长是否构成三角形是需要判断的。
(4) 以运算符(operator)的方式,提供不同形状间的面积累加或周长累加。即,任意形状的对象可以加法(+)形式进行计算;另外,重载大于或小于操作符,可实现不同形状间的面积或周长比较。周长还是面积,自行选择。
(5) 将所有形状记录在线性表中,并提供对所有形状的进行排序的功能。采用何种线性表,自行决定。
(6) 形状数据,需在程序退出前存入文件。所存内容各列为:
形状名称/标识,该形状的对象编号,面积,长度
具体列名自行决定。
(3)排序时,其中形状种类不得少于4种;每种具体形状的对象个数不得少5个。如何构造出这么多不同的对象,自行想办法。
(4)所有输入不得采用键盘输入的方式,否则扣分;若需有外部输入的,可通过程序的main参数传入,或从文件读取。
![](https://profile-avatar.csdnimg.cn/default.jpg!4)
图形面积周长的排列和存储
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 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三个简单题 不用太复杂