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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:54:01