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

C语言中对.txt文件学生Subject A成绩排序时,如何保持学生信息与成绩的对应关系

解决学生成绩排序时数据关联错位的问题

我完全懂你的困扰——你现在只单独对Subject A的成绩数组做了排序,但没把对应的学生姓名、Subject B这些关联数据同步调整位置,结果自然就出现了“RAYMOND的22.5分跑到JOAN名下”这种乌龙。咱们来一步步把这个问题修好。

问题根源分析

你的代码里存在两个核心问题:

  1. 数据存储碎片化:你把Subject A的成绩单独存在a数组里,但学生姓名、Subject B、学号这些数据却没有和它绑定成一个整体,而是零散地读取和存储,排序时只动了a数组,其他数据还是按原文件顺序输出,必然对应不上。
  2. 排序逻辑孤立:冒泡排序只处理了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 12:07:30