运用结构体排序,此题能让自己对结构体排序有更加深入的了解,学会了结构体的方法来排序,这样的话以后再也不用怕成绩统计、名次排序之类的题目了。
首先,我们应该先定义一个结构体
然后,再去定一个排序函数
最后调用进行排序就完成了
Description
手机联系人通常都可以按姓名进行排列,SYC突发奇想按年龄进行排列,但是其手头没有每个人的年龄,于是将每个联系人的生日输入进了手机。现在请你帮助SYC实现他的愿望,将给定的联系人按年龄从大到小排列(大一天也是大哦~),如果两人同年同月同日生,那么按姓名升序进行排列。
Input
第一行一个整数N,代表手机中有N个联系人。1<=N<=1000接下来的N行表示每一个联系人的信息,每一行首先是联系人的名称,然后有一个空格,之后是该联系人的生日(月/日/年)。联系人的姓名不会超过50个字符,只包含英文大写字母。生日均是合法的日期,年份为4位,月份和日期为1~2位。
Output
输出N行,每一行显示该联系人的姓名。
Sample Input
5 SYC 1/1/1990 ZZK 3/3/1990 LZC 4/4/1990 LG 02/02/1990 WZ 12/12/1990
Sample Output
SYC LG ZZK LZC WZ
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct lianxi //定义结构体
{
char name[50];
int day,month,year;
}x[10000];
bool cmp(lianxi x,lianxi y) //定义排序函数
{
if(x.year==y.year)
{
if(x.month==y.month)
{
if(x.day==y.day)
{
if(strcmp(x.name,y.name)<0)
return 1;
else return 0;
}
else if(x.day<y.day)
return 1;
else if(x.day>y.day)
return 0;
}
else if(x.month<y.month)
return 1;
else if(x.month>y.month)
return 0;
}
else if(x.year<y.year)
return 1;
else if(x.year>y.year)
return 0;
}
int main() //进行排序
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%s %d/%d/%d",&x[i].name,&x[i].month,&x[i].day,&x[i].year);
}
sort(x,x+n,cmp);
for(int i=0;i<n;i++)
{
printf("%s\n",x[i].name);
}
return 0;
}
这样就完成了!