增加对每个学生的分数进行排名的功能

Posted

技术标签:

【中文标题】增加对每个学生的分数进行排名的功能【英文标题】:Adding function of ranking every student's score 【发布时间】:2021-10-11 13:53:10 【问题描述】:

因为我的课程,我才刚刚开始使用 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 i/o 混合到 C++ 中,并且最重要的是您正在使用 windows api。这是由于任务的要求,还是只是从您在网上某处找到的文件中读取的方式?这看起来比实际需要的要复杂,除非您实际上是针对 Windows 应用程序(可能还有其他奇怪的要求) 使用std::vector&lt;STUDENT_SCORE&gt; 和内置的排序功能。此外,这只是技术上的 C++;它充满了 C 主义。 @463035818_is_not_a_number 这是我的高级计算机编程课程的作业,所以教授说需要 Windows 应用程序。另外,我认为到目前为止没有错误,因为那是我教授写的代码 给定代码中有很多错误:1)将 IO 与计算混合; 2) 不检查 sscanf 的结果; 3) 如果您输入足够长的名称,则会出现轻微的缓冲区溢出(导致崩溃或代码执行) 4) 在循环中使用 strcat(二次行为) 5) 尽管声称是 C++,但这只是 C 代码。 【参考方案1】:

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

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;

【讨论】:

以上是关于增加对每个学生的分数进行排名的功能的主要内容,如果未能解决你的问题,请参考以下文章

编写一个查询,该查询将获取每个科目中排名前 3 的学生姓名以及他们的分数

mysql中的用户按他们的分数排名

对分组内的行进行排名(2 列)

SQL四大排名函数(ROW_NUMBERRANKDENSE_RANKNTILE)

Oracle中排名排序函数,ROW_NUMBERRANKDENSE_RANKNTILE

R_Studio(学生成绩)对两个班级学生成绩进行集合,重新计算学生综合测评成绩并对学生按综合测评成绩进行排名