某中学期末考试共有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自定义比较函数行不行