C++ 几何形体处理程序
题:输入若干个几何形体的参数,要求按面积排序输出。输出时要指明形状。
sample Input:
3
R 3 5
C 9
T 3 4 5
Sample Output:
Triangle:6
Rectangle:15
Circle:254.34
学以致用,封装、继承、多态统统用起来,
解题步骤:
- 创建一个抽象基类 Shape,其中包含纯虚函数 area() 用于计算几何图形的面积,和 getName() 用于获取几何图形的名称。
- 派生三个具体的几何图形类:Rectangle、Circle 和 Triangle,它们分别表示矩形、圆形和三角形。每个类都实现了基类中的纯虚函数, 提供了计算面积和获取名称的具体实现。
- 输入要创建的几何图形的数量 numShapes。使用循环,依次输入每个几何图形的类型和相应的参数。根据图形类型创建相应的对象,并将其指针添加到容器中。
- 使用 sort 函数,按照几何图形的面积对容器中的元素进行排序。排序函数使用 Lambda 表达式,根据面积进行升序或降序排列。
- 遍历排序后的容器,输出每个几何图形的名称和面积。
- 考虑到几何图形的类型不同,所需参数不同,使用vector容器(动态数组) 引入 头文件
- 考虑到最后要排序输出,使用sort() 排序方法,引入 头文件
参考
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
class Shape {
public:
virtual double area() = 0;
virtual string getName() = 0;
};
class Rectangle : public Shape {
public:
Rectangle(double length, double width) : length(length), width(width) {}
double area(){ return length * width; }
string getName(){ return "Rectangle"; }
private:
double length;
double width;
};
class Circle : public Shape {
public:
Circle(double radius) : radius(radius) {}
double area(){ return 3.14 * radius * radius; }
string getName(){ return "Circle"; }
private:
double radius;
};
class Triangle : public Shape {
public:
Triangle(double a, double b, double c) : a(a), b(b), c(c) {}
double area(){
double s = (a + b + c) / 2;
return sqrt(s * (s - a) * (s - b) * (s - c));
}
string getName(){ return "Triangle"; }
private:
double a, b, c;
};
int main() {
vector<Shape*> shapes; // 声明容器<Shape*> shapes
int numShapes; // 几何图形数量
int numParams; // 几何图形相对应的参数数量
// 输入 几何图形 数量
cin >> numShapes;
for (int i = 0; i < numShapes; ++i) {
vector<double> params; // 声明容器<double> params
Shape* shape = nullptr; // 几何图形(临时变量)
double param; // 几何图形参数
char type; // 几何图形类型
// 输入 几何图形 类型
cin >> type;
// 根据几何图形类型 赋值相对应的参数数量
switch(type){
case 'T': numParams = 3;
break;
case 'R': numParams = 2;
break;
case 'C': numParams = 1;
break;
}
// 输入 几何图形 参数
for (int j = 0; j < numParams; ++j) {
cin >> param;
params.push_back(param);
}
// 根据几何图形类型 赋值相对应派生类
switch(type){
case 'T': shape= new Triangle(params[0], params[1], params[2]);
break;
case 'R': shape= new Rectangle(params[0], params[1]);
break;
case 'C': shape= new Circle(params[0]);
break;
default: break;
}
// 非空判断
if (shape != nullptr) {
shapes.push_back(shape);
}
}
// 自定义排序方法
// "<" : 升序
// ">" : 降序
sort(shapes.begin(), shapes.end(), [](Shape* a, Shape* b) {
return a->area() < b->area();
});
// 输出结果
for (const auto& shape : shapes) {
cout << shape->getName() << ": " << shape->area() << std::endl;
}
return 0;
}