解题思路:
因为使用的是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分
160 人评分
母牛的故事 (C语言代码)浏览:1409 |
C语言程序设计教程(第三版)课后习题12.2 (C语言代码)浏览:855 |
钟神赛车 (C++代码)浏览:905 |
C二级辅导-公约公倍 (C语言代码)浏览:1549 |
C语言训练-立方和不等式 (C语言代码)浏览:779 |
字符串对比 (C语言代码)浏览:1469 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:949 |
C语言程序设计教程(第三版)课后习题8.6 (C语言代码)浏览:631 |
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:686 |
【金明的预算方案】 (C++代码)浏览:873 |