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

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

目录
相关文章
|
18天前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
91 14
|
22天前
|
存储 编译器 C语言
【C语言】结构体详解 -《探索C语言的 “小宇宙” 》
结构体通过`struct`关键字定义。定义结构体时,需要指定结构体的名称以及结构体内部的成员变量。
100 10
|
27天前
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
|
1月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
111 13
|
1月前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
60 11
|
1月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
54 4
|
1月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
103 8
|
1月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
115 7
|
2月前
|
存储 C语言
如何在 C 语言中实现结构体的深拷贝
在C语言中实现结构体的深拷贝,需要手动分配内存并逐个复制成员变量,确保新结构体与原结构体完全独立,避免浅拷贝导致的数据共享问题。具体方法包括使用 `malloc` 分配内存和 `memcpy` 或手动赋值。
78 10
|
2月前
|
存储 大数据 编译器
C语言:结构体对齐规则
C语言中,结构体对齐规则是指编译器为了提高数据访问效率,会根据成员变量的类型对结构体中的成员进行内存对齐。通常遵循编译器默认的对齐方式或使用特定的对齐指令来优化结构体布局,以减少内存浪费并提升性能。