描述
给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。
输入
第一行为n (0 < n < 20),表示班里的学生数目;
接下来的n行,每行为每个学生的名字和他的成绩, 中间用单个空格隔开。名字只包含字母且长度不超过20,成绩为一个不大于100的非负整数。输出
把成绩单按分数从高到低的顺序进行排序并输出,每行包含名字和分数两项,之间有一个空格。
样例输入
4 Kitty 80 Hanmeimei 90 Joey 92 Tim 28样例输出
Joey 92 Hanmeimei 90 Kitty 80 Tim 28
- 因为一个学生信息有“姓名”和“成绩”两个,所以用一个结构体包括
- 用该结构体开辟一个结构体类型的数组,存放输入的学生姓名和成绩
- 冒泡排序
#include <iostream>
#include <algorithm>
#include <cstring> //strcmp()所需头文件
using namespace std;
struct Student //定义学生结构体,包含姓名和成绩
{
char name[20];
int score;
};
Student stu[20]; //用学生结构体定义一个20个空间的学生姓名+成绩
int main()
{
int n;
cin >> n;
for(int i=0; i<n; i++)
cin >> stu[i].name >> stu[i].score;
for(int i=n-1; i>0; i--) //排序主体程序,这里使用冒泡排序,每次都确定最后一个
{
for(int j=0; j<i; j++) //当前待排,从中选择一个最小的放到最后
{
if(stu[j].score < stu[j+1].score) //成绩排序,从高到低,每次确定一个最小的
{
Student tmp = stu[j];
stu[j] = stu[j+1];
stu[j+1] = tmp;
}
if(stu[j].score == stu[j+1].score) //如果成绩相同,判断姓名的字典序,小的在前
{
if( strcmp( stu[j].name, stu[j+1].name ) > 0 ) //大于0说明前者字典序大
{ //字典序大的放后面,交换
Student tmp = stu[j];
stu[j] = stu[j+1];
stu[j+1] = tmp;
}
}
}
}
for(int i=0; i<n; i++)
cout << stu[i].name << " " << stu[i].score << endl;
return 0;
}