Problem C: 合唱比赛开始了!
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1122 Solved: 628
[ Submit][ Status][ Web Board]
Description
为迎接计算机科技文化节的到来,我院面向一年级学生举办了一场合唱比赛。邀请了若干位专家担任评委,并为每个参赛队评分。现在,请设计一个程序来展示这个比赛过程。
其中,类 Team描述了参赛队的信息,包括:专业名称、每个专家给该参赛队的评分以及最终得分等。类Contest描述了竞赛的信息,包括各个参赛队的列表,并提供
1. void Input()方法:用于输入所有参赛队的信息;
2. void Compute()方法:计算每个代表带队的最终得分。
3. void Show()方法:显示所有代表队的信息。
4. void Sort()方法:根据代表队的最终得分进行排序。
要求:
1. 假设有M个代表队参加比赛,有N个评委进行评分,且评分标准包括P项。
2. 每个评委将为每个代表队打出P个分项分,每项得分都在0~100之间,一个评委为一个代表队评出的最终分数是所给出的所有分项分的平均分。如:P=3,评委1给代表队x打的3个分数为100,90,80,则x代表队得到的来自于评委1的分数为(100+90+80)/3=90。
3. 每个代表队得到的最终分数是N个评委的给出的N个分数值,去掉1个最高分,1个最低分,剩余分数的平均值。如:经过上一步的计算,x代表队得到的来自N=4个评委的得分分别是100,90,80,70,则x代表队的最终得分是(90+80)/2=85。
Input
输入有多行。第一行分别输入M>1,N>3,P>0表示代表队数量、评委人数以及评分标准数。
之后分别输入M个代表的信息。每个代表队信息的第一行是队伍的专业名(10个字母以内),之后的N行是N个评委为该代表队打的分数,其每行有P个数,分别是该评委为该代表队打出的各个分项分。
Output
输出有M行,根据每个代表队的得分,按照从大到小的顺序输出。其中专业名称靠左输出,占11个字符,之后输出成绩。成绩输出2位小数。假定所有队伍的得分都不相同。
Sample Input
Sample Output
HINT
用left来让输出左对齐。
Append Code
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <sstream>
#include <string>
#include <iomanip>
#include <cmath>
using namespace std;
class Contest;
class Team
{
friend class Contest;
public:
string name;
double score[10][10];
double sum[10];
double ave;
Team() :ave(0)
{
memset(score, 0, sizeof(score));//如何对类中的数组赋初值!
memset(sum, 0, sizeof(sum));
}
};
class Contest
{
friend class Team;
public:
Team team[10];
int M, N, P;
void Input()
{
cin >> M >>N >> P;
for (int i = 0; i<M; i++)
{
cin >> team[i].name;//队伍名称
for (int j = 0; j<N; j++)
{
for (int k = 0; k < P; k++)
{
cin >> team[i].score[j][k];
team[i].sum[j] += team[i].score[j][k];
}
team[i].sum[j] = team[i].sum[j] / P;//平均分
}
}
for (int i = 0; i < M; i++)
{
double ma = team[i].sum[0], mi = team[i].sum[0];
for (int j = 0; j < N; j++)
{
if (ma < team[i].sum[j])
ma = team[i].sum[j];
if (mi > team[i].sum[j])
mi = team[i].sum[j];
team[i].ave = team[i].sum[j] + team[i].ave;
}
team[i].ave = team[i].ave-ma-mi;
}
}
void Compute()
{
for (int i = 0; i<M; i++)
{
team[i].ave = team[i].ave / (N - 2);
}
}
void Show()
{
for (int i = 0; i<M; i++)
{
cout << setiosflags(ios::left) << setw(11) << team[i].name;;
cout << fixed << setprecision(2) << team[i].ave << endl;
}
}
void Sort()
{
for (int i = 0; i<M - 1; i++)
{
for (int j = 0; j<M - i - 1; j++)
{
if (team[j].ave <team[j + 1].ave)
{
Team temp;
temp = team[j];
team[j] = team[j + 1];
team[j + 1] = temp;
}
}
}
}
};
int main()
{
Contest contest;
contest.Input();
contest.Compute();
contest.Sort();
contest.Show();
return 0;
}
1.对数组进行初始化memset(a,0,sizeof(a));准确地说应该是赋值操作