📅  最后修改于: 2023-12-03 15:42:17.390000             🧑  作者: Mango
本题是一个计算机科学领域的问题,要求程序员掌握C++中的指针和动态内存管理。本题的要求是编写一个C++程序,实现给定的类Point的成员函数。我们需要实现两个函数:
我们会在程序开始时输入一个整数n,表示点的个数,然后依次输入n个点的坐标,你需要将它们存在一个动态分配的Point类型的数组中,然后对这个数组进行排序,并分别输出排序后的结果。
下面是完整的C++代码,包含了Point类的定义、排序函数sort和两个打印函数print_on_x和arrange_on_circle。
#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;
class Point {
private:
int x;
int y;
public:
Point() {}
Point(int _x, int _y) : x(_x), y(_y) {}
int getX() { return x; }
int getY() { return y; }
};
bool cmp_x(Point a, Point b) {
return a.getX() < b.getX();
}
bool cmp_cir(Point a, Point b) {
double angle_a = atan2(a.getY(), a.getX());
double angle_b = atan2(b.getY(), b.getX());
if (angle_a == angle_b) return a.getX() < b.getX();
return angle_a < angle_b;
}
void print_on_x(Point* a, int n) {
sort(a, a + n, cmp_x);
for (int i = 0; i < n; i++) {
cout << a[i].getX() << " " << a[i].getY() << endl;
}
}
void arrange_on_circle(Point* a, int n) {
Point center(0, 0);
sort(a, a + n, cmp_cir);
for (int i = 0; i < n; i++) {
cout << a[i].getX() << " " << a[i].getY() << endl;
}
}
void sort(Point* a, int l, int r, bool (*cmp)(Point, Point)) {
if (l >= r) return;
Point pivot = a[l];
int i = l - 1, j = r + 1;
while (i < j) {
do i++; while (cmp(a[i], pivot));
do j--; while (cmp(pivot, a[j]));
if (i < j) swap(a[i], a[j]);
}
sort(a, l, j, cmp);
sort(a, j + 1, r, cmp);
}
int main() {
int n, x, y;
cin >> n;
Point* a = new Point[n];
for (int i = 0; i < n; i++) {
cin >> x >> y;
Point p(x, y);
a[i] = p;
}
sort(a, 0, n - 1, cmp_x);
print_on_x(a, n);
cout << endl;
arrange_on_circle(a, n);
return 0;
}
使用场景: 可以在需要排序坐标点的应用场景中使用。例如地图上各个标记点需要按照X坐标从小到大排序并且经过圆心时需要按照角度排序。