指针原来是套娃的


私信TA

用户名:uq_92467646842

访问量:42478

签 名:

数学改变科学,科学改变世界

等  级
排  名 10
经  验 24993
参赛次数 49
文章发表 128
年  龄 0
在职情况 学生
学  校
专  业 物联网工程

  自我简介:

QQ:2830671713

解题思路:

因为使用的是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分

5 人评分

  评论区