【奖学金】C语言结构体排序

简介: 【奖学金】C语言结构体排序

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.总结

       本题最根本的就是结构体排序,当然不要进入一个误区,那就是结构体本质上就是变量的集合,他们本质上是一个东西,结构体能更好的表达我们的数据类型,减少我们的思维容量。

目录
相关文章
|
1天前
|
编译器 程序员 Linux
【C语言篇】结构体和位段详细介绍
跟结构相⽐,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在。
|
6天前
|
存储 C语言
C语言------结构体和共用体
这篇文章是关于C语言中结构体和共用体的实训,通过示例代码演示了结构体的定义、赋值、使用,以及如何使用结构体变量进行数据的组织和操作,包括输入、排序、求平均分和查找学生信息等功能。
C语言------结构体和共用体
|
2月前
|
编译器 测试技术 C语言
【C语言】:自定义类型:结构体的使用及其内存对齐
【C语言】:自定义类型:结构体的使用及其内存对齐
41 7
|
2月前
|
网络协议 编译器 Linux
结构体(C语言)
结构体(C语言)
|
1月前
|
存储 编译器 定位技术
结构体数组在C语言中的应用与优化策略
结构体数组在C语言中的应用与优化策略
|
1月前
|
存储 编译器 数据库
结构体数组在C语言中的应用与优化技巧
结构体数组在C语言中的应用与优化技巧
|
2月前
|
C语言
C语言中的结构体
C语言中的结构体
17 0
|
2月前
|
编译器 C语言 C++
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
18 0
|
2月前
|
存储 编译器 Linux
【c语言】详解结构体
【c语言】详解结构体
18 0
|
2月前
|
C语言
C语言---自定义类型:结构体(4)
C语言---自定义类型:结构体