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

11 篇文章 1 订阅
8 篇文章 0 订阅
文章介绍了如何使用结构体处理一组数据,包括学号和各科成绩,进行排序以确定前五名学生。首先声明包含学号和分数的结构体,然后读入数据并计算总成绩,接着按照总成绩、语文成绩和学号进行排序,最后输出前五名学生的学号和总分。整个过程重点在于结构体的使用和排序算法的应用。
摘要由CSDN通过智能技术生成

目录

1.前言

2.题目背景及输入格式

3.题目分析

4.代码解析

4.1结构体的声明

4.2数据的录入

4.3数据排列

4.4整体代码

5.总结


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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值