结构体,冒泡排序
问题描述
给出n个学生的成绩,将这些学生按成绩排序,排序规则:总分高的在前;总分相同,数学成绩高的在前;总分与数学相同,英语高的在前;总分数学英语都相同,学号小的在前
输入格式
第一行一个正整数n,表示学生人数
接下来n行每行3个0~100的整数,第i行表示学号为i的学生的数学、英语、语文成绩
输出格式
输出n行,每行表示一个学生的数学成绩、英语成绩、语文成绩、学号
按排序后的顺序输出
样例输入
2
1 2 3
2 3 4
样例输出
2 3 4 2
1 2 3 1
数据规模和约定
n≤100
这道题冒泡排序的时候条件有多个,按优先级依次比较
代码如下
#include<iostream>
using namespace std;
typedef struct
{
int mat;
int eng;
int chi;
int num;
int tot;
}Stu;
Stu stu[105];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
stu[i].num=i;
cin>>stu[i].mat>>stu[i].eng>>stu[i].chi;
stu[i].tot=stu[i].chi+stu[i].eng+stu[i].mat;
}
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
{
if(stu[i].tot<stu[j].tot)
{
Stu temp;
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
else if(stu[i].tot==stu[j].tot)
{
if(stu[i].mat<stu[j].mat)
{
Stu temp;
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
else if(stu[i].mat==stu[j].mat)
{
if(stu[i].eng<stu[j].eng)
{
Stu temp;
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
else if(stu[i].eng==stu[j].eng)
{
if(stu[i].num>stu[j].num)
{
Stu temp;
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
}
}
for(int i=1;i<=n;i++)
{
cout<<stu[i].mat<<" "<<stu[i].eng<<" "<<stu[i].chi<<" "<<stu[i].num<<endl;
}
}