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
相关产品推荐
相关产品推荐

