解题思路:

因为使用的是c语言,所以使用的是qsort排序,c++里也有sort排序,他们都提供了自定义排序的方法。

qsort排序详解见https://blog.dotcpp.com/a/82350,不过与那篇题解不同的是,这里会介绍怎么对结构体进行三重排序。

首先,让我们注意下面代码的几个小技巧:

  1. 利用scanf函数,吸收掉/,这样可以不用定义三个字符变量了。

  2. 使用~或!=EOF结束循环,这样可以一直输入到文件末尾,自己调试的时候需要在输入结束以后加上 ctrl z主动结束掉循环。

  3. 在自定义的函数gg里面定义两个结构体变量,指向传进来的 x和y,不然就会像搜到的大部分题解一样,每一次使用 x和y都需要进行强制类型转换,不简洁而且易出错。

  4. 在对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.0分

4 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论