-
总时间限制:
- 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重要呀...