自定义结构体进行对结构体内部的各个项进行排序
题目描述:
有 N 个学生的数据,将学生数据按成绩高低排序(从低到高,这一点可以从所给的实例中体现出来),如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出 N个学生排序后的信息。
输入:
测试数据有多组,每组输入第一行有一个整数 N(N<=1000),接下来的 N行包括 N 个学生的数据。每个学生的数据包括姓名(长度不超过 100 的字符串) 、年龄(整形数)、成绩(小于等于 100 的正数)。
输出:
将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。然后输出学生信息,按照如下格式:姓名 年龄 成绩
样例输入:
3
abc 20 99
bcd 19 97
bed 20 97
样例输出:
bcd 19 97
bed 20 97
abc 20 99
提示:
学生姓名的字母序区分字母的大小写,如 A 要比 a 的字母序靠前(因为 A 的ASC 码比 a 的 ASC 码要小),这一点不违背,只要是按照从小到大的顺序即可。
来源:
2000 年清华大学计算机研究生机试真题
这是王道上的题目,我自己仿照答案练了一下,核心要点就是对sort函数写一个自定义的函数:
代码为:
#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<algorithm>
#include<vector>
#include<string.h>
using namespace std;
struct E{
char name[101];
int age;
int score;
}buf[1000];
//分数,姓名,年龄按照升序进行排列
bool cmp(E a, E b)
{
if (a.score != b.score)
return a.score < b.score;
int tmp = strcmp(a.name,b.name);
//对于strcmp函数,strcmp(str1,str2),相等时返回0,str1 > str2时返回正数,否则返回负数
if (tmp != 0)
return tmp < 0;
else
return a.age < b.age;
}
int main()
{
int N;
while (scanf("%d", &N) != EOF)
{
for (int i = 0; i < N; i++)
scanf("%s%d%d",buf[i].name,&buf[i].age ,&buf[i].score);
sort(buf,buf + N,cmp);
for (int i = 0; i < N; i++)
printf("%s %d %d\n",buf[i].name,buf[i].age,buf[i].score);
}
return 0;
}
注意sort(buf,buf + N , cmp), 如果少了cmp 会报错,这点是显而易见的,另外要注意的是buf的地址,是整个结构体数组的起始地址,buf + N 就是第N个结构体数组元素所在地址的下一位,说明不论是什么类型的数据,都是 + N (元素个数),这一点只需记下来即可。
运行结果:
第一个例子
4
a 12 91
a 13 90
A 13 91
a 10 91
a 13 90
A 13 91
a 10 91
a 12 91
^C请按任意键继续. . .
所给的样例完全符合:
3
abc 20 99
bcd 19 97
bed 20 97
bcd 19 97
bed 20 97
abc 20 99
^C请按任意键继续. . .
对于sort来说return的是bool型,要么是 1(true) 要么是 0 (false), 只要符合例如 return x > y 就是前面的大于后面的即降序这种思想即可。