You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言使用do while统计学生成绩最小值错误及求最值出现次数问题

问题排查与修复方案

最低分计算错误原因

你将minimumgrade的初始值固定设为0,而所有有效成绩的取值范围都是≥0,只要输入的成绩全部大于0,grade < minimumgrade的判断条件永远不会触发,minimumgrade会始终保持初始值0,和实际最低分不符。

核心代码修复点

  1. 修正极值初始化逻辑
    可以选择两种方案任意一种:
  • 方案1:将maximumgrade初始值设为-1,minimumgrade初始值设为20(你的有效成绩上限是19),保证第一个有效成绩一定会触发极值更新
  • 方案2:第一次录入有效成绩时,直接将该成绩同时赋值给maximumgrade和minimumgrade
  1. 修正平均值四舍五入失效问题
    你当前的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:15:06