结构体数组指针排序

文章描述了一个编程问题,涉及如何使用C语言创建一个函数,对中学期末考试中每个学生5门课程的成绩进行排序,并计算每门课程的排名。给出了结构体定义、排序函数接口和一个示例程序来演示如何操作学生成绩记录指针数组。
摘要由CSDN通过智能技术生成

某中学期末考试共有5门课程,需要录入每个学生5门课程的成绩,并计算每个学生每门课程成绩的排名,并输出成绩和排名信息。为完成该任务,表示学生课程成绩和排名的成绩记录结构体定义如下:

struct Student
{
    int     number;     //学号
    char    name[10];   //姓名
    int     score[5];   //5门课程成绩
    int     rank[5];    //5门课程排名
};

指针数组排序函数如下:

函数接口定义:

按课程which的成绩从大到小排序
void SortStudentPtr(struct Student* arrStuPtr[], int n, int which);

其中 arrStuPtr 是用户传入的指向所有学生成绩记录的指针数组。 n 的表示学生的个数; which 是[0, 4]区间的整数,表示第几门课程。

裁判测试程序样例:

#include <stdio.h>
struct Student
{
    int     number;     //学号
    char    name[10];   //姓名
    int     score[5];   //5门课程成绩
    int     rank[5];    //5门课程排名
};
void SortStudentPtr(struct Student* arrStuPtr[], int n, int which);

int main()
{
    int i, c;
    struct Student arrStu[10] = {
        {1001, "zhangsan",  95, 84, 64, 75, 75},
        {1002, "lisi",      87, 82, 82, 85, 76},
        {1003, "wangwu",    92, 93, 73, 65, 93},
        {1004, "zhaoliu",   90, 91, 89, 92, 87},
        {1005, "sunqian",   85, 82, 86, 81, 85},
        {1006, "wuge",      78, 74, 92, 79, 83},
        {1007, "yaoyuan",   91, 69, 68, 83, 78},
        {1008, "zhenghao",  67, 61, 71, 93, 86},
        {1009, "guojing",   78, 72, 78, 95, 67},
        {1010, "daigao",    80, 87, 88, 76, 96}
    };
    struct Student* arrStuPtr[10];
    for (i = 0; i < 10; i++)
        arrStuPtr[i] = arrStu + i;
    
    for (c = 0; c < 5; c++)
    {
        SortStudentPtr(arrStuPtr, 10, c);
        for (i = 0; i < 10; i++)
            arrStuPtr[i]->rank[c] = i + 1;
    }
    printf("number\t   name   \tscore1\trank1\tscore2\trank2\tscore3\trank3\tscore4\trank4\tscore5\trank5\n");
    for (i = 0; i < 10; i++)
    {
        printf("%d\t%10s\t", arrStu[i].number, arrStu[i].name);
        for (c = 0; c < 5; c++)
            printf("%d\t%d\t", arrStu[i].score[c], arrStu[i].rank[c]);
        printf("\n");
    }
    return 0;
}

/* 请在这里填写答案 */

输入样例:

输出样例:

number       name       score1    rank1    score2    rank2    score3    rank3    score4    rank4    score5    rank5
1001      zhangsan    95    1    84    4    64    10    75    9    75    9    
1002          lisi    87    5    82    5    82    5    85    4    76    8    
1003        wangwu    92    2    93    1    73    7    65    10    93    2    
1004       zhaoliu    90    4    91    2    89    2    92    3    87    3    
1005       sunqian    85    6    82    6    86    4    81    6    85    5    
1006          wuge    78    9    74    7    92    1    79    7    83    6    
1007       yaoyuan    91    3    69    9    68    9    83    5    78    7    
1008      zhenghao    67    10    61    10    71    8    93    2    86    4    
1009       guojing    78    8    72    8    78    6    95    1    67    10    
1010        daigao    80    7    87    3    88    3    76    8    96    1    

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

void SortStudentPtr(struct Student* arrStuPtr[], int n, int which)
{
    int x;
    for(int i=0;i<n-1;i++)
    {
        x=i;
        for(int j=i+1;j<n;j++)
        {
            if(arrStuPtr[x]->score[which]<arrStuPtr[j]->score[which])
            {
                x=j;
            }
        }
        struct Student* tem=arrStuPtr[x];
        arrStuPtr[x]=arrStuPtr[i];
        arrStuPtr[i]=tem;
    }
}

  • 33
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值