C语言代码:for循环内if多分支仅首个匹配条件生效问题咨询
C语言平均分等级判定逻辑异常问题分析
需求说明
希望代码能计算所有学生的平均分,并在打印每个学生的平均分后判定其等级。
原代码
#include <stdio.h> int main() { int stud_rlno[8], phy_marks[8], chem_marks[8], bio_marks[8], CS_marks[8], average; int i; for(int i = 0; i < 1; ++i) { printf("Enter the roll number of student %d: ", i); scanf("%d", &stud_rlno[i]); printf("Enter the physics marks of student %d: ", i); scanf("%d", &phy_marks[i]); printf("Enter the chemistry marks of student %d: ", i); scanf("%d", &chem_marks[i]); printf("Enter the biology marks of student %d: ", i); scanf("%d", &bio_marks[i]); printf("Enter the CS marks of student %d: ", i); scanf("%d", &CS_marks[I]); } for(int i = 0; i <= 1; i++) { average = phy_marks[i] + chem_marks[i] + bio_marks[i] + CS_marks[i]; printf("The average of student is %d \n", average / 4); if(average > 90) { printf("Grade A \n"); } else if(average <= 90 && average > 82) { printf("Grade B \n"); } else if(average <= 82 && average > 75) { printf("Grade C \n"); } else if(average <= 75 && average > 65) { printf("Grade D \n"); } else if(average <= 65) { printf("Grade E \n"); } else { printf("Fail"); } } }
问题原因分析
- 变量大小写错误:输入CS成绩的语句
scanf("%d", &CS_marks[I]);中,数组下标用了大写I,但循环变量是小写i,这会导致程序读取未定义的内存地址,CS_marks[i]的值为随机垃圾值,直接破坏总分计算。 - 循环次数不匹配:输入循环仅执行1次(
i < 1),只能录入1个学生的数据;但输出循环执行2次(i <=1),第二次循环访问的是未初始化的数组元素,计算出的总分完全随机。 - 等级判定逻辑颠倒:你用总分
average做等级判断,但逻辑阈值是按平均分设定的。比如4科总分满分为400,average >90这个条件几乎所有有效成绩都会满足,导致只会触发第一个if分支,后续else if永远不会执行。正确的做法应该用平均分(average /4)来做等级判断。
修正后的代码示例
#include <stdio.h> int main() { const int MAX_STUDENTS = 8; int stud_rlno[MAX_STUDENTS], phy_marks[MAX_STUDENTS], chem_marks[MAX_STUDENTS], bio_marks[MAX_STUDENTS], CS_marks[MAX_STUDENTS]; int i, total, average; int student_count; printf("Enter number of students (max 8): "); scanf("%d", &student_count); if(student_count > MAX_STUDENTS) student_count = MAX_STUDENTS; for(i = 0; i < student_count; ++i) { printf("\nEnter details for student %d:\n", i+1); printf("Roll number: "); scanf("%d", &stud_rlno[i]); printf("Physics marks: "); scanf("%d", &phy_marks[i]); printf("Chemistry marks: "); scanf("%d", &chem_marks[i]); printf("Biology marks: "); scanf("%d", &bio_marks[i]); printf("CS marks: "); scanf("%d", &CS_marks[i]); } for(i = 0; i < student_count; i++) { total = phy_marks[i] + chem_marks[i] + bio_marks[i] + CS_marks[i]; average = total / 4; printf("\nStudent %d (Roll No: %d):\n", i+1, stud_rlno[i]); printf("Average marks: %d \n", average); if(average >= 90) { printf("Grade A \n"); } else if(average >= 83 && average <90) { printf("Grade B \n"); } else if(average >=76 && average <83) { printf("Grade C \n"); } else if(average >=66 && average <76) { printf("Grade D \n"); } else if(average >=0 && average <66) { printf("Grade E \n"); } else { printf("Invalid marks \n"); } } return 0; }
内容的提问来源于stack exchange,提问作者swat08
相关产品推荐
相关产品推荐

