Dev C++学生成绩统计程序新增总分排名功能实现问询
修改后的可运行代码
#include <windows.h> #define BUFF_SIZE 1024 #define MAX_STUDENT_NUM 50 #define MAX_DATA_NUM 256 // 定义学生结构体,新增rank字段存储排名 typedef struct { int number; TCHAR name[10]; int kor; int math; int eng; int tot; float avg; int rank; // 新增的排名字段 } STUDENT_SCORE; void scoreCalculatorWithName(HWND hwnd, HWND hSrc, HWND hDst) { TCHAR buff[BUFF_SIZE]; DWORD fileSize; char* tok; int stdNum; STUDENT_SCORE stdScore[MAX_STUDENT_NUM]; fileSize = GetWindowText(hSrc, buff, BUFF_SIZE); buff[fileSize] = _T('\0'); // 修正终止符赋值逻辑,避免越界 stdNum = 0; tok = strtok(buff, "\r\n"); while (tok != NULL) { // 删掉原来多余的rank读取,输入文件只有学号、姓名、三科成绩 sscanf(tok, "%d %s %d %d %d", &stdScore[stdNum].number, stdScore[stdNum].name, &stdScore[stdNum].kor, &stdScore[stdNum].math, &stdScore[stdNum].eng); tok = strtok(NULL, "\r\n"); stdNum++; } // 计算总分和平均分 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++) { int higherCount = 0; // 统计有多少个学生的总分比当前学生i高 for (int j = 0; j < stdNum; j++) { if (stdScore[j].tot > stdScore[i].tot) { higherCount++; } } // 排名 = 比自己分高的人数 +1,同分学生排名一致 stdScore[i].rank = higherCount + 1; } TCHAR str[MAX_DATA_NUM]; // 表头新增排名列 sprintf(buff, "%-s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\r\n", "Number", "name", "Kor", "Math", "Eng", "Total", "Average", "Rank"); for (int i = 0; i < stdNum; i++) { // 每行输出新增排名字段 sprintf(str, "%-d\t%-s\t%-d\t%-d\t%-d\t%-d\t%-.1f\t%d\r\n", stdScore[i].number, stdScore[i].name, stdScore[i].kor, stdScore[i].math, stdScore[i].eng, stdScore[i].tot, stdScore[i].avg, stdScore[i].rank); strcat(buff, str); } strcat(buff, "\r\n"); SetWindowText(hDst, buff); }
关键逻辑说明
- 排名计算完全不需要调整原有学生的存储顺序,仅通过双重循环统计每个学生的总分位次,同总分的学生排名相同
- 修正了原有代码中读取输入时误读rank字段的问题,匹配预设的学生信息文件格式
- 输出结果新增了排名列,直接对应每个学生的原始顺序展示排名
内容的提问来源于stack exchange,提问作者Riad Akhmetzhanov
相关产品推荐
相关产品推荐

