【奖学金】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.总结

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

目录
相关文章
|
13天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
56 8
|
13天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
46 7
|
26天前
|
存储 C语言
如何在 C 语言中实现结构体的深拷贝
在C语言中实现结构体的深拷贝,需要手动分配内存并逐个复制成员变量,确保新结构体与原结构体完全独立,避免浅拷贝导致的数据共享问题。具体方法包括使用 `malloc` 分配内存和 `memcpy` 或手动赋值。
34 10
|
26天前
|
存储 大数据 编译器
C语言:结构体对齐规则
C语言中,结构体对齐规则是指编译器为了提高数据访问效率,会根据成员变量的类型对结构体中的成员进行内存对齐。通常遵循编译器默认的对齐方式或使用特定的对齐指令来优化结构体布局,以减少内存浪费并提升性能。
|
30天前
|
编译器 C语言
共用体和结构体在 C 语言中的优先级是怎样的
在C语言中,共用体(union)和结构体(struct)的优先级相同,它们都是用户自定义的数据类型,用于组合不同类型的数据。但是,共用体中的所有成员共享同一段内存,而结构体中的成员各自占用独立的内存空间。
|
30天前
|
存储 C语言
C语言:结构体与共用体的区别
C语言中,结构体(struct)和共用体(union)都用于组合不同类型的数据,但使用方式不同。结构体为每个成员分配独立的内存空间,而共用体的所有成员共享同一段内存,节省空间但需谨慎使用。
|
1月前
|
编译器 C语言 C++
C语言结构体
C语言结构体
27 5
|
1月前
|
算法 C语言
【C语言】排序查找
【C语言】排序查找
|
1月前
|
编译器 Linux C语言
C语言 之 结构体超详细总结
C语言 之 结构体超详细总结
20 0
|
1月前
|
存储 编译器 Linux
深入C语言:探索结构体的奥秘
深入C语言:探索结构体的奥秘