C语言学生成绩统计程序结果异常:始终显示Fail求助
问题排查与修复
核心问题分析
你的程序始终显示Fail,核心问题集中在及格判定逻辑、变量设计和冗余代码上:
- 及格判定循环逻辑完全混乱:内层循环错误使用
i < 5作为条件,还在循环中递增i,导致根本没正确遍历每个学生的5门课程;同时没有为每个学生初始化及格状态为Pass。 - 单个
result变量无法存储多学生状态:所有学生共用一个result,只要有一个学生被判定为Fail,后续所有学生都会显示Fail。 - 平均分计算冗余:内层循环重复5次计算同一个学生的平均分,完全没必要。
result未初始化:局部变量默认是随机值,可能一开始就处于Fail状态。
修复后的代码
#include<stdio.h> int main(){ int n; printf("Enter the total number of students:\n"); scanf("%d", &n); int marks[n][5], i, j, sum[40] = {0}; float average[40]; // 用数组存储每个学生的及格结果,1=Pass,0=Fail int result[40]; // 录入成绩 for (i = 0; i < n; i++){ printf("Enter marks of student %d\n", i+1); for(j = 0; j < 5; j++) { printf("marks[%d][%d]=", i, j); scanf("%d", &marks[i][j]); } } // 计算总分 for(i = 0; i < n; i++){ for(j = 0; j < 5; j++) { sum[i] += marks[i][j]; } } // 计算平均分(去掉冗余的内层循环) for(i = 0; i < n; i++){ average[i] = sum[i] / 5.0; } // 判定及格结果 for (i = 0; i < n; i++){ // 默认设为Pass result[i] = 1; for (j = 0; j < 5; j++){ if(marks[i][j] < 50){ result[i] = 0; break; } } } // 输出结果 printf("SNo\tCPL101\tACS101\tEGP101\tPHY101\tMAT101\tSum\tAverage\tResults\n"); printf("-------------------------------------------------------------------------------------\n"); for(i = 0; i < n; i++){ printf("\n%d", i+1); for(j = 0; j < 5; j++) { printf("\t%d", marks[i][j]); } printf("\t%d\t%.2f\t", sum[i], average[i]); if (result[i] == 0) { printf("Fail"); } else{ printf("Pass"); } } return 0; }
关键修改说明
- 将单个
result变量改为数组result[40],每个元素对应一个学生的及格状态。 - 修复及格判定的内层循环:使用
j < 5作为条件,循环中递增j,正确遍历每门课程;同时为每个学生初始设置result[i] = 1(Pass),只有当某科低于50时才改为0(Fail)。 - 简化平均分计算:去掉冗余的内层循环,每个学生的平均分只计算一次。
- 增加
return 0;符合C语言标准的main函数规范。
内容的提问来源于stack exchange,提问作者Tanish Sharma
相关产品推荐
相关产品推荐

