平面点排序(结构体专题)

(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库函数排序(整数)

用于对数组进行排序

  1. 包含头文件 <stdlib.h>
  2. 定义一个比较函数,告诉 qsort 怎么比较两个元素。
  3. 调用 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),每个点后有一个空格。第一行升序排序结果,第二行降序排序结果。

样例输入

content 复制代码
<span style="color:#333333"><span style="background-color:#f5f5f5">4
1 3
2 5
1 4
4 1

</span></span>

样例输出

content 复制代码
<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);
}
相关推荐
C语言编程小刘 1几秒前
C语言期末复习1.1
c语言·算法·leetcode
Bucai_不才15 分钟前
【C++】初识C++之C语言加入光荣的进化(下)
c语言·c++·面向对象编程
A懿轩A30 分钟前
C/C++ 数据结构与算法【哈夫曼树】 哈夫曼树详细解析【日常学习,考研必备】带图+详细代码
c语言·c++·学习·算法·哈夫曼树·王卓
一入程序无退路2 小时前
c语言传参数路径太长,导致无法获取参数
linux·c语言·数据库
lili-felicity2 小时前
指针与数组:深入C语言的内存操作艺术
c语言·开发语言·数据结构·算法·青少年编程·c#
就爱学编程13 小时前
重生之我在异世界学编程之C语言:数据在内存中的存储篇(下)
java·服务器·c语言
落羽的落羽14 小时前
【落羽的落羽 C语言篇】动态内存管理·下
c语言
叫我阿呆就好了15 小时前
C 实现植物大战僵尸(一)
c语言·开发语言
柒月的猫15 小时前
求和(2022蓝桥杯A组试题C)
c语言·算法·蓝桥杯
Ning_.17 小时前
力扣第116题:填充每个节点的下一个右侧节点指针 - C语言解法
c语言·算法·leetcode