7-3 成绩排序 (10 分)\n描述\n给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。\n\n输入\n第一行为n (0 < n < 20),表示班里的学生数
时间: 2023-05-31 13:19:32 浏览: 235
对成绩统计时,分数相同怎么排序.pdf
### 回答1:
题目描述:
给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。
输入:
第一行为n (0 < n < 20),表示班里的学生数。接下来n行,每行包含一个字符串和一个整数,表示学生的姓名和成绩,字符串长度不超过20,成绩为不超过100的正整数。
输出:
按成绩从高到低排序后输出每个学生的姓名和成绩,每行一个,姓名和成绩之间用一个空格隔开。
样例:
输入:
3
Tom 80
Jerry 90
Bob 80
输出:
Jerry 90
Tom 80
Bob 80
解题思路:
本题需要对学生的成绩进行排序,可以使用sort函数进行排序。由于需要按成绩从高到低排序,因此需要自定义一个比较函数,按照成绩从高到低排序,如果成绩相同则按照姓名字典序从小到大排序。
代码:
### 回答2:
接下来的n行,每行为一位学生的姓名以及这门课程的成绩,姓名和成绩之间用一个空格隔开。姓名和成绩均为不超过10个字符的字符串,成绩为0到100之间的整数。\n\n输出\n按照题目要求,将成绩单从高到低排序后输出。每行输出一个学生的姓名和成绩,中间用一个空格隔开。\n\n解题思路\n本题需要按照成绩从高到低排序,因此可以使用冒泡排序或选择排序等算法来进行排序。在排序的过程中,如果遇到成绩相同的情况,则按照名字的字典序进行排序,即名字靠前的先输出。对于字典序的比较,可以使用strcmp函数来进行比较。\n\n代码示例\n以下是使用冒泡排序进行排序的示例代码:\n\n#include <stdio.h>\n#include <string.h>\n\nstruct student {\n char name[11];\n int score;\n};\n\nvoid bubble_sort(struct student stu[], int n)\n{\n int i, j;\n for (i = 0; i < n - 1; i++) {\n for (j = 0; j < n - i - 1; j++) {\n if (stu[j].score == stu[j + 1].score) {\n if (strcmp(stu[j].name, stu[j + 1].name) > 0) {\n struct student temp = stu[j];\n stu[j] = stu[j + 1];\n stu[j + 1] = temp;\n }\n } else if (stu[j].score < stu[j + 1].score) {\n struct student temp = stu[j];\n stu[j] = stu[j + 1];\n stu[j + 1] = temp;\n }\n }\n }\n}\n\nint main()\n{\n int n, i;\n scanf("%d", &n);\n struct student stu[n];\n for (i = 0; i < n; i++) {\n scanf("%s %d", stu[i].name, &stu[i].score);\n }\n bubble_sort(stu, n);\n for (i = 0; i < n; i++) {\n printf("%s %d\n", stu[i].name, stu[i].score);\n }\n return 0;\n}\n\n参考资料\nC语言中的字符串比较函数strcmp\nC语言中的冒泡排序算法\nC语言中的选择排序算法
### 回答3:
第二行到第n+1行每行包含一个字符串和一个整数,表示每个学生的名字和该门课的成绩。名字由不超过100个小写字母组成,成绩为0到100的整数。\n\n输出\n按成绩从高到低输出成绩单,格式为:名字 分数。名字与分数之间用一个空格隔开,每行一个学生的信息。如果有相同分数则名字字典序小的在前。\n\n样例\n输入样例:\n4\ntangjian 87\nlihong 99\nzhangsan 87\nsunyan 78\n输出样例:\nlihong 99\ntangjian 87\nzhangsan 87\nsunyan 78\n一个班里有n个人,每个人都有一门课程的成绩需要按照成绩从高到低排序。因为涉及到排名,所以需要讲解一下排名算法。\n就拿这道题里面的例子来说,我们需要按照分数作为关键字,进行降序排序,分数相同的按照名字的字典序升序排序。\n因此,我们可以先打一个排序函数,按照分数降序排序,如果分数相同,按照名字升序排序:\nbool cmp ( const pair<string,int> &a, const pair<string,int> &b)\n{\n if ( a.second != b.second )\n return a.second > b.second;\n else\n return a.first < b.first;\n}\n然后main函数里,先读入每个人的名字和成绩后,将它们存到一个vector<pair<string,int>>里面。然后将这个vector排序,最后输出即可:\nvector<pair<string,int> > v;\n int n, g;\n string name;\n scanf("%d",&n);\n for ( int i = 0; i< n; i++)\n {\n cin >> name >> g;\n v.push_back(make_pair(name,g));\n }\n sort(v.begin(),v.end(),cmp);\n for ( int i = 0; i < n; i++)\n printf("%s %d\n",v[i].first.c_str(),v[i].second);\n需要注意的是,这道题要输出c-string类型的名字,可以使用.c_str()将string转换成c-string类型输出。
阅读全文