结构体数组指针排序(疑问)——pta

某中学期末考试共有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; } /* 请在这里填写答案 */

输入样例:

输出样例:

某中学期末考试共有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	

代码:

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

疑问:

题目就是把五个成绩依次排序嘛,但结果测试的有个整不到。

我把(arrStuPtr[j]->score[which]<arrStuPtr[j+1]->score[which])改成<=也不行

2024.2.3:

想法:

不知用sort自定义比较函数行不行

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值