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

93 lines
1.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 继第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;
}