C语言实现按总分降序排序学生矩阵的问题求助
学生矩阵按总分降序排序的代码修改方案
需求明确
- 输入学生矩阵:每行首元素为学号,其余11个元素为分数与GPA相关数据(原描述的12个元素实际是首元素+11项,注意索引对应)
- 计算每名学生的总分
- 对矩阵本身按总分从高到低降序排序,而非仅打印时排序
- 最终输出排序后的学生学号与总分
原代码存在的问题
- 数组越界错误:输入是每行12个元素(索引0-11),但原代码中访问
matrix[i][12],超出数组范围 - 未存储总分:计算出的总分仅用于打印,没有保存到矩阵中,无法作为排序依据
- 无排序逻辑:仅遍历打印原始输入顺序,未对矩阵行进行排序
修改后的完整代码
#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
相关产品推荐
相关产品推荐

