C++ 成绩排序

成绩排序

题目描述

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

输入格式

第一行为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>
using namespace std;
int main()
{
	int n;
	cin>>n;
	string A[n+2],B[n+2]={"a"};
	int a[n+2],b[n+2]={0},flag=0;
	for(int i=1;i<=n;i++)cin>>A[i]>>a[i];
	for(int i=1;i<=n;i++){
		flag=0;
		for(int j=1;j<=i;j++){
			if(a[i]>=b[j]){
				for(int k=n+1;k>j;k--){
					b[k]=b[k-1];
					B[k]=B[k-1];}
				b[j]=a[i];
				B[j]=A[i];
				flag=1;
			}
			if(flag)break;
		}if(!flag){b[i]=a[i];B[i]=A[i];}
	}
	for(int i=1;i<=n;i++)cout<<B[i]<<" "<<b[i]<<endl;
 } 
### 关于C++实现学生成绩管理系统中的成绩排序功能 成绩排序是学生成绩管理系统的重要组成部分之一。为了有效地管理和查询学生的成绩,可以采用多种排序算法来对学生的信息按照特定条件进行排序。这里提供一种基于快速排序(Quick Sort)方法的简单实现方案。 #### 定义学生类 首先定义一个`Student`类用于存储单个学生的信息,包括姓名、科目以及对应的分数: ```cpp class Student { public: string name; map<string, int> scores; // 科目名称 -> 分数 void addScore(const string& subject, const int score); }; ``` 此部分代码展示了如何创建一个能够容纳多个学科成绩的学生对象模型[^1]。 #### 添加成绩函数 接着为上述类添加成员函数以便向其中加入不同科目的考试得分记录: ```cpp void Student::addScore(const string &subject, const int score){ this->scores.insert(make_pair(subject, score)); } ``` 这部分实现了给定具体课程名及其对应的成绩录入操作。 #### 排序比较器 对于整个班级而言,则需考虑按总分高低排列所有学员名单的需求。因此还需要编写自定义比较器来进行两两之间的对比工作: ```cpp bool compareTotalScores(Student* s1, Student* s2) { int sumS1 = accumulate(s1->scores.begin(), s1->scores.end(), 0, [](int total, const pair<const string,int>& p){return total+p.second;}); int sumS2 = accumulate(s2->scores.begin(), s2->scores.end(), 0, [](int total, const pair<const string,int>& p){return total+p.second;}); return (sumS1 > sumS2); // 按照降序排列 } ``` 这段逻辑计算每位同学所获得的所有测试项目的累计数值,并据此决定先后顺序关系。 #### 使用STL标准库sort()函数完成最终排序过程 最后利用C++ STL提供的高效内置工具——`std::sort()` 来执行实际的列表整理动作: ```cpp vector<Student*> studentsList; // ... 假设已经通过某种方式填充好了studentsList... stable_sort(studentsList.begin(), studentsList.end(), compareTotalScores); for(auto it=studentsList.cbegin();it!=studentsList.cend();++it){ cout << (*it)->name << " 总分为:" ; int sum =accumulate((*it)->scores.begin(),(*it)->scores.end(),0, [](int total,const std::pair<const string ,int >&p){return total+p.second ; }); cout<<sum<<"\n"; } ``` 以上就是完整的从零构建到应用层面的一个小型案例分析。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值