题目
分析
本题明确说:有n个学生,每个学生都有m个成绩。每个学生的最终成绩都用同一个算法得出。所以,我们应该将这个计算每个学生最终成绩的算法(过程)提炼(“重构”)为一个函数。这个函数很直接:在所有成绩中找到最高分、最低分,同时算出总成绩,再减去最高分和最低分即可。
int getFinalScore(vector<int> scores)
{
int mins = 10, maxs = 0;
int total = 0;
for (int i = 0; i < scores.size(); i++)
{
if (scores[i] < mins)
{
mins = scores[i];
}
if (maxs < scores[i])
{
maxs = scores[i];
}
total += scores[i];
}
return total - mins - maxs;
}
注意,我们这里用STL中的vector来传递包含成绩的数组,所以不用额外传递一个表示数组大小的参数,而是可以在函数内部用scores.size()得到。
对于n个学生,我们输入每个学生的m个成绩,调用getFinalScore获得最终成绩,然后“打擂台”保存最高的成绩。
for (int i = 1; i <= n; i++)
{
vector<int> scores(m, 0);
for (int j = 0; j < m; j++)
{
cin >> scores[j];
}
max_score = max(max_score, getFinalScore(scores));
}
最后,按照题目要求输出。(你当然不会忘记,整数除以整数的结果是一个整数,对吧?所以我们要先用1.0乘以最高分而得到一个浮点数。)
答案

思考
我们声明的函数,在传递参数时用的是传值传递:int getFinalScore(vector<int> scores),也就是说在主程序调用这个函数并传递scores的时候,会拷贝一份传过去。
按照C++的最佳实践,最好的声明方法是int getFinalScore(const vector<int> &scores),也就是传递一个const的引用。这样我们可以避免传值(因为是引用传递),且保证原始数据不被修改(因为是const引用)。这样的传递方式和函数声明属于高级内容,在竞赛时一般不用考虑。
另外,我们没有对m进行检查。万一m<=2怎么办?题目中没有给出m的取值范围,但从代码最终能AC来看,显然这个边界情况在测试数据中不会出现。
