成绩排序(结构体)C语言

题目详情

某班有n个学生,输入该班这n个学生的姓名、某三门课的成绩,计算各自的平均成绩,存放到一个结构数组中,将平均成绩作为关键字,然后把该这些学生的名字和平均成绩按从大到小的顺序排列输出.如果有相同分数则名字字典序小的在前。

格式

输入格式

第一行为人数n,n为正整数.接下来的n行,每行为每个学生的名字和他的3门课程的成绩(小数点后最多有2位小数), 中间用单个空格隔开.名字只包含字母且长度不超过20.即:学生的姓名 分数 分数 分数.

输出格式

把成绩单按平均分数从高到低的顺序进行排序并输出,每行包含名字和分数,两项之间有一个空格.如果有相同分数则名字字典序小的在前.平均分输出小数点后2位. 4舍5入.

样例

输入样例

8
Kitty 66.66  66.66  66.67
Hanmeimei 66.66  66.66 66.66
Joey 92 58 96
Tim 28 68 32
Test 56 98 78
Sdt 78 65 90
Red 45 56 89
Wed 56 89 74

输出样例

Joey 82.00
Sdt 77.67
Test 77.33
Wed 73.00
Hanmeimei 66.66
Kitty 66.66
Red 63.33
Tim 42.67

代码

#include<stdio.h>
#include<string.h>
struct student{
    char name[20];
    double score[3];
    double avr;
};//定义结构体
int main()
{
    int i,j,k,n,idex,count=0;
    scanf("%d",&n);
    struct student stu[n],t;//t用于排序交换
    for(i=0;i<n;i++)
    {
        stu[i].avr=0;//初始化平均值,以便用于自增
        scanf("%s",stu[i].name);
        for(j=0;j<3;j++)
        {
            scanf("%lf",&stu[i].score[j]);
            stu[i].avr+=stu[i].score[j]/3.0;
        }
        stu[i].avr=(int)(100*stu[i].avr+0.5);
        stu[i].avr/=100;//对平均值四舍五入,保留两位小数
    }
    
    for(i=0;i<n-1;i++)//根据平均值大小进行冒泡排序
    {
        for(j=0;j<n-i-1;j++)
        {
            if(stu[j+1].avr>stu[j].avr)
            {
                t=stu[j];
                stu[j]=stu[j+1];
                stu[j+1]=t;
            }
        }
    }
    for(i=0;i<n;i++)//寻找平均值相同的结构数组下标和个数
    {
        if(stu[i].avr==stu[i+1].avr)
        {
            idex=i;//平均值相同的结构数组中倒数第二个的下标
            count++;//个数
        }
    }
    //根据名字字典序进行冒泡排序
    for(i=idex+1-count,k=0;i<idex+1;i++,k++)//idex+1-count表示平均值相同的结构数组中第一个的下标,idex+1表示平均值相同的结构数组中最后一个的下标
    {
        for(j=idex+1-count;j<idex+1-k;j++)
        {
            if(strcmp(stu[j].name,stu[j+1].name)>0)
            {
                t=stu[j];
                stu[j]=stu[j+1];
                stu[j+1]=t;
            }
        }
    }
    for(i=0;i<n;i++)
    {
        printf("%s",stu[i].name);
        printf(" %.2lf\n",stu[i].avr);
    }
    
}

注释

才疏学浅,有问题请纠正谢谢

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这段代码是一个使用结构体和函数实现学生信息录入、排序和打印的示例。首先定义了一个结构体`stu_informa`,包含学生的id、姓名和成绩。然后通过`struct_input`函数进行学生信息的录入,`struct_print`函数进行学生信息的打印,`struct_paixu`函数进行学生成绩排序排序部分使用了冒泡排序算法,照学生成绩从小到大的顺序对学生信息进行排序。具体实现是通过两层循环,每次比较相邻的两个学生成绩,如果前一个学生成绩大于后一个学生成绩,则交换两个学生的位置,直到所有学生成绩都按照从小到大的顺序排列。 在代码的`test`函数中,首先定义了一个包含3个学生信息的结构体数组`stu`,然后通过`struct_input`函数录入学生信息,接着调用`struct_paixu`函数对学生信息进行排序,最后调用`struct_print`函数打印排序后的学生信息。 运行结果是按照学生成绩从小到大的顺序打印出学生信息。 可以根据自己的需求修改结构体成员以及学生信息的数量,然后运行代码进行测试。<span class="em">1</span> #### 引用[.reference_title] - *1* [c语言结构体中的冒泡排序](https://blog.csdn.net/weixin_46094737/article/details/126127430)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值