目录
1.结构体定义
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
通俗的来说其实就是,开辟一个新的变量来存储这个变量的不同属性,比如,学生成绩,它有语数外三科成绩,因为这三科成绩属于同一个人。
struct student{
int Ch;//语文
int math;//数学
int En;//英语
}p[10000];
后面是一个可选的标志(p),它是用来引用该结构体的快速标记.
这里的我开了一个大小为10000的数组,表示开辟了一个可以存下10000个学生成绩那么大的结构体数组。
2.sort排序
结构体排序,我这里介绍调用sort函数的这一种排序;
1.sort()函数的头文件和用法举例
首先要调用sort函数,一定要加上这个头文件 #include<algorithm>
其实就和你要调用pow()函数一定要加上#include<cmath>头文件一个道理
用法举例如下:
#include<iostream> #include<algorithm> using namespace std; int main() { int a[5]={1,4,6,3,2}; sort(a,a+5); for(int i=0;i<5;i++) cout<<a[i]<<" "; cout<<endl; return 0; }
输出结果如下:
2.sort()函数的参数说明
sort函数可以是两个参数,也可以是三个参数,这里我们先介绍两个参数的那种情况,在介绍三个参数的情况;
两个参数
也就是sort函数没有第三个参数,这种情况就是,默认实现的是从小到大,也就是刚刚举例的那种情况
#include<iostream> #include<algorithm> using namespace std; int main() { int a[10]={9,6,3,8,5,2,7,4,1,0}; for(int i=0;i<10;i++) cout<<a[i]<<" ";//打印排序之前的数组序列 cout<<endl; sort(a,a+10);//这里调用sort()函数 for(int i=0;i<10;i++) cout<<a[i]<<" ";//打印排序之后的数组序列 return 0; }
三个参数
Sort函数有三个参数:
(1)第一个是要排序的数组的起始地址。
(2)第二个是结束的地址(最后一位要排序的地址)
(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
【注意】这里的第三个参数就是自己定义的比较方式的函数,比如下面的例子我定义的函数名字是cmp,(是bool类型),我这个函数返回的是 a>b,所以这里调用了sort之后数组里的元素按照从小到大的顺序排列
Sort函数使用模板:
Sort(start,end,排序方法)
代码如下:自己可以尝试一下写一个类似的代码,运行一下:哈哈哈👀ヾ(•ω•`)oヾ(•ω•`)o
#include<iostream> #include<algorithm> using namespace std; bool cmp(int a,int b) { return a>b; } int main() { int a[10]= {9,6,3,8,5,2,7,4,1,0}; cout<<"最原始的数组:"; for(int i=0; i<10; i++) cout<<a[i]<<" "; cout<<endl; sort(a,a+10,cmp); cout<<"调用三个参数sort()函数排序后的数组:"; for(int i=0; i<10; i++) cout<<a[i]<<" "; cout<<endl; sort(a,a+10); cout<<"调用两个参数sort()函数排序后的数组:"; for(int i=0; i<10; i++) cout<<a[i]<<" "; return 0; }
输出结果:
3.结构体排序
之前说的结构体,就是包含了多个元素的变量,,然后,,,这里讲到的sort函数就是对数组里面的元素进行排序,那么如果这是一个结构体数组,我们也可以用sort函数,对这个结构体数组进行类似的操作了
来看个题目吧:
某小学打算为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。
任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:
7 279
5 279
这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:
5 279
7 279
则按输出错误处理,不能得分。
看完题目得知,这里有很多个学生,每个学生有自己的 三门成绩,语数英,还有学号,那我们得定义一个结构体数组,把每个学生的这些信息储存起来,再按照规定进行排序,输出前五名就是我们要完成的任务
话不多说,上代码:
#include<iostream> #include<algorithm> using namespace std; struct student{ int c;//语文分数 int s;//数学分数 int y;//英语分数 int num;//学号 int sum;//每个人的总分 }p[500]; bool cmp(const student&a,const student&b) { if(a.sum!=b.sum)//如果总分不相同,就返回总分高的那一个 return a.sum>b.sum; else if(a.sum==b.sum&&a.c!=b.c)//如果总分相同,就返回总分语文高的那一个 return a.c>b.c; else if(a.sum==b.sum&&a.c==b.c&&a.num!=b.num) //如果总分相同,语文分相同,就返回总分学号小的那一个 return a.num<b.num; } int main() { int n; cin>>n; for(int i=0;i<n;i++) { cin>>p[i].c>>p[i].s>>p[i].y;//输入信息 p[i].num=i+1;//序号即学号 p[i].sum=p[i].c+p[i].s+p[i].y;//算出每个人的总分 } sort(p,p+n,cmp);//排序 for(int i=0;i<5;i++)//输出前五名的学号和总分 cout<<p[i].num<<" "<<p[i].sum<<endl; return 0; }
这样就可以完成任务了。
拿去吧,去给皇上看,你告诉他,这都是本宫自己敲的,没有假手于人,本宫手都要断了。
ಥ_ಥ