平面点排序(结构体专题)
(1)
题目描述
平面上有n个点,坐标均为整数。请按与坐标原点(0,0)距离的远近将所有点排序输出。可以自己写排序函数,也可以用qsort库函数排序。
输入描述
输入有两行,第一行是整数n(1<=n<=10),接下来有n行,每行一对整数(每对整数对应一个点)。
输出描述
输出排序后的所有点,格式为(u,v),每个点后有一个空格。测试数据保证每个点到原点的距离都不同。
样例输入
4 1 3 2 5 1 4 4 2样例输出
(1,3) (1,4) (4,2) (2,5)提示
要求:定义点结构体 struct point
#include<stdio.h>
#include <stdlib.h>
#include <math.h>
//定义数组记录点到(0.0)的距离;
struct point
{
int a[2];
}poi[10];//一个包含10个point结构体的数组
void jh(int *x,int *y)//函数:用于交换两个整数的值
{
int t=*x;//x指向的内存位置
*x=*y;
*y=t;
}
int main()
{
//输入
int n,i,j,t;
scanf("%d",&n);
int c[n];
for(i=0;i<n;i++)
{
scanf("%d%d",&poi[i].a[0],&poi[i].a[1]);
c[i]=sqrt(pow(poi[i].a[0],2)+pow(poi[i].a[1],2));//计算每个点的坐标的平方和的平方根
}
//排序
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(c[j]>c[j+1])
{
jh(&c[j],&c[j+1]);
jh(&poi[j].a[0],&poi[j+1].a[0]);
jh(&poi[j].a[1],&poi[j+1].a[1]);
}
}
}
//输出
for(i=0;i<n;i++)
{
printf("(%d,%d) ",poi[i].a[0],poi[i].a[1]);
}
return 0;
}
交换 poi[j].a[0]
和 poi[j+1].a[0]
,以及 poi[j].a[1]
和 poi[j+1].a[1]时,
为了保持代码的清晰性和一致性,可以使用一个单独的函数来处理点的交换,以避免代码重复。
优化后:
#include <stdio.h>
#include <math.h>
// 定义点的结构体,包含两个整数坐标
struct point
{
int a[2];
} poi[10]; // 包含10个point结构体的数组
// 函数:用于交换两个整数的值
void jh(int *x, int *y)
{
int t = *x; // x指向的内存位置
*x = *y;
*y = t;
}
// 函数:用于交换两个点的结构体
void swap_points(struct point *p1, struct point *p2)
{
jh(&p1->a[0], &p2->a[0]);
jh(&p1->a[1], &p2->a[1]);
}
int main()
{
// 输入
int n, i, j;
scanf("%d", &n);
int c[n]; // 数组记录点到原点的距离
for (i = 0; i < n; i++)
{
scanf("%d%d", &poi[i].a[0], &poi[i].a[1]);
c[i] = sqrt(pow(poi[i].a[0], 2) + pow(poi[i].a[1], 2));
// 计算每个点的坐标的平方和的平方根
}
// 排序
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (c[j] > c[j + 1])
{
jh(&c[j], &c[j + 1]);
swap_points(&poi[j], &poi[j + 1]); // 使用swap_points函数交换点
}
}
}
// 输出
for (i = 0; i < n; i++)
{
printf("(%d,%d) ", poi[i].a[0], poi[i].a[1]);
}
return 0;
}
qsort库函数排序(整数)
用于对数组进行排序
- 包含头文件
<stdlib.h>
- 定义一个比较函数,告诉
qsort
怎么比较两个元素。 - 调用
qsort
,传入数组和比较函数。
比较函数需要两个参数,返回一个整数:
- 如果第一个参数应该在第二个参数前面,返回负数。
- 如果两个参数相等,返回0。
- 如果第一个参数应该在第二个参数后面,返回正数。
举个栗子:
#include <stdio.h>
#include <stdlib.h>
// 比较函数,用于排序整数
int compare_int(const void *a, const void *b)
{
int arg1 = *(const int *)a;
int arg2 = *(const int *)b;
if (arg1 < arg2) return -1;
if (arg1 > arg2) return 1;
return 0;
}
int main()
{
int numbers[] = {5, 3, 4, 2, 1};
int n = sizeof(numbers) / sizeof(numbers[0]);
// 使用 qsort 排序
qsort(numbers, n, sizeof(int), compare_int);
// 打印排序后的数组
for (int i = 0; i < n; i++)
{
printf("%d ", numbers[i]);
}
printf("\n");
return 0;
}
(2)
题目描述
平面上有n个点,坐标均为整数。横坐标相同时按纵坐标排序,否则按横坐标排序。本题要求用结构体存储坐标,再进行排序。先升序排序输出,再降序排序输出,可以自己写排序函数,也可以用qsort库函数排序。
输入描述
输入有两行,第一行是整数n(1<=n<=100),表示下一行有n对整数(每对整数对应一个点)输入,每个数据后有一个空格。
输出描述
输出有两行,即排序后的点,格式为(u,v),每个点后有一个空格。第一行升序排序结果,第二行降序排序结果。
样例输入
<span style="color:#333333"><span style="background-color:#f5f5f5">4 1 3 2 5 1 4 4 1 </span></span>
样例输出
<span style="color:#333333"><span style="background-color:#f5f5f5">(1,3) (1,4) (2,5) (4,1) (4,1) (2,5) (1,4) (1,3) </span></span>
#include<stdio.h>
#include<math.h>
struct a//用结构体(数据类型) 存储坐标
{
int x;
int y;
};
//横坐标相同时按纵坐标排序,否则按横坐标排序
int main()
{
int n,i,j;
scanf("%d",&n);
struct a X[100];
for(i=0;i<n;i++)
{
scanf("%d %d",&X[i].x, &X[i].y);
}
//先升序排序输出,再降序排序输出
for(i=0;i<n-1;i++)
{
for(j=i;j<n-1;j++)
{
if(X[i].x > X[j + 1].x)
{
struct a temp = X[i];
X[i]=X[j + 1];
X[j + 1]=temp;
}
else if(X[i].x == X[j + 1].x && X[i].y >X[j + 1].y)
{
struct a temp = X[i];
X[i]=X[j + 1];
X[j + 1]=temp;
}
}
}
//输出
for(i=0;i<n;i++)
printf("(%d,%d) ",X[i].x, X[i].y);
printf("\n");
for(i=0;i<n-1;i++)
{
for(j=i;j<n-1;j++)
{
if(X[i].x < X[j + 1].x)
{
struct a temp=X[i];
X[i]=X[j + 1];
X[j + 1]=temp;
}
else if(X[i].x == X[j + 1].x&& X[i].y <X[j + 1].y)
{
struct a temp =X[i];
X[i]=X[j + 1];
X[j + 1]=temp;
}
}
}
for (i = 0; i < n; i++)
printf("(%d,%d) ",X[i].x, X[i].y);
}