增加对每个学生的分数进行排名的功能
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<STUDENT_SCORE>
和内置的排序功能。此外,这只是技术上的 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 的学生姓名以及他们的分数
SQL四大排名函数(ROW_NUMBERRANKDENSE_RANKNTILE)