本题为本人原创,请勿抄袭。
难度:普及/提高-
题目背景
在你的帮助下,老师成功地完成了成绩的统计。但是,教委又说要添加口语听说成绩,并且还要写出每科的排名和平均分。老师们有彻夜难眠。
题目描述
这是一题将结构体和排序结合在一起的题。
输入格式
- 第一行,学生的数量。
- 第二行,学生的名字。
- 第三行,学生的语文、数学、英语听说、英语笔试、历史、生物、地理、政治、信息学奥林匹克竞赛成绩。
输出格式
- 第一行,name:学生的名字。
- 第二行,rank:学生的总排名。
- 第三行,final_soccer:学生的总分。
- 换行
- 第……行,average_score:平均分
输入输出样例
输入 #1
2 xiaohuang 80 80 40 40 80 80 80 80 xiaorui 81 79 40 60 60 80 99 61
输出 #1
name:xiaorui rank:1 final_soccer:560name:xiaohuang rank:1 final_soccer:560average_score:560
说明/提示
- 提示
- 1<n<10
- 说明
- 会出现分数相等、总分相同的情况
- 如果总分相同,先输出后输入的人的姓名,如样例1.
思路
很明显,这道题是一道将结构体和排序相结合的一道题。
首先,我们需要定义一个结构体,至于定义什么,题目要求什么就定义什么。
struct student{string name;int a,b,c,d,e,f,g,h;int s;int rank;int index;
}a[11];
然后,我们将七科成绩存入结构体中。
for(int i=0;i<n;i++){cin>>a[i].name;cin>>a[i].a>>a[i].b>>a[i].c>>a[i].d>>a[i].e>>a[i].f>>a[i].g>>a[i].h;a[i].s=a[i].a+a[i].b+a[i].c+a[i].d+a[i].e+a[i].f+a[i].g+a[i].h; }
接下来就是最重要的部分--排序。
bool cmp(student x,student y){return x.s<y.s;
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++)a[i].rank=i;
最后,题目要求:如果总分相同,先输出后输入的人的姓名。所以,我们可以用倒序输出来解决,如下:
for(int i=n-1;i>=0;i--){cout<<a[i].name<<endl;cout<<sum<<endl;cout<<a[i].s<<endl;if(a[i].s!=a[i-1].s)sum++;
}
完整代码
#include<bits/stdc++.h>
using namespace std;
int n,sum=1,dum=0;
struct student{string name;int a,b,c,d,e,f,g,h;int s;int rank;int index;
}a[11];
bool cmp(student x,student y){return x.s<y.s;
}
int main(){cin>>n;for(int i=0;i<n;i++){cin>>a[i].name;cin>>a[i].a>>a[i].b>>a[i].c>>a[i].d>>a[i].e>>a[i].f>>a[i].g>>a[i].h;a[i].s=a[i].a+a[i].b+a[i].c+a[i].d+a[i].e+a[i].f+a[i].g+a[i].h; }sort(a,a+n,cmp);for(int i=0;i<n;i++)a[i].rank=i;for(int i=n-1;i>=0;i--){cout<<"name:"<<a[i].name<<endl;cout<<"rank:"<<sum<<endl;cout<<"final_soccer:"<<a[i].s<<endl;cout<<endl;if(a[i].s!=a[i-1].s)sum++;}for(int i=0;i<n;i++){dum=a[i].s+dum;}cout<<"average_score:"<<dum/n;return 0;
}