成绩排序(结构体和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;
}

运行结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43730184/article/details/86560758
今日推荐