#include<iostream> using namespace std; typedef struct Point { int x, y; }P; P points[100]; int flag[100] = { 0 }; //排列算法 bool sortP(P p1, P p2) { if (p1.x == p2.x) return p1.y > p2.y; else return p1.x > p2.x; } int S(P p1, P p2, P p) { return 0.5 * ((p1.x * p2.y - p2.x * p1.y) + (p2.x * p.y - p.x * p2.y) + (p.x * p1.y - p1.x * p.y)); } P hull(P p,int mode) { int finalP[100]; if (sizeof(p) <= 2) { for (int i = 0; i < sizeof(p); i++) { flag[i] = 1; } for (int i = 0; i < sizeof(p); i++) { if (flag[i] = 1) { for (int j = 0; j < sizeof(finalP); j++) { finalP[j] = p[i]; } } } } }哪里出错了
时间: 2024-03-17 14:45:44 浏览: 55
使用include <iostream>时一定要加using namespace std
在这段代码中,有几个问题:
1. `sizeof` 是求类型或变量的大小,而不是求数组的长度。所以在这里 `sizeof(p)` 的结果永远都是 `sizeof(Point)`,而不是数组的长度。应该使用 `sizeof(p) / sizeof(p[0])` 来求得数组的长度。
2. `finalP` 数组的类型应该是 `P` 类型的,而不是 `int` 类型的数组。
3. 在判断 `flag[i] = 1` 的时候应该使用双等号 `==` 而不是单等号 `=`。
4. `hull` 函数中并没有完整的求凸包的算法实现,需要补充完整代码。
下面是修正后的代码:
```c++
#include<iostream>
using namespace std;
typedef struct Point {
int x, y;
}P;
P points[100];
int flag[100] = { 0 };
// 排列算法
bool sortP(P p1, P p2) {
if (p1.x == p2.x)
return p1.y > p2.y;
else
return p1.x > p2.x;
}
int S(P p1, P p2, P p) {
return 0.5 * ((p1.x * p2.y - p2.x * p1.y) + (p2.x * p.y - p.x * p2.y) + (p.x * p1.y - p1.x * p.y));
}
P hull(P p, int mode) {
int n = sizeof(p) / sizeof(p[0]);
P finalP[100];
// 找到最左下角的点作为起点
int start = 0;
for (int i = 1; i < n; i++) {
if (sortP(points[i], points[start])) {
start = i;
}
}
// 按照顺时针方向扫描所有点
int k = 0;
int cur = start;
do {
flag[cur] = 1;
finalP[k++] = points[cur];
int next = -1;
for (int i = 0; i < n; i++) {
if (i != cur && flag[i] == 0) {
if (next == -1) {
next = i;
}
else {
int s = S(points[cur], points[next], points[i]);
if (s < 0 || (s == 0 && mode == 1 && sortP(points[i], points[next]))) {
next = i;
}
}
}
}
cur = next;
} while (cur != start);
// 返回 finalP 数组
return finalP;
}
```
阅读全文