多关键字排序
题目描述:
有N个学生的数据,将学生数据按成绩高低排序(高在前低在后),如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序(从小到大),并输出N个学生排序后的信息。
输入:
输入数据第一行为整数N(N<=100),接下来的N行包括N个学生的数据。
每个学生的数据包括姓名(长度不超过20的字符串)、年龄(整数)、成绩(小于等于100的正数)。
输出:
按顺序输出学生信息,按照如下格式:
姓名 年龄 成绩
样例输入:
3
abc 20 99
bcd 19 97
bed 20 97
样例输出:
abc 20 99
bcd 19 97
bed 20 97
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
typedef struct student {
char name[20];
int age, score;
}student;
student s[105];
bool compare(student s1, student s2) {
if (s1.score != s2.score)
return s1.score > s2.score;
else if (strcmp(s1.name, s2.name) != 0)
return strcmp(s1.name, s2.name) < 0;
else
return s1.age < s2.age;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> s[i].name >> s[i].age >> s[i].score;
}
sort(s, s + n, compare);
for (int i = 0; i < n; ++i) {
cout << s[i].name << ' ' << s[i].age << ' ' << s[i].score << endl;
}
return 0;
}
注释:
bool compare(student s1, student s2) {
if (s1.score != s2.score) //比较成绩,如果不一样,就比较大小
return s1.score > s2.score; // s1成绩高,就是true,sort的时候排在s2前面
else if (strcmp(s1.name, s2.name) != 0) // 成绩相同,比较姓名
return strcmp(s1.name, s2.name) < 0;//<0时,s1.name<s2.name,s1排在前面
else
return s1.age < s2.age;
}
//返回true的话就是前一个排在前面