解题思路:其实很简单 排序分为三种情况1..总成绩前小于后 2.总成绩相同但语文前小于后 3.总成绩相同语文相同但学号前比后大。
注意事项:
参考代码:
#include
using namespace std;
struct st{
int xh;//学号
int a,b,c;三科成绩
int sum=0;//三科成绩总和
};
int main(){
int n;
cin>>n;
struct st z[n+5],t;//t为交换排序时的中间变量 注意结构体交换小技巧 用两个结构体直接交换
for(int i=1;i<=n;i++){
cin>>z[i].a>>z[i].b>>z[i].c;
z[i].sum=z[i].a+z[i].b+z[i].c;//记录总成绩
z[i].xh=i; //记录学号从1开始
}
for(int i=1;i<=n-1;i++){
for(int j=i+1;j<=n;j++){ //1.总成绩前小于后 2.总成绩相同但语文前小于后3.总成绩相同语文相同但学号前比后大
if(z[i].sum<z[j].sum||(z[i].sum==z[j].sum&&z[i].a<z[j].a)||((z[i].sum==z[j].sum&&z[i].a==z[j].a)&&(z[i].xh>z[j].xh))){
t=z[i]; //上面红色这段代码我觉得没有必要加上,因为输入的时候就已经按学号从小到大顺序排列了,就不可能出现前面的比后面的大。
z[i]=z[j];
z[j]=t; //结构体间直接交换
}
}
}
for(int i=1;i<=5;i++){
cout<<z[i].xh<<' '<<z[i].sum<<endl;
}
return 0;
}
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复