C++ 西安交通大学 Mooc 期末考试题

3 篇文章 0 订阅

.题目内容:
输入若干学生的成绩,统计各班的成绩的平均值,并按班级名称的机内码从小到大排序输出。
学生成绩信息包括:班级,学号和成绩。班级名称是”000”’时表示成绩输入结束。
班级名称不超过20字符,学号不超过10个字符,成绩为整数,平均成绩为双精度实数,保留三位小数。班级数不超过10个,总人数不超过100个。

输入格式:
若干行,每行信息包括班级,学号和成绩,用空格隔开,
最后一行为:000 000 000

输出格式:
若干行,每行信息包括:班级和平均成绩,中间用一个空格隔开。行数由输入中的班级数确定。

输入样例:
航天 001 80
信计 001 90
航天 002 70
航天 003 80
信计 002 91
000 000 000

输出样例:
航天 76.667
信计 90.500
时间限制:500ms内存限制:32000kb

#include <iostream>
#include <cstring>
#include <iomanip>
#define StudentMaxNum 101
#define ClassMaxNum 11
using namespace std;

//学生类 
class Stu{
    private:
        string className;//班级名 
        string studentID;//学号 
        int score;//得分 

    public:
        Stu(string c, string ID, int s) : className(c), studentID(ID), score(s){}
};

//班级类
class C{
    private:
        Stu *s[StudentMaxNum];//动态增加该班级学生 

    public:
        int studentNum;
        int sumScore;
        string className1;
        C(string c, string ID, int s1);
        void AddStu(string c, string ID, int s1);//不管是否班级已存在,都会增加学生 
        ~C(){
            int i;

            for(i = 0; s[i] != NULL; i++){
                delete s[i];
            }
            delete this;
        }
}; 

C::C(string c, string ID, int s1)
{
    className1 = c;
    studentNum = sumScore = 0;
    AddStu(c, ID, s1);  
} 

void C::AddStu(string c, string ID, int s1)
{
    s[++studentNum] = new Stu(c, ID, s1);
    sumScore += s1;
}

//判断刚读入的班级名是否已成立,是返回班级指针的下标,否返回此次创建班级指针的下标 
int IfCreatedClass(string cName, C *c[])
{
    int i;

    for(i = 1; c[i] != NULL; i++){
        if(c[i]->className1 == cName){
            return i;
        }
    }
    return -i;
}

int main()
{
    C *c[ClassMaxNum] = {NULL}; //从1开始存放 
    string cName;
    string stuID;
    int score, flag;
    int i;

    cin >> cName;
    while(cName != "000"){
        cin >> stuID >> score;
        flag = IfCreatedClass(cName, c);
        if(flag > 0){//已创建 
            c[flag]->AddStu(cName, stuID, score); 
        }else if(flag < 0){
            flag = -flag;
            c[flag] = new C(cName, stuID, score);
        }
        cin >> cName;
    }

    for(i = 1; c[i] != NULL; i++){
        cout << c[i]->className1 << " " ;
        cout << fixed << setprecision(3) <<((double)c[i]->sumScore)/c[i]->studentNum << endl;
    }

    return 0;
}
  1. 这题在输入的时候就将相同班级的学生放在一个班级对象中,某一班级增加学生时就改变成员变量总分和总人数,当输入结束也就确定了该班级的总分和总人数,后面只要遍历班级对象就行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值