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

使用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;
}

代码说明

  1. 函数拆分:将输入、展示、统计功能拆分为独立函数,逻辑清晰,便于维护。
  2. 维度修正:改为学生为行、科目为列的存储方式,符合日常逻辑,避免索引混淆。
  3. 输入校验:添加成绩范围校验(0-100),避免非法输入导致的异常值。
  4. 无指针实现:使用C99变长数组作为函数参数,不需要指针即可传递二维数组,保证可读性。
  5. 统计功能:计算每位学生的平均分,同时统计平均分低于50分的学生人数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:20:00