.题目内容:
输入若干学生的成绩,统计各班的成绩的平均值,并按班级名称的机内码从小到大排序输出。
学生成绩信息包括:班级,学号和成绩。班级名称是”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;
}
- 这题在输入的时候就将相同班级的学生放在一个班级对象中,某一班级增加学生时就改变成员变量总分和总人数,当输入结束也就确定了该班级的总分和总人数,后面只要遍历班级对象就行。