题目链接:
https://nuoyanli.com/contest/27/problem/B
题面:
题意:
先输入一个n,代表有n个同学,再依次输入输入n个同学的名字,出生年份,出生月份,出生日期,按照年龄大小从大到小进行排序,然后输出对应的名字。
如果年月日都相同,则后输入的先输出。
思路:
这道题目是一个极其简单的结构体的题目,所要使用的知识总共3点
1.正确定义结构体,我们要先定义一个结构体将一个的所有数据进行关联。
2.正确使用sort排序,sort排序的使用方法首先要使用C++进行提交和文件的名称后缀改为cpp,然后加上头文件和using namespace std;,之后sort(a,a+n,cmp);
这个语句表达的意思就是将数组a从a【0】到a【n-1】按照所定义的函数进行排序,如果不加后面的cmp就默认为从小到大排序。
3.定义结构体的排序(我之前一直不会 )首先我们定义一个bool 的函数,函数名字自己随意取,设置的两个变量的类型则为结构体的名称(结构体在一定意义上就是一种数据类型)然后如果要将某一个数据从小到大排序,就 return a.y<b.y;,如果想要从大到小排序,就可以return a.y>b.y;,如果要题目要求相同时以其他条件为排序标准,则通过一个if来实现,if(a.y==b.y),之后的实现就同上,这就是定义一个结构体排序的函数。
注:通过sort排序来实现结构体的排序好处在于结构体中的每个变量的对应关系都没有发生改变,如果使用冒泡排序,会改变结构体中的每个变量之间的一一对应关系,从而影响数据的关联性。
参考代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>//应用C++中的sort排序的头文件
using namespace std;//C++内容
struct people
{
char s[1000];
int y;
int m;
int d;
} a[1000];//定义一个结构体的数组
bool cmp(people a,people b)//定义一个函数将其进行排序(结构体的名称就可以看作一种数据类型,他可以用来修饰变量的数据类型,所以要将字符串排序时可以直接用结构体的名字来定义变量)
{
if(a.y==b.y)
{
if(a.m==b.m)
{
return a.d>b.d;//将出生日期从大到小排序
}
else
return a.m>b.m;//将出生月份按从大到小排序
}
else
return a.y>b.y;//将出生年份按从大到小排序
}
int main()
{
int n,i;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%s%d%d%d",a[i].s,&a[i].y,&a[i].m,&a[i].d);//依次输入名字,出生年份,出生月份,出生日期。
}
sort(a,a+n,cmp);//对其进行排序,满足之前定义的函数进行排序
for(i=n-1; i>=0; i--)
{
printf("%s\n",a[i].s);//排序结束逆序输出
}
return 0;
}