成绩排序

总时间限制: 
1000ms
内存限制: 
65536kB
描述

给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。

输入
第一行为n (0 < n < 20),表示班里的学生数目;
接下来的n行,每行为每个学生的名字和他的成绩, 中间用单个空格隔开。名字只包含字母且长度不超过20,成绩为一个不大于100的非负整数。
输出
把成绩单按分数从高到低的顺序进行排序并输出,每行包含名字和分数两项,之间有一个空格。
样例输入
4
Kitty 80
Hanmeimei 90
Joey 92
Tim 28
样例输出
Joey 92
Hanmeimei 90 
Kitty 80
Tim 28
来源
习题(14-1)



源代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
int n,i,j;
typedef struct{
	char name[20];
	int mark;
}stu;  //Õë¶Ôµ¥¶ÀÒ»¸öѧÉú 
stu student[20];
bool compare(stu a,stu b)
{
	if(a.mark>b.mark)
	{
		return true;
	}
	else
		if(a.mark==b.mark)
		{
			if(strcmp(a.name,b.name)<0)return true;
			else return false;
		}
	else return false;
}
using namespace std;
int main()
{
	//freopen("2.cpp","r",stdin); 
	cin>>n;
	for(i=0;i<n;i++)
	{
		cin>>student[i].name>>student[i].mark;
	}
	sort(student,student+n,compare);
	for(i=0;i<n;i++)
	{
		cout<<student[i].name<<" "<<student[i].mark<<endl;
	
	}
	return 0;
}



这道题目我用到了C++中的结构体,核心部分需要重点理解
运用到结构体需要#include<algorithm>头文件,并且结构为typedef struct{
}(函数类型);
该题是针对每个单独的学生,所以成绩不需要数组(可能数组写多了习惯也是很迷)
核心部分是这样的
如果前一个同学的成绩大于后一个同学的成绩,根据题目的要求是降序排列,所以不需要调换返回true值(如果compare是int型返回值应该为1)
如果两个同学的成绩相等,
则名字字典序小的在前。
所以要对name[20]进行比较,比较字符串的函数为strcmp,存在于#include<cstring>头文件中。
如果前一个同学的名字字典序小于后一个同学的名字字典序,就不需要排列返回true值
(如果compare是int型返回值应该为1)
反之亦然
然后还需要注意输入的时候应该为cin>>student[i].name>>student[i].mark;表示的意思是当前学生的成绩和分数...
好了应该就这么多了~~逻辑思维hin重要呀...

猜你喜欢

转载自blog.csdn.net/Yang_2002/article/details/80349077