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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 21:57:03