某班有n位学生,每位学生在要进行按成绩(分数)从高分到低分的顺序排名,如果成绩(分数)相同则按姓名进行排序(字典顺序)。要求如下图所示,已有代码,最后输出怎么写?
struct student
{
string s;
int x;
};
bool cmp(student a,student b)
{
if(a.x!=b.x) return a.x>b.x;
return a.sint main(){
vector a;
int n,score;
string name;
cin>>n;
for(int i=0;i>name>>score;
a.push_back({name,score});
}
sort(a.begin(),a.end(),cmp);
.....
}
该回答引用GPTᴼᴾᴱᴺᴬᴵ
你可以在sort之后使用一个循环来输出排名。在循环中,您可以使用一个计数器来计算排名,从1开始递增,并输出每个学生的姓名、分数和排名。
下面是示例代码:
#include<bits/stdc++.h>
using namespace std;
struct student
{
string s;
int x;
};
bool cmp(student a, student b)
{
if (a.x != b.x) return a.x > b.x;
return a.s < b.s;
}
int main()
{
vector<student> a;
int n, score;
string name;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> name >> score;
a.push_back({ name,score });
}
sort(a.begin(), a.end(), cmp);
int rank = 1;
for (int i = 0; i < n; i++)
{
cout << rank << " " << a[i].s << " " << a[i].x << endl;
if (i < n - 1 && a[i + 1].x < a[i].x)
{
rank++;
}
}
return 0;
}
在这个代码中,我们首先读入学生的信息,存储在一个vector中。然后我们使用sort来对学生进行排序,按照题目要求排序。
·
接下来,我们使用一个rank变量来记录当前排名。在循环中,我们输出当前学生的排名、姓名和分数,并且如果下一个学生的分数小于当前学生的分数,则增加排名。这样,我们就可以输出所有学生的排名了。
用选代器或按数组下标方式循环输出都行
vector<student>::iterator it1;
for (it1 = a.begin(); it1 != a.end(); ++it1) {
cout << (*it1).s << ","<< (*it1).x << endl;
}