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

运行C语言成绩统计代码时触发浮点异常的原因排查

C语言成绩统计程序运行异常的原因及修复方案

你的程序在VSCode中无输出直接终止、在线编译器报浮点异常,核心原因有两个:

1. 未初始化变量引发未定义行为

你声明了int pass, fail, spass, sfail, avg = 0;,但仅avg被初始化为0,pass、fail、spass、sfail的初始值是内存中的随机垃圾数据。当执行fail = fail + 1或sfail = score + sfail这类累加操作时,会基于垃圾值计算,导致程序行为不可预测,这也是VSCode中程序异常终止的潜在诱因。

2. 整数除以零触发浮点异常

循环终止条件是enteries != 0,循环结束后enteries的值必然为0。此时执行avg = sum / enteries;相当于整数除以0,这在C语言中属于未定义行为,会直接触发浮点异常——这就是在线编译器明确报错的原因,程序因此崩溃,无法输出结果。

此外还有一个潜在问题:若输入的成绩不在0-100范围内,enteries不会递减,循环会陷入死循环,但这不是当前崩溃的直接原因。


修复后的代码

#include <stdio.h>

int main(){
    int enteries; 
    printf("请输入学生人数:");
    scanf("%d", &enteries); 

    // 初始化所有统计变量为0,避免垃圾值干扰
    int pass = 0, fail = 0, spass = 0, sfail = 0, avg = 0;
    
    // 保存初始人数,用于后续计算平均值
    int total_students = enteries;

    while (enteries != 0){
        int score;
        printf("请输入成绩:"); 
        scanf("%d", &score); 
        
        // 校验成绩有效性,避免死循环
        if (score < 0 || score > 100) {
            printf("无效成绩,请输入0-100之间的数值\n");
            continue;
        }

        if (score < 60){
            fail++; 
            sfail += score;
            enteries--;
        }
        else{
            pass++; 
            spass += score;
            enteries--; 
        }
    } 

    int sum = spass + sfail; 
    // 使用初始人数计算平均值,避免除以0
    if (total_students != 0) {
        avg = sum / total_students; 
        printf("平均成绩:%d\n", avg);  
    } else {
        printf("未输入有效学生人数\n");
    }

    return 0; 
}

修改说明

  • 初始化所有统计变量为0,消除垃圾值对计算的影响。
  • 新增total_students保存初始学生人数,解决循环后enteries为0导致的除以零问题。
  • 增加成绩范围校验,防止无效输入引发死循环。
  • 增加边界判断,处理学生人数为0的特殊情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 09:10:35