题目描述
cjf 君想调查学校 OI 组每个同学的生日,并按照年龄从大到小的顺序排序。但cjf君最近作业很多,没有时间,所以请你帮她排序。
输入格式
有2行,
第1行为OI组总人数n;
第22行至第n+1行分别是每人的姓名s、出生年y、月m、日d。
输出格式
有n行,
即n个生日从大到小同学的姓名。(如果有两个同学生日相同,输入靠后的同学先输出)
输入输出样例
输入:
3
Yangchu 1992 4 23
Qiujingya 1993 10 13
Luowen 1991 8 1
输出:
Luowen
Yangchu
Qiujingya
分析
1.因为每位同学的姓名和生日都是一个整体,所以需要用到结构体。
2.并且还要按照生日排序,所以需要用到sort()函数。
源代码
#include <iostream>
#include <string>
//因为要使用sort()函数,所以要包涵下面这个头文件
#include <algorithm>
using namespace std;
//生日结构体
typedef struct
{
int year; //年
int month; //月
int day; //日
}Birthday;
//学生信息结构体
typedef struct
{
int id; //编号
string name; //姓名
Birthday date; //生日
}Student;
int num; //学生人数
Student student[105]; //学生信息
//作为sort的第三个参数,即排序方法
bool compare(Student x, Student y)
{
if(x.date.year != y.date.year)
{
return x.date.year < y.date.year;
}
else if(x.date.month != y.date.month)
{
return x.date.month < y.date.month;
}
else if(x.date.day != y.date.day)
{
return x.date.day < y.date.day;
}
else
{
return x.id > y.id;
}
}
int main(void)
{
cin >> num;
//输入学生信息
for(int i = 0; i < num; i++)
{
student[i].id = i + 1;
cin >> student[i].name
>> student[i].date.year
>> student[i].date.month
>> student[i].date.day;
}
//调用sort()函数进行排序
sort(student, student + num , compare);
//输出
for(int i = 0; i < num; i++)
{
cout << student[i].name << endl;
}
return 0;
}
总结
本题的关键在于sort()函数,sort()函数有三个参数:
1.第一个参数是数组的首地址;
2.第二个参数是数组结束地址;
3.第三个参数是排序的方法。(如果不写,则默认是从小到大排序)。
有关sort()函数的使用方法,大家可以自行百度,这里只是做了简单的介绍。