C语言中对.txt文件学生Subject A成绩排序时,如何保持学生信息与成绩的对应关系
解决学生成绩排序时数据关联错位的问题
我完全懂你的困扰——你现在只单独对Subject A的成绩数组做了排序,但没把对应的学生姓名、Subject B这些关联数据同步调整位置,结果自然就出现了“RAYMOND的22.5分跑到JOAN名下”这种乌龙。咱们来一步步把这个问题修好。
问题根源分析
你的代码里存在两个核心问题:
- 数据存储碎片化:你把Subject A的成绩单独存在
a数组里,但学生姓名、Subject B、学号这些数据却没有和它绑定成一个整体,而是零散地读取和存储,排序时只动了a数组,其他数据还是按原文件顺序输出,必然对应不上。 - 排序逻辑孤立:冒泡排序只处理了
a数组的元素交换,完全没考虑同步交换其他关联数据的位置,这就像把成绩单的分数栏单独排序,却没把对应的姓名栏一起挪位置,结果肯定乱套。
解决方案:用结构体打包学生完整数据
最靠谱的做法是定义一个结构体,把每个学生的姓名、学号、两门科目成绩都打包成一个整体。这样排序的时候,我们交换的是整个学生的结构体,所有关联数据都会跟着一起移动,从根本上避免错位。
第一步:定义学生结构体
先在代码开头(比如全局变量区)定义结构体:
#define SIZE 7 // 你的数据里有7个学生,根据实际情况调整 typedef struct { char name[30]; // 学生姓名 int id; // 学号 double subjectA; // Subject A成绩 double subjectB; // Subject B成绩 } Student;
第二步:重写排序函数option_ordering_A
修改后的函数会先把所有学生数据读到结构体数组里,再对结构体数组按Subject A排序,最后输出排序后的结果:
void option_ordering_A() { Student students[SIZE]; int i, j; Student temp; // 用于交换结构体的临时变量 // 先把文件指针移到文件开头 rewind(ptrCf); // 跳过文件的表头行(避免把表头当成学生数据读取) char header[100]; fgets(header, sizeof(header), ptrCf); // 读取所有学生数据到结构体数组 for (i = 0; i < SIZE; i++) { fscanf(ptrCf, "%s %d %lf %lf", students[i].name, &students[i].id, &students[i].subjectA, &students[i].subjectB); } // 按Subject A升序排序结构体数组 for (i = 0; i < SIZE - 1; i++) { for (j = i + 1; j < SIZE; j++) { // 比较两个学生的Subject A成绩,小的放前面 if (students[j].subjectA < students[i].subjectA) { // 交换整个结构体,确保所有关联数据同步移动 temp = students[i]; students[i] = students[j]; students[j] = temp; } } } // 输出排序后的结果 printf("\nSubject A in ascending order\n"); printf("%-13s%-13s%-13s\n", "STUDENT NAME", "SUBJECT A", "SUBJECT B"); for (i = 0; i < SIZE; i++) { printf("%-13s%8.1f%12.1f\n", students[i].name, students[i].subjectA, students[i].subjectB); } printf("\n"); }
第三步:清理冗余变量
原来你定义的单独数组a、b,还有零散的student_name、subject_A等变量,现在都可以用结构体数组来替代,这样代码会更整洁,也不容易出错。
验证效果
运行修改后的代码,输入命令2后,输出应该是正确关联的:
Subject A in ascending order STUDENT NAME SUBJECT A SUBJECT B RAYMOND 22.5 75.0 TANIA 49.0 75.0 TOM 53.0 54.0 JOAN 70.5 85.0 JEFF 80.0 49.5 SUSAN 89.0 90.0 KATHY 99.0 55.0
现在每个学生的姓名、两门成绩都能正确对应啦!
内容的提问来源于stack exchange,提问作者Nisleidy Santiago
相关产品推荐
相关产品推荐

