C语言while循环练习:输入分数前是否需校验合法性?如何优化代码?
问题解答
思考方向判断
你的思考方向完全正确,主动考虑输入合法性校验是非常好的编程习惯,远优于只完成基础要求的写法。
现有代码的核心漏洞
- 循环条件逻辑运算符错误:你用了
||(或)判断score > 0 || score <=100,这个条件对所有整数都成立,完全起不到区间校验的作用,应该换成&&(且)才表示同时满足大于等于0、小于等于100。 - 统计逻辑位置错误:你把
count++和sum += score写在校验之前,不管输入是-1还是非法分数,都会被统计到总和和次数里,最后还要靠sum+1来抵消-1的影响,写法不严谨也容易出错。 - 边界值遗漏:你写的是
score > 0,漏掉了0分这个合法值。
顺便提一句,你老师给出的参考代码也有逻辑问题:它会把输入的-1也计入总次数和总和,所以才需要最后输出sum+1,同时平均值计算时的count也包含了终止输入的那次,计算结果是不准确的。
修正后的代码
#include <stdio.h> int main(void) { int score = 0; int sum = 0; int count = 0; while (1) // 无限循环,内部判断退出条件 { printf("輸入一個介於0~100的整數(-1結束):"); scanf("%d", &score); // 先判断是否终止输入 if (score == -1) { break; } // 校验分数合法性,合法才统计 if (score >= 0 && score <= 100) { sum += score; count++; } else { printf("输入不合法,请输入0~100之间的分数\n"); } } // 避免用户直接输入-1时出现除以0的运行错误 if (count == 0) { printf("未输入有效分数\n"); } else { printf("加總: %d 平均: %f", sum, (double)sum / count); } return 0; }
代码说明
- 用
while(1)做无限循环,内部先判断输入是否为-1,符合条件直接退出,避免把终止值统计进去 - 合法性校验通过后才执行累加和计数逻辑,不需要额外修正sum的值
- 增加了count为0的判断,覆盖用户未输入任何有效分数直接终止的场景
内容的提问来源于stack exchange,提问作者JimBigMac
相关产品推荐
相关产品推荐

