zoukankan      html  css  js  c++  java
  • C++实现按绩点排名

    题目内容:有一些班级的学生需要按绩点计算并排名。每门课的成绩只有在60分以上(含),才予以计算绩点。课程绩点的计算公式为:(课程成绩-50÷10×学分数。一个学生的总绩点为其所有课程绩点总和除以10.

    输入描述:输入数据中含有一些班级(数量≤20)。第一行为班级数量。每个班级的第一行数据为n≤10),表示该班级共有n门课程。每个班级的第二行数据为a1,a2,a3,……,an,表示每门课程的学分。班级数据中的第三行数据为一个整数m≤50),表示本班级有m个学生;班级数据接下去有m行对应m个学生数据;每行学生数据中的第一个为字串s1(s1中间没有空格),表示学生姓名,后面跟有n个整数s1,s2,s3,……sn,表示该学生各门课程的成绩(0≤si ≤100).

    输出描述:以班级为单位输出各个学生按绩点分从大到小的排名。如果绩点分相同,则按学生名字的ASCII串值从小到大排名。每个班级的排名输出之前应先给出一行,描述班级序号“class #:”(#表示班级序号),班级之间应空出一行。排名时,每个学生占一行,列出名字和总绩点。学生输出宽度为10个字符,左对齐,在空出一格后列出总绩点。

    题目分析:

    (1)定义一个正整数作为班级数;定义一个正整数作为课程数量;定义一个double变量作为学分;定义一个double型向量容器存储学分;定义一个正整数作为班级人数;定义一个结构体存储学生的名称和总绩点;定义一个字符串变量作为学生名称;定义一个元素为结构体的向量容器存储最终学生名称和总绩点

    (2)从键盘读入班级数

    (3)对每个班级,从键盘读入课程数量,再读入每门课程的学分,并将每个学分插入到向量容器中

    (4)对每个班级中的每个学生,从键盘读入学生名称,存储在结构体中

    (5)对每个班级中的每个学生的每门课程,读入成绩,若成绩小于60,则继续读入下一门课程的成绩,否则计算该课程的绩点

    (6)对每个班级中的每个学生,计算其总绩点,存储在结构体中,并插入向量容器

    (7)编写比较函数,若总绩点不相等则按总绩点从大到小的顺序返回,若总绩点相等则按学生名字从小到大的顺序返回

    (8)将向量容器中的元素按比较函数排序

    (9)对向量容器中的每个元素,格式化输出其信息

    参考代码:

    #include <fstream>
    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    #include <iomanip>
    
    using namespace std;
    
    struct student
    {
        string s;
        double d;
    };
    
    bool myComp(const student &s1,const student &s2)
    {
        if(s1.d!=s2.d) return s1.d>s2.d;
        if(s1.s!=s2.s) return s1.s<s2.s;
    }
    
    int main(int argc,char * argv[])
    {
        int n;
        int c;
        double xf;
        vector<double> vxf;
        int p;
        string name;
        double score;
        student xs;
        vector<student> vxs;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            cin>>c;
            for(int j=0;j<c;j++)
            {
                cin>>xf;
                vxf.push_back(xf);
            }
            cin>>p;
            for(int k=0;k<p;k++)
            {
                cin>>name;
                xs.s=name;
                xf=0.0;
                for(int m=0;m<c;m++)
                {
                    cin>>score;
                    if(score<60) continue;
                    xf=xf+(score-50)/10*vxf[m];
                }
                xs.d=xf/10;
                vxs.push_back(xs);
            }
            cout<<(i?"
    ":"");
            cout<<"Class "<<i+1<<":"<<endl;
            sort(vxs.begin(),vxs.end(),myComp);
            for(vector<student>::iterator it=vxs.begin();it<vxs.end();it++)
            {
                cout<<fixed<<setprecision(2);
                cout<<left<<setw(11);
                cout<<(*it).s<<(*it).d<<endl;
            }
            vxf.clear();
            vxs.clear();
        }
        system("pause");
        return 0;
    }
    

    运行结果:

  • 相关阅读:
    BZOJ5057 : 区间k小值5
    Urozero Autumn 2016. UKIEPC 2016
    BZOJ2808 : 那些年我们画格子
    BZOJ4970 : [ioi2004]empodia 障碍段
    XVII Open Cup named after E.V. Pankratiev. XXI Ural Championship
    BZOJ4316 : 小C的独立集
    网络流(3)——找到最小st-剪切
    网络流(2)——用Ford-Fullkerson算法寻找最大流
    网络流(1)——网络、流网络和网络流
    退而求其次(4)——椭圆中的最大矩形
  • 原文地址:https://www.cnblogs.com/cysolo/p/3381368.html
Copyright © 2011-2022 走看看