题目描述:
在浙大的计算机专业课中,经常有互评分组报告这个环节。一个组上台介绍自己的工作,其他组在台下为其表现评分。最后这个组的互评成绩是这样计算的:所有其他组的评分中,去掉一个最高分和一个最低分,剩下的分数取平均分记为 G1;老师给这个组的评分记为 G2。该组得分为 (G1+G2)/2,最后结果四舍五入后保留整数分。本题就要求你写个程序帮助老师计算每个组的互评成绩。
输入格式:
输入第一行给出两个正整数N(> 3)和M,分别是分组数和满分,均不超过100。随后N行,每行给出该组得到的N个分数(均保证为整型范围内的整数),其中第1个是老师给出的评分,后面 N-1 个是其他组给的评分。合法的输入应该是[0, M]区间内的整数,若不在合法区间内,则该分数须被忽略。题目保证老师的评分都是合法的,并且每个组至少会有3个来自同学的合法评分。
输出格式:
为每个组输出其最终得分。每个得分占一行。
输入样例:6 50 42 49 49 35 38 41 36 51 50 28 -1 30 40 36 41 33 47 49 30 250 -25 27 45 31 48 0 0 50 50 1234 43 41 36 29 42 29输出样例:
42 33 41 31 37 39
题目分析:
本题目的要求再读入每一个互评成绩时,进行检查成绩是否有效。无效的成绩需要忽略。笔者设置了一个函数judge对每次的互评成绩进行判断。如果成绩满足要求了,将其加入到求和变量中,并设置max min记录当前录入的有效成绩的最大值和最小值。最后sum-max-min即是小组互评的总成绩。另外需要对有效成绩进行计数。老师的评分单独记录到teacher中。每处理完一个小组的互评成绩,求得其平均分记录到对应的avg[]数组当中。
代码如下:
#include<stdio.h>
#include<math.h>
const int maxn=1000;
bool judge(int a,int m){ //判断所录入的成绩是否有效。
if(a>=0&&a<=m){
return true; //在题目要求的范围内,返回true
}
else return false; //无效成绩返回false
}
int main()
{
int n,m,teacher,avg[maxn];//小组数n,满分m,老师对当前录入成绩的小组的评分teacher,最后每组的平均成绩数组avg[]。
int max,min,gro,sum,count; //记录当前录入成绩小组的最高分max min,其他小组对该小组的评分gro,该小组当前的有效成绩和sun,有效成绩个数count
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){ //循环n次,每次处理一个小组
scanf("%d",&teacher); //先读入老师的对该小组评分
sum=0; //相应变量置零。
count=0;
max=0;min=100;
for(int j=1;j<n;j++){ // 每次处理一个互评成绩
scanf("%d",&gro); //读入互评成绩
if(judge(gro,m)){ //判断是否有效
sum+=gro; //若有效,则加入到求和项
count++; //有效成绩个数加一
if(max<gro){
max=gro; //更新max,min
}
if(min>gro){
min=gro;
}
}
}
//printf("%d %d %d\n",max,min,sum) ;
avg[i]=(int)round((double)((sum-max-min)/(count-2)+teacher)/2); //sum-max-min即是求小组互评成绩的总分,count要减去最大成绩和最小成绩的两个有效成绩
} //要记得强制类型转换。
for(int i=0;i<n;i++){
printf("%d\n",avg[i]); //按照格式输出每个小组的最终平均成绩。
}
}