1.前言
今天的题目是一个排序问题,涉及到了我们一组数据与id匹配的问题,这里我们顺理成章的想到使用结构体来帮助我们实现ID与我们成绩数组的匹配。
本题算是一个很基本的题目,关键在于对结构体的使用,与排序手法。本文将会详细讲述结构体如何去排序。结构体的详细使用教程已经出炉------>>>>>>结构体使用传送门
2.题目背景及输入格式
3.题目分析
各位不要被这看似臃肿复杂的题目吓到。她在我们抽茧剥丝的分析下也会原形毕露显出本来朴实无华的真面目。
这里我们来抓住几个关键点:
1.前五名都有奖品(说明我们需要输出前五组数据)
2.我们的输入格式是个数
语文 数学 英语
3.我们首先比较的是总成绩,然后就是语文,最后是学号
有了这几点我们发现复杂的题目变得简单起来了,我们需要解决的就是排序,和数据录入的问题。接下来我们就上代码~~~~·
4.代码解析
4.1结构体的声明
因为我们的的数据是成队出现的,所以我们需要声明一个包含学号,分数的结构体如下
struct student { int id; int chinses; int m; int e; int sum; };struct student stu[301];//题目给我们的数据最大为300这里保险起见使用301
这里我们为了保险起见,给我们的元素个数比题设要求大1,谨慎总是好的。~~
4.2数据的录入
这里的数据录入我们采用for循环迭代的方式对数组进行格式化录入。
for(i=1;i<n+1;i++) { stu[i].id=i; scanf("%d %d %d",&stu[i].chinses,&stu[i].m,&stu[i].e); stu[i].sum=stu[i].chinses+stu[i].m+stu[i].e; }
这里有个坑:)注意我们的数组是从0开始而我们的学号是从1开始的,所以我们在使用for循环时候应该+1否则就会数据不匹配出现问题。
4.3数据排列
这也是最核心的部分就是对我们的结构体进行排列处理。
这里我在重新说一下我们的排列规则:
我们首先比较的是总成绩,然后就是语文,最后是学号
我们的逻辑运算符的先后顺序可以写出我们的if表达式也就是
if(stu[i].sum<stu[j].sum||stu[i].sum==stu[j].sum&&stu[i].chinses<stu[j].chinses||stu[i].sum==stu[j].sum&&stu[i].chinses==stu[j].chinses&&stu[i].id>stu[j].id)
首先去比较我们的总成绩,如果不满足就会比较我们的语文,最后就是我们的学号。
依照这个规则我们就可以完善我们的循环了,这里我使用了两个循环来完成,第一层控制我们的5组数据优化时间,第二层来控制我们的排序:
for(i=1;i<6;i++) for(j=i+1;j<n+1;j++) if(stu[i].sum<stu[j].sum||stu[i].sum==stu[j].sum&&stu[i].chinses<stu[j].chinses||stu[i].sum==stu[j].sum&&stu[i].chinses==stu[j].chinses&&stu[i].id>stu[j].id) { s_t=stu[i]; stu[i]=stu[j]; stu[j]=s_t; } }
排序就很简单了,数据量不大,直接采用了红酒杯模型。
4.4整体代码
#include <stdio.h> #include <stdlib.h> struct student { int id; int chinses; int m; int e; int sum; };struct student stu[301]; void sort(int n) { int t,i,j; struct student s_t; for(i=1;i<6;i++) for(j=i+1;j<n+1;j++) if(stu[i].sum<stu[j].sum||stu[i].sum==stu[j].sum&&stu[i].chinses<stu[j].chinses||stu[i].sum==stu[j].sum&&stu[i].chinses==stu[j].chinses&&stu[i].id>stu[j].id) { s_t=stu[i]; stu[i]=stu[j]; stu[j]=s_t; } } int main() { int n,i; scanf("%d",&n); for(i=1;i<n+1;i++) { stu[i].id=i; scanf("%d %d %d",&stu[i].chinses,&stu[i].m,&stu[i].e); stu[i].sum=stu[i].chinses+stu[i].m+stu[i].e; sort(n);} for(i=1;i<6;i++){ printf("%d %d\n",stu[i].id,stu[i].sum); } }
这里我们在最后也是使用结构体来对我们的数据进行了打印,为了我们程序更加简介,我把函数进行封装调用。
5.总结
本题最根本的就是结构体排序,当然不要进入一个误区,那就是结构体本质上就是变量的集合,他们本质上是一个东西,结构体能更好的表达我们的数据类型,减少我们的思维容量。