首页 > 解决方案 > 增加对每个学生的分数进行排名的功能

问题描述

由于我的课程,我刚刚开始使用 dev c++ 和计算机语言现在,你能帮忙添加一个对每个学生的分数进行排名的功能吗?我已经做了平均,总计,现在我只需要它来显示每个学生属于哪个等级。它不必按升序或降序排列,而只需根据总值显示哪个排名。我只需要打开一个已经准备好分数和名称的文本文档,然后编译将显示排名

typedef struct {
    int number;
    TCHAR name[10];
    int kor;
    int math;
    int eng;
    int tot;
    float avg;

    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 + 1] = NULL;
        stdNum = 0;
        tok = strtok(buff, "\r\n");
        while (tok != NULL) {
            sscanf(tok, "%d %s %d %d %d\r\n", &stdScore[stdNum].number, &stdScore[stdNum].name,
                &stdScore[stdNum].kor, &stdScore[stdNum].math,
                &stdScore[stdNum].eng, &stdScore[stdNum].rank);
            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;
        }

        TCHAR str[MAX_DATA_NUM];
        sprintf(buff, "%-s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\r\n",
            "Number", "name", "Kor", "Math", "Eng", "Total", "Average");
        for (int i = 0; i < stdNum; i++) {
            sprintf(str, "%-d\t%-s\t%-d\t%-d\t%-d\t%-d\t%-.1f\r\n",
                stdScore[i].number, stdScore[i].name,
                stdScore[i].kor, stdScore[i].math, stdScore[i].eng,
                stdScore[i].tot, stdScore[i].avg);
            strcat(buff, str);
        }

        strcat(buff, "\r\n");
        SetWindowText(hDst, buff);
    }

标签: c++windowsrank

解决方案


为了给每个学生分配一个排名,我们首先对一个指向学生的指针向量进行排序:

std::vector<STUDENT_SCORE *> ranked;
for (int i = 0; i < stdNum; i++) {
  ranked.emplace_back(&stdScore[i]);
}

std::sort(begin(ranked), end(ranked),
          [](STUDENT_SCORE * left, STUDENT_SCORE * right) { return left->tot > right->tot; });

然后我们可以分配等级:

for (int i = 0; i < stdNum; i++) {
  ranked[i]->rank = i+1;
}

推荐阅读