引言
语文 | 数学 | 英语 | 总分 | 名次 |
---|---|---|---|---|
88 | 90 | 87 | 265 | 1 |
88 | 87 | 90 | 265 | 1 |
90 | 85 | 88 | 263 | 3 |
68 | 95 | 60 | 223 | 4 |
像上面这样的排名是生活中很常见的,即分数相同的学生会有相同的排名。两个265分都是第一名,后面没有第二名,直接就是第三名。
在excel中可以使用rank函数实现这个功能,在编程中应该怎么实现呢?
下面使用C++来举例说明。
C++实现
基本思想:
1. 使用sort函数以总分为标准进行排序
2. 从下标为1的学生开始,判断总分是否与前一名相同。如果相同,则排名等于前一名的排名;如果不相同,则排名等于(当前下标+1)。
样例输入
4
张三 90 85 88
关哥 88 90 87
王二 68 95 60
李四 88 87 90
样例输出
姓名 语文 数学 英语 总分 排名
关哥 88 90 87 265 1
李四 88 87 90 265 1
张三 90 85 88 263 3
王二 68 95 60 223 4
代码
#include <bits/stdc++.h>
using namespace std;
struct node
{
string name;
int yuwen, shuxue, yingyu, sum, Rank;
bool operator<(const node &s2)
{
return sum > s2.sum;
}
} stu[1000];
int main()
{
int n, i;
cin >> n;
for (i = 0; i < n; i++)
{
cin >> stu[i].name >> stu[i].yuwen >> stu[i].shuxue >> stu[i].yingyu;
stu[i].sum = stu[i].yuwen + stu[i].shuxue + stu[i].yingyu;
}
sort(stu, stu + n);
for (i = 0; i < n; i++)
{
if (i && stu[i].sum == stu[i - 1].sum)
stu[i].Rank = stu[i - 1].Rank;
else
stu[i].Rank = i + 1;
}
cout << endl
<< "姓名 语文 数学 英语 总分 排名" << endl;
for (i = 0; i < n; i++)
cout << stu[i].name << " " << stu[i].yuwen << " " << stu[i].shuxue << " " << stu[i].yingyu << " " << stu[i].sum << " " << stu[i].Rank << endl;
return 0;
}