qfedu-cpp-level/day6/homework/h7.cpp

93 lines
1.9 KiB
C++
Raw Normal View History

2023-08-01 09:07:49 +08:00
// 继第6题 基于多态方式定义一个全局函数排序函数接收Shape类的数组并按形状的周长进行从大到少排序。
// 【提示】全局函数排序函数 void sort(Shape *arr, int size)
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
class Shape
{
public:
// 用于计算形状的周长
virtual double perimeter() = 0;
};
class Triangle : public Shape
{
private:
double a, b, c;
public:
Triangle(double a, double b, double c) : a(a), b(b), c(c) {}
public:
double perimeter()
{
return a + b + c;
}
};
class Square : public Shape
{
private:
double a;
public:
Square(double a) : a(a) {}
public:
double perimeter()
{
return 4 * a;
}
};
void sort(Shape *arr[], int size) // 这里为什么传指针数组?因为 Shape 是抽象类,不能实例化对象,只能通过指针来操作
{
for (int i = 0; i < size - 1; i++)
{
for (int j = 0; j < size - i - 1; j++)
{
// 比较形状的周长
if (arr[j]->perimeter() < arr[j + 1]->perimeter())
{
// 交换位置
swap(arr[j], arr[j + 1]);
}
}
}
}
int main()
{
Shape *p = new Triangle(3, 4, 5);
Shape *q = new Square(5);
Shape *r = new Triangle(6, 8, 10);
Shape *s = new Square(10);
Shape *t = new Triangle(5, 12, 13);
Shape *u = new Square(13);
// Shape *arr[6];
// arr[0] = p;
// arr[1] = q;
Shape *arr[] = {p, q, r, s, t, u}; // arr作为一个指针数组存了6个指向 Shape 类对象的指针
int len = sizeof(arr) / sizeof(arr[0]);
cout << "排序前:" << endl;
for (int i = 0; i < len; i++)
{
cout << arr[i]->perimeter() << endl;
}
sort(arr, len);
cout << "排序后:" << endl;
for (int i = 0; i < len; i++)
{
cout << arr[i]->perimeter() << endl;
}
return 0;
}