含并列名次的排名

引言

语文 数学 英语 总分 名次
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;
}
运行截图

发表评论

电子邮件地址不会被公开。 必填项已用*标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部