成绩排序(结构体和set的应用)
作者:互联网
成绩排序(结构体和set的应用)
题目描述:
总成绩是按平时成绩和考试成绩加一块的,平时成绩占30%,考试成绩占70%。(平时成绩和考试成绩均为100)
按照总成绩排下序,总成绩相同的看考试成绩,考试成绩相同的看平时成绩,都相同的看姓名。(成绩按从大到小,姓名按字典序)。
输入描述:
先输入一个整数n,代表有n个学生,接下来有n行,(0<n<30)
每行有一个字符串和两个实数,其中包括学生的姓名,平时成绩和考试成绩。
输出描述:
按他们的总成绩从大到小输出,每行包括学生姓名,平时成绩,考试成绩和总成绩。(小数点后保留两位)。
样例输入:
5
Kelly 99 80
Easter 95 60
Aidan 70 58
Alex 99 59
Tommy 98 50
样例输出:
Kelly 99.00 80.00 85.70
Alex 99.00 59.00 71.00
Easter 95.00 60.00 70.50
Tommy 98.00 50.00 64.40
Aidan 70.00 58.00 61.60
来源:
网络
题意:
输入一组学生成绩,包含学生姓名,平时成绩,考试成绩,要求按照排序规则对学生成绩进行排序,并输出学生的各个成绩以及总成绩。
思路:
因为输入时数据包含学生姓名,平时成绩,考试成绩,所以可以先定义一个结构体类型,里面包含学生姓名(字符型),平时成绩,考试成绩(因为为实数,定义成单精度或双精度型),然后使用set容器并配合一个自定义的排序规则对元素进行排序。
代码:
#include<iostream>
#include<cstdio>//因为要使用printf函数,所以引用c的头文件
#include<string>
#include<set>
using namespace std;
struct Student //定义一个学生类的结构体类型
{
string name;//学生姓名
float pscj; //学生平时成绩
float kscj; //学生考试成绩
float zcj; //学生总成绩
bool operator < (const Student &a) const //自定义排序规则
{
if(a.zcj!=zcj)//先按总成绩从大到小排序
return a.zcj<zcj; //从大到小排序
else if(a.kscj!=kscj) //总成绩相等,按考试成绩从大到小排序
return a.kscj<kscj; //从大到小排序
else if(a.pscj!=pscj) //平时成绩相等,按平时成绩从大到小排序
return a.pscj<pscj;
else return a.name<name; //三个成绩都相等,按姓名排序
}
};
int main()
{
multiset<Student> s; //创建一个多重集合容器,存储学生类型
int n;
float x,y,z;
string c; //定义一个string类型的c
Student info; //定义一个学生类的变量名
cin>>n;
while(n--)
{
cin>>c;
info.name=c;
cin>>x>>y;
z=x*0.3+y*0.7; //计算总成绩
info.pscj=x;
info.kscj=y;
info.zcj=z;
s.insert(info); //把学生信息插入到多重集合容器中
}
multiset<Student>::iterator it; //定义迭代器
for(it=s.begin();it!=s.end();it++) //使用迭代器遍历容器
{
cout<<(*it).name<<" ";
printf("%.2f %.2f %.2f\n",(*it).pscj,(*it).kscj,(*it).zcj);
}
return 0;
}
运行结果:
标签:info,考试成绩,set,总成绩,学生,成绩,平时成绩,排序 来源: https://blog.csdn.net/weixin_43730184/article/details/86560758