当前位置: 首页 > article >正文

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

(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),每个点后有一个空格。第一行升序排序结果,第二行降序排序结果。

样例输入

<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);
}


http://www.kler.cn/a/408897.html

相关文章:

  • 【软考】数据库
  • 前端速通(CSS)
  • SATA接口不通分析案例分享
  • 解决Dcat Admin laravel框架登录报错问题,(blocked:mixed-content)
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-05
  • Spring ApplicationListener
  • SpringMVC的理解
  • 基于Springboot+微信小程序的社区论坛系统 (含源码数据库)
  • 推荐一个QDirStat基于 Qt 的目录统计工具
  • MyBatis基本使用
  • Jupyter 导入 - 国内安装 openai 和 python-dotenv 包
  • 实验室管理技术:Spring Boot技术的应用
  • 2025-2026财年美国CISA国际战略规划(下)
  • MySQL底层概述—1.InnoDB内存结构
  • 详细探索xinput1_3.dll:功能、问题与xinput1_3.dll丢失的解决方案
  • 2062:【例1.3】电影票(http://ybt.ssoier.cn:8088/problem_show.php?pid=2062)
  • transform学习
  • MongoDB相关问题
  • 汽车HiL测试:利用TS-GNSS模拟器掌握硬件性能的仿真艺术
  • HTTP工作原理
  • 代码随想录算法训练营第五十四天|Day54 图论
  • 『VUE』34. 异步组件(详细图文注释)
  • 虚幻引擎---初识篇
  • 使用ENSP实现默认路由
  • DataGear 5.2.0 发布,数据可视化分析平台
  • 【纸飞机串口调试工具】预设曲线名称