使用C语言二维数组处理学生成绩统计的问题求助
问题解决与代码重构
原代码核心问题分析
- 维度逻辑混淆:你把学生作为列、科目作为行,但输入和求和时的索引对应错误,导致数据存储与读取完全错位,这是垃圾值的主要来源。
- 数组越界风险:函数参数中固定了
marks[10][10],如果输入学生数(如20)或科目数超过10,会触发数组越界,产生垃圾值。 - 求和对象错误:循环遍历的是科目行来求和,但实际需要计算的是每个学生的总分,循环逻辑搞反了。
重构后的代码(无指针,函数化组织)
#include <stdio.h> // 输入学生成绩 void inputMarks(int students, int subjects, int marks[students][subjects]) { for (int i = 0; i < students; i++) { printf("\n=== 输入第%d位学生的成绩 ===\n", i + 1); for (int j = 0; j < subjects; j++) { printf("第%d门科目成绩: ", j + 1); scanf("%d", &marks[i][j]); // 简单输入校验,避免非法值 while (marks[i][j] < 0 || marks[i][j] > 100) { printf("成绩需在0-100之间,请重新输入: "); scanf("%d", &marks[i][j]); } } } } // 展示每位学生的各科成绩 void displayMarks(int students, int subjects, int marks[students][subjects]) { printf("\n=== 学生成绩详情 ===\n"); printf("学生序号\t"); for (int j = 0; j < subjects; j++) { printf("科目%d\t", j + 1); } printf("\n"); for (int i = 0; i < students; i++) { printf("第%d位\t\t", i + 1); for (int j = 0; j < subjects; j++) { printf("%d\t\t", marks[i][j]); } printf("\n"); } } // 计算平均分并统计不及格人数(平均分<50) int calculateStats(int students, int subjects, int marks[students][subjects]) { int failCount = 0; printf("\n=== 学生成绩统计 ===\n"); for (int i = 0; i < students; i++) { int total = 0; for (int j = 0; j < subjects; j++) { total += marks[i][j]; } float avg = (float)total / subjects; printf("第%d位学生: 总分=%d,平均分=%.1f\n", i + 1, total, avg); if (avg < 50) { failCount++; } } return failCount; } int main() { int students, subjects; printf("输入学生总数: "); scanf("%d", &students); printf("输入科目总数: "); scanf("%d", &subjects); // 使用变长数组存储成绩(C99及以上支持) int marks[students][subjects]; inputMarks(students, subjects, marks); displayMarks(students, subjects, marks); int failNum = calculateStats(students, subjects, marks); printf("\n平均分低于50分的学生人数: %d\n", failNum); return 0; }
代码说明
- 函数拆分:将输入、展示、统计功能拆分为独立函数,逻辑清晰,便于维护。
- 维度修正:改为学生为行、科目为列的存储方式,符合日常逻辑,避免索引混淆。
- 输入校验:添加成绩范围校验(0-100),避免非法输入导致的异常值。
- 无指针实现:使用C99变长数组作为函数参数,不需要指针即可传递二维数组,保证可读性。
- 统计功能:计算每位学生的平均分,同时统计平均分低于50分的学生人数。
内容的提问来源于stack exchange,提问作者Aamir Abbas
相关产品推荐
相关产品推荐

