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
相关产品推荐
相关产品推荐

