练习题(四)

练习题(四)

时间限制: 1 Sec 内存限制: 128 MB
[命题人:171360140]
题目描述
李华大学已经上过一个学期了,也了解了大学的考试,在没出成绩之前,他还是很担心的,在成绩出来后心里的那块石头终于落下了。但在成绩单上他看到了一些高中没见到的名词,成绩单上有每科的学分,自己获得学分,还有平均学分绩点。然后他问问了学长,学长告诉他成绩排名是按平均学分绩点来排的,并告诉他了平均学分绩点是如何算的,假设他的考试科门有高数,英语,导论,这3门的学分分别是5,4,4;学分绩点的计算:不及格的学分绩点为:0,及格的学分绩点为:学分*(成绩-50)*0.1;平均学分绩点的计算:总科目学分绩点相加除以总科目学分相加(结果保留两位小数)。
假设李华这3门的成绩分别为:97,85,87;取得的学分绩点分别为:23.5,14,14.8;平均学分绩点为:4.02。
他现在知道了室友的成绩但不知道平均学分绩点,他在第一学期学了程序,现在想用程序来计算并对一个寝室的人进行排名,大家来帮帮他。(按平均学分绩点从大到小的顺序排,平均学分绩点相同的,依次按照高数,英语,导论的顺序来排,都相等的按姓名的字典序排)

输入
第一行为一个整数n代表寝室的人数
每个学生的成绩占4行
一行包括姓名,
另三行是3科的科目名和成绩中间用空格隔开
输出
输出有n行,每行为一个学生的信息,学生信息按姓名 平均学分绩点 高数学分绩点 英语学分绩点 导论学分绩点 (中间用空格隔开,保留两位小数)
样例输入

3
LiHua
Math 97
English 85
Theory 87
Easter
Math 90
English 80
Theory 85
Aidan
Math 97
English 87
Theory 85

样例输出

Aidan 4.02 23.50 14.80 14.00
LiHua 4.02 23.50 14.00 14.80
Easter 3.54 20.00 12.00 14.00

来源/分类
寒假练习赛
题目网址: http://47.112.31.182/problem.php?id=1068
题意:
本题要求对学生的成绩按要求进行排序
思路:
学生信息有多个类型,可以用结构体,按要求排序可以把排序规则放在结构体里,因为可能有重复的,要用多重集合容器。因为不知道每科的输入顺序,可以用map映照来对应
代码:

#include<iostream>
#include <set>  //set集合容器头文件
#include <string>   //string容器头文件
#include <cstdio>
#include <map>//map映照容器头文件
using namespace std;
struct Student  //定义学生类,里面包含学生信息
{
    string name;    //名字
    double ma;      //高数绩点
    double en;      //英语绩点
    double th;      //导论绩点
    double pj;      //平均学分绩点
    bool operator <(const Student &a) const //自定义排序规则 “<”是重载符
    {
        if(a.pj!=pj)
            return a.pj<pj; //从大到小
        else if(a.ma!=ma)
            return a.ma<ma; //从大到小
        else if(a.en!=en)
            return a.en<en; //从大到小
        else if(a.th!=th)
            return a.th<th;
        else
            return a.name>name; //从小到大
    }
};
int main()
{
    int n;
    double x;
    map<string,double> m;   //创建一个映照容器m键值类型为string型,映照值为double型
    string na,s;
    Student student;    //学生类的变量名student
    multiset<Student> se;    //创建多重集合容器s(里面元素为学生类型)
    cin>>n;
    while(n--)
    {
        cin>>na;
        cin>>s>>x;
        m[s]=x;     //科目对应科目分数
        cin>>s>>x;
        m[s]=x;     //科目对应科目分数
        cin>>s>>x;
        m[s]=x;     //科目对应科目分数
        student.name=na;
        //3科绩点计算
        if(m["Math"]>=60)
            student.ma=5*(m["Math"]-50)*0.1;	//高数绩点的计算
        else
            student.ma=0;
        if(m["English"]>=60)
            student.en=4*(m["English"]-50)*0.1;	//英语绩点的计算
        else
            student.en=0;
        if(m["Theory"]>=60)
            student.th=5*(m["Theory"]-50)*0.1;	//导论绩点的计算
        else
            student.th=0;
        //平均学分绩点计算
        student.pj=(student.ma+student.en+student.th)/13.0;
        se.insert(student);  //把学生信息插入到多重集合容器中
    }
    multiset<Student>::iterator it; //定义迭代器
    for(it=se.begin();it!=se.end();it++)    //遍历最终结果
    {
        cout<<(*it).name;
        printf(" %.2lf %.2lf %.2lf %.2lf\n",(*it).pj,(*it).ma,(*it).en,(*it).th);
    }
    return 0;
}

运行结果:
在这里插入图片描述
总结:
本题练习多重集合容器,map映照容器,结构体排序函数。

猜你喜欢

转载自blog.csdn.net/qq_41657977/article/details/86701538