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