C语言使用do while统计学生成绩最小值错误及求最值出现次数问题
问题排查与修复方案
最低分计算错误原因
你将minimumgrade的初始值固定设为0,而所有有效成绩的取值范围都是≥0,只要输入的成绩全部大于0,grade < minimumgrade的判断条件永远不会触发,minimumgrade会始终保持初始值0,和实际最低分不符。
核心代码修复点
- 修正极值初始化逻辑
可以选择两种方案任意一种:
- 方案1:将
maximumgrade初始值设为-1,minimumgrade初始值设为20(你的有效成绩上限是19),保证第一个有效成绩一定会触发极值更新 - 方案2:第一次录入有效成绩时,直接将该成绩同时赋值给
maximumgrade和minimumgrade
- 修正平均值四舍五入失效问题
你当前的sum/counter是整数除法,会先截断小数部分再调用round(),四舍五入逻辑完全不生效,需要改为浮点运算:median = round(1.0 * sum / counter);
最高分/最低分出现次数实现建议
- 新增两个计数变量:
int max_count = 0, min_count = 0; - 每次录入有效成绩时增加判断:
- 如果当前成绩大于
maximumgrade:更新maximumgrade为当前成绩,同时将max_count重置为1 - 如果当前成绩等于
maximumgrade:max_count += 1 - 最小值判断逻辑同理:小于当前最小值时重置计数为1,等于时计数加1
- 如果当前成绩大于
中心化平均值实现思路
- 计算去掉所有极值后的总和:
centered_sum = sum - maximumgrade * max_count - minimumgrade * min_count - 计算去掉所有极值后的人数:
centered_cnt = counter - max_count - min_count - 注意增加边界判断:如果
centered_cnt == 0(所有成绩都相同),直接取线性平均值作为中心化平均值即可,否则按浮点运算计算四舍五入结果。
修复后参考代码
#include<stdio.h> #include<math.h> int main(void) { int grade,counter=0, sum=0, avg, centered_avg, maximumgrade=-1, minimumgrade=20; int max_count = 0, min_count = 0; printf("Input three or more integer values ending with a negative value.\n"); do { scanf("%d",&grade); if(grade>=0 && grade<20) { counter=counter+1; sum=sum + grade; // 处理最高分 if(grade>maximumgrade) { maximumgrade=grade; max_count = 1; }else if(grade == maximumgrade){ max_count ++; } // 处理最低分 if(grade<minimumgrade) { minimumgrade=grade; min_count = 1; }else if(grade == minimumgrade){ min_count ++; } } }while(grade >= 0); if(counter < 3) { printf("erro. sequencia invalida\n "); return 0; } avg= round(1.0 * sum / counter); printf("the linear average is %d\n", avg); printf("The maximum grade is %d, appear %d times\n",maximumgrade, max_count); printf("The minimum grade is %d, appear %d times\n",minimumgrade, min_count); // 中心化平均值计算 int centered_sum = sum - maximumgrade * max_count - minimumgrade * min_count; int centered_cnt = counter - max_count - min_count; if(centered_cnt == 0){ centered_avg = avg; }else{ centered_avg = round(1.0 * centered_sum / centered_cnt); } printf("The centered average is %d\n", centered_avg); return 0; }
内容的提问来源于stack exchange,提问作者cobaltbasalt
相关产品推荐
相关产品推荐

