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

C语言循环程序实现:输入0终止、排除负数计算平均值问题

结论

这份参考代码完全不符合需求,存在多处逻辑错误、未定义行为,同时还有多处可优化空间。

现有代码的具体问题

  • 变量未初始化:count变量定义时未赋值初始值,运行时会读取栈上的随机值,计数逻辑从一开始就是错误的,属于C语言的未定义行为。
  • 计数逻辑错误:需求只统计有效正数输入,但代码里不管输入是负数、还是作为终止条件的0,都会给count加1,平均值的分母完全不符合要求。
  • 平均值类型错误:average被定义为int类型,sum是双精度浮点数,赋值时会直接截断小数部分,完全达不到最终输出1位小数的要求。
  • 无效计算:平均值计算放在循环内部,每次输入都重复计算,完全没有必要,仅需循环结束后计算一次即可。
  • 边界情况未处理:如果用户第一次输入就输入0,没有任何有效正数输入,代码会直接计算出0的错误结果,没有对应的提示逻辑。
  • 无异常输入处理:如果用户输入非数字内容,scanf会执行失败,number的值不会更新,程序会进入死循环。

优化方案

核心逻辑修正点

  • 所有变量初始化:sum初始设为0.0,count初始设为0
  • 仅当输入值大于0时,才累加sum同时给count加1,负数和终止值0不参与计数
  • 将average改为double类型,循环结束后再计算平均值
  • 增加边界判断:循环结束后如果count为0,直接提示无有效输入,否则再计算输出平均值
  • 增加scanf返回值判断,处理非法输入场景

优化后参考代码

#include <stdio.h>

int main() {
    double number, sum = 0.0, average;
    int count = 0;
    int scanf_ret;

    while (1) {
        printf("Enter a number: ");
        scanf_ret = scanf("%lf", &number);
        // 处理非法输入
        if (scanf_ret != 1) {
            printf("输入错误,请输入有效数字\n");
            // 清空输入缓冲区,避免死循环
            while(getchar() != '\n');
            continue;
        }
        // 输入0直接终止循环
        if (number == 0) {
            break;
        }
        // 仅统计正数
        if (number > 0) {
            sum += number;
            count++;
        }
    }

    if (count == 0) {
        printf("无有效正数输入,无法计算平均值\n");
    } else {
        average = sum / count;
        printf("Average is %.1lf\n", average);
    }

    return 0;
}

内容的提问来源于stack exchange,提问作者zach

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:15:03