成绩排序(结构体和set的应用)

本文介绍了一种基于结构体和set容器的成绩排序算法,通过自定义排序规则,实现了对学生总成绩的精确排序,考虑了总成绩、考试成绩、平时成绩及姓名的排序逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值