多关键词排序问题

描述

学生考试成绩的统计利用计算机软件将变得十份简单的事,如果一个年级的学生参加了有语文、数学和英语三科目的考试,需要计算出每个学生的总分和平均成绩,并且要按照总分排序,如果总分相同,则依照语文、数学再英语的成绩排序,即排序关键词依次为总分、语文、数学、英语。请你设计一个程序解决该问题。

输入

第一行为一个正整数N,表示该年纪共有的学生数,接下来的N行,每行为一个学生的信息,依次为学号、班级、语文成绩、数学成绩和英语成绩,其中学号为10个字符的字符串,班级和成绩为正整数,他们之间由一个空格隔开。

输出

输出该年级学生的成绩单,即根据总分和语文、数学、英语成绩为次关键词的排序后的成绩单,每行输出一个学生的成绩,使用一个空格隔开,依次输出如下数据:学号 班级 语文 数学 英语 总分 平均其中平均成绩四舍五入保留2位小数。

样例输入

4
0806401001 1 56 64 77
0806401002 1 75 68 54
0806401003 1 68 79 76
0806401004 1 56 57 84

样例输出

0806401003 1 68 79 76 223 74.33
0806401002 1 75 68 54 197 65.67
0806401001 1 56 64 77 197 65.67
0806401004 1 56 57 84 197 65.67

#include<iostream>
using std::cin;
using std::cout;
using std::endl;
using std::swap;
using std::ostream;
using std::istream;
#include<string>
using std::string;

const float TOTAL_SUBJECT = 3.0;
const size_t MAX_SIZE = 1000;

class Student{
public:
    friend ostream& operator << (ostream& out, Student& example);
    friend istream& operator >> (istream& in, Student& example);
    bool is_bigger_than(Student& aim){
        return (total_grade > aim.total_grade)
            || (total_grade == aim.total_grade && chinese_grade > aim.chinese_grade)
            || (total_grade == aim.total_grade && chinese_grade == aim.chinese_grade && math_grade > aim.math_grade)
            || (total_grade == aim.total_grade && chinese_grade == aim.chinese_grade && math_grade == aim.math_grade && english_grade > aim.english_grade);
    }
private:
    string student_no;
    unsigned short int class_no;
    unsigned short int chinese_grade;
    unsigned short int math_grade;
    unsigned short int english_grade;
    unsigned short int total_grade;
    float average_grade;
};

ostream& operator << (ostream& out, Student& example){
    cout.setf(std::ios::fixed);
    cout.precision(2);
    out << example.student_no << " " << example.class_no << " "
        << example.chinese_grade << " " << example.math_grade << " " << example.english_grade <<" "
        << example.total_grade << " " << example.average_grade << endl;
    return out;
}

istream& operator >> (istream& in, Student& example){
    in >> example.student_no >> example.class_no
        >> example.chinese_grade >> example.math_grade >> example.english_grade;
    example.total_grade = example.chinese_grade + example.math_grade + example.english_grade;
    example.average_grade = example.total_grade / TOTAL_SUBJECT;
    return in;
}

int main(void){
    Student person[MAX_SIZE];
    size_t i, j, size;
    while (cin >> size){
        for (i = 0; i != size; ++i){
            cin >> person[i];
        }
        for (j = 0; j != size; ++j){
            for (i = 0; i != size-j-1; ++i){
                if (!person[i].is_bigger_than(person[i+1])){
                    swap(person[i], person[i+1]);
                }
            }
        }
        for (i = 0; i != size; ++i){
            cout << person[i];
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值