结构体
来源:互联网 发布:刘强东脸盲 知乎 编辑:程序博客网 时间:2024/06/05 07:00
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。
任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前5名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分)是:
7279
5279
这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是279(总分等于输入的语文、数学、英语三科成绩之和),但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:
5279
7279
则按输出错误处理,不能得分。
本题给了每个学生3门课的成绩:语文、数学、英语。而我们要对所有学生排序:排序是先后顺序是总分,语文和学号。所以,每个学生有5个关键数据项:语文,数学,英语,总分和学号。排序的关键属性有3个:总分,语文和学号。所以,我们尝试用结构体来定义一个类型包含这3个数据项。
#include<iostream>
#include <algorithm>
using namespace std;
struct student //定义类型,分别是总分,语文和学号
{
intscore;
intchinese;
intid;
};
student stu[310];
int n,chinese,math,english;
void init() //读入数据
{
cin>>n;
for(int i=1;i<=n;i++) //读入三门课成绩,并分别记录语文,学号和总分。
{
cin>>chinese>>math>>english;
stu[i].chinese=chinese;
stu[i].id=i;
stu[i].score=chinese+math+english;
}
}
void mysort() //冒泡排序。
{
for(int i=1;i<n;i++)
{
boolflag=1; //这个是冒泡排序的一个优化。
for(int j=1;j<=n-i;j++) //仔细理解 这个长关系表达式。
if( (stu[j].score<stu[j+1].score) ||
( (stu[j].score==stu[j+1].score)&& (stu[j].chinese<stu[j+1].chinese) ) ||
((stu[j].score==stu[j+1].score) && (stu[j].chinese==stu[j+1].chinese)&& (stu[j].id>stu[j+1].id) ) )
{
flag=0; //标记交换。
swap(stu[j],stu[j+1]); //进行交换
}
if(flag) break; //如果没有交换,表明已经有序了。直接退出。
}
}
void print()
{
for (inti=1;i<=5;i++) //输出前5个。
cout<<stu[i].id<<' '<<stu[i].score<<endl;
}
int main()
{
init();
mysort();
print();
return0;
}
这种排序有一个名称,叫多关键字排序。因为决定顺序的不止一个数据项,每一个相关的数据项叫关键字,等级最高的叫第一关键字,其次叫第二关键字,依次类推。
像上题中,总分score是第一关键字,语文chinese是第二关键字,学号id是第三关键字。
我们再来看一下那个关系表达式:
(stu[j].score<stu[j+1].score) ||
( (stu[j].score==stu[j+1].score) &&(stu[j].chinese<stu[j+1].chinese) ) ||
( (stu[j].score==stu[j+1].score) &&(stu[j].chinese==stu[j+1].chinese) && (stu[j].id>stu[j+1].id) ) )
在此表达式中:首先比较第一关键字总分,如果第一关键字相等,比较第二关键字语文,如果第一关键字和第二关键字都相等,比较第三关键字学号。并且关键字的大小顺序还不同。这个关系式希望深刻理解。
- 结构体
- 结构体
- 结构体
- 结构体
- 结构体
- 结构体
- 结构体
- 结构体
- 结构体
- 结构体
- 结构体
- 结构体
- 结构体
- 结构体
- 结构体
- 结构体,,,,
- 结构体
- 结构体
- 【C/C++】string和stringstream
- Xml解析
- H5面试题---&&的使用
- JSP语法
- 集训8.12
- 结构体
- 读书笔记:利用Python进行数据分析【第四章:NumPy基础-array数组】
- MQL4 语言入门。简介
- 2017 Multi-University Training Contest
- 前端性能优化--图片懒加载(lazyload image)
- GB2312编码规则与代码实现
- Python:字符串操作1(去掉空格)
- hdu 6109 数据分割(并查集,倍增)
- 8-12 DAIRY