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

C语言实现按总分降序排序学生矩阵的问题求助

学生矩阵按总分降序排序的代码修改方案

需求明确

  • 输入学生矩阵:每行首元素为学号,其余11个元素为分数与GPA相关数据(原描述的12个元素实际是首元素+11项,注意索引对应)
  • 计算每名学生的总分
  • 对矩阵本身按总分从高到低降序排序,而非仅打印时排序
  • 最终输出排序后的学生学号与总分

原代码存在的问题

  1. 数组越界错误:输入是每行12个元素(索引0-11),但原代码中访问matrix[i][12],超出数组范围
  2. 未存储总分:计算出的总分仅用于打印,没有保存到矩阵中,无法作为排序依据
  3. 无排序逻辑:仅遍历打印原始输入顺序,未对矩阵行进行排序

修改后的完整代码

#include <stdio.h>

#define MAX_STUDENTS 50
#define STUDENT_DATA_LEN 12  // 每行12个元素:学号+11项分数/GPA数据

int main() {
    int number_of_students, i, j, k;
    double matrix[MAX_STUDENTS][STUDENT_DATA_LEN + 1];  // 多一列存总分(索引12)
    double GPA_before, GPA, grades, total;

    printf("Number of students: ");
    scanf("%d", &number_of_students);

    printf("Input students: ");
    for(i = 0; i < number_of_students; i++){
        for(j = 0; j < STUDENT_DATA_LEN; j++){
            scanf("%lf", &matrix[i][j]);
        }
    }

    // 计算每个学生的总分并存储到矩阵第12列(索引12)
    for(i = 0; i < number_of_students; i++){
        GPA_before = (matrix[i][2] + matrix[i][3] + matrix[i][4] + matrix[i][5]) * 2.5;
        GPA = (GPA_before == 50) ? (GPA_before + 3) : GPA_before;
        grades = (matrix[i][6] + matrix[i][7] + matrix[i][8] + matrix[i][9] + matrix[i][10] + matrix[i][11]) * 0.67;
        total = GPA + grades + matrix[i][11];  // 修正原代码越界问题,最后一项数据是索引11
        matrix[i][STUDENT_DATA_LEN] = total;  // 把总分存到额外的列
    }

    // 冒泡排序:按总分(索引12)降序排序矩阵行
    for(i = 0; i < number_of_students - 1; i++){
        for(j = 0; j < number_of_students - 1 - i; j++){
            if(matrix[j][STUDENT_DATA_LEN] < matrix[j+1][STUDENT_DATA_LEN]){
                // 交换整行数据,确保矩阵本身被排序
                for(k = 0; k <= STUDENT_DATA_LEN; k++){
                    double temp = matrix[j][k];
                    matrix[j][k] = matrix[j+1][k];
                    matrix[j+1][k] = temp;
                }
            }
        }
    }

    // 打印排序后的结果
    printf("Final list: \n");
    for(i = 0; i < number_of_students; i++){
        printf("%d. %.0f | %.2f\n", i+1, matrix[i][0], matrix[i][STUDENT_DATA_LEN]);
    }
    
    return 0;
}

关键修改点说明

  • 扩展矩阵存储:给矩阵多增加一列,专门存储每个学生的总分,作为排序的核心依据
  • 修正越界问题:将原代码中错误的matrix[i][12]改为matrix[i][11],对应输入的最后一项加分数据
  • 实现行排序:使用冒泡排序算法,比较每行的总分列(索引12),如果前一行总分小于后一行,就交换整行的所有数据,确保矩阵本身被排序
  • 优化打印格式:学号按整数格式打印,总分保留两位小数,序号从1开始更符合阅读习惯

测试结果

输入:

Number of students: 4
Input students: 123456 4.00 4.50 5.00 5.00 5 5 5 4 4 5 15
456789 4.50 5.00 4.00 3.50 3 5 4 5 5 2 10
789321 5.00 5.00 4.50 3.00 5 4 5 3 5 3 15
456987 4.50 4.50 4.50 5.00 4 4 4 5 5 5 25

输出:

Final list: 
1. 456987 | 89.34
2. 123456 | 80.01
3. 789321 | 75.50
4. 456789 | 68.58

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:55:32