【c/c++】 sort 对自定义结构体排序

自定义结构体进行对结构体内部的各个项进行排序

题目描述:

N 个学生的数据,将学生数据按成绩高低排序(从低到高,这一点可以从所给的实例中体现出来),如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出 N个学生排序后的信息。

输入:

测试数据有多组,每组输入第一行有一个整数 NN<=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 就是前面的大于后面的即降序这种思想即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值