解题思路:
因为使用的是c语言,所以使用的是qsort排序,c++里也有sort排序,他们都提供了自定义排序的方法。
qsort排序详解见https://blog.dotcpp.com/a/82350,不过与那篇题解不同的是,这里会介绍怎么对结构体进行三重排序。
首先,让我们注意下面代码的几个小技巧:
利用scanf函数,吸收掉/,这样可以不用定义三个字符变量了。
使用~或!=EOF结束循环,这样可以一直输入到文件末尾,自己调试的时候需要在输入结束以后加上 ctrl z主动结束掉循环。
在自定义的函数gg里面定义两个结构体变量,指向传进来的 x和y,不然就会像搜到的大部分题解一样,每一次使用 x和y都需要进行强制类型转换,不简洁而且易出错。
在对printf进行输出时,使用了%02d,它的意思是对不满足两个位置的数前位补0,例如1就会变成01。
这道题有个奇怪的地方就是 它是月/日/年,所以第一个是月份而不是日子。
注意的是,即使是对结构体排序,传入的参数也是 const void *的,需要在函数里进行强制类型转换,除此之外没有区别了。
还有的题会对字符串排序,可以用strcmp函数比较这两个数的大小。
参考代码:
#include <stdio.h> #include <stdlib.h> #include <math.h> struct pp { int x; int y; int z; }; struct pp p[10001]; int gg(const void *x,const void *y){ struct pp *a=(struct pp *)x; struct pp *b=(struct pp *)y; if(a->z!=b->z)return a->z-b->z;//如果年份不相等则从小到大排序 if(a->x!=b->x)return a->x-b->x;//如果月份不相等则从小到大排序 return a->y-b->y; } int main() { int i; int n=0; while(~scanf("%d/%d/%d",&p[n].x,&p[n].y,&p[n].z)){ n++; } qsort(p,n,sizeof(p[0]),gg); for(i=0;i<n;i++){ printf("%02d/%02d/%04d\n",p[i].x,p[i].y,p[i].z); } return 0; }
0.0分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复