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

C语言学生成绩按总分排名升序排序功能代码整合求助

整合步骤与代码修正

首先修正教授给出的示例代码中的笔误,再按以下步骤整合即可:

1. 先添加结构体复制函数到代码头部

将cpyStudentScore函数放在scoreCalculatorWithName函数之前,注意确保你的代码已经引入<string.h>头文件(strcpy依赖该头文件):

#include <string.h> // 若代码中已引入则无需重复添加
void cpyStudentScore(STUDENT_SCORE *d1, STUDENT_SCORE *d2){
    d1->number = d2->number;
    strcpy(d1->name, d2->name);
    d1->kor = d2->kor;
    d1->eng = d2->eng;
    d1->math = d2->math;
    d1->tot = d2->tot;
    d1->avg = d2->avg;
    d1->rnk = d2->rnk;
}

2. 插入排序逻辑到现有业务流程

排序逻辑需要放在计算完总分、平均分、排名之后,写入输出框之前的位置,同时修正教授给出的排序代码的参数笔误,修改后的scoreCalculatorWithName函数如下:

void scoreCalculatorWithName (HWND hwnd, HWND hSrc, HWND hDst)
{
    int stdNum;
    STUDENT_SCORE stdScore[MAX_STUDENT_NUM];
    STUDENT_SCORE tmp; // 新增:排序用的临时存储变量

    if (readScoreNameFromEdit (hSrc, stdScore, &stdNum) == FALSE) {
        MessageBox (hwnd, 
                    "The number of students is out of the storage range.", 
                    "Structure grade processing.", 
                    MB_OK);
        return;
    };

    // 原有逻辑:计算总分、平均分
    for (int i = 0; i < stdNum; i++) {
        stdScore[i].tot = stdScore[i].kor + stdScore[i].math + stdScore[i].eng;
        stdScore[i].avg = (float) stdScore[i].tot / 3;
    }

    // 原有逻辑:计算排名
    for (int i = 0; i < stdNum; i++) {
        stdScore[i].rnk = 1;
        for (int j = 0; j < stdNum; j++) {
            if (stdScore[i].tot < stdScore[j].tot)
                stdScore[i].rnk++;
        }
    }

    // 新增:排序逻辑,默认按总分降序(排名高的在前)
    for(int i=0; i < stdNum-1; i++){
        for(int j=0; j < stdNum-1-i; j++){
            // 排序规则可按需修改:
            // 1. 按总分升序:把 < 改为 >
            // 2. 按平均分排序:把 tot 替换为 avg,搭配比较符号控制升降序
            // 3. 按排名升序(第1名在前):把 tot 替换为 rnk,同时把 < 改为 >
            if(stdScore[j].tot < stdScore[j+1].tot){
                cpyStudentScore(&tmp, &stdScore[j]); // 修正了原示例的参数错误
                cpyStudentScore(&stdScore[j], &stdScore[j+1]);
                cpyStudentScore(&stdScore[j+1], &tmp);
            }
        }
    }

    // 原有逻辑:输出结果
    writeScoreNameToEdit (hDst, stdScore, stdNum);
}

修改后排序会整体交换学生结构体数据,原有学生编号会跟着对应学生走,完全符合「忽略原始编号、仅按排名顺序排列」的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:36:00