题目要求如下:
求解思路:
- 为了实现对学生与成绩的组合,可以使用C中的结构体进行数据存储
- 其中num表示学号,score表示成绩
- 使用排序算法对数组进行排序
- 输出排序后的结果
其中排序使用C库标准函数qsort,其函数原型为:
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
该函数最后1个参数为1个函数指针,其形参为const void*
。我们将其转换为对应的类型,再获取其值。唯一需要处理的是,当传入结构体中成绩相同时,我们要获取到其对应的学号,并进行相减,从而让学号小的排序在前面,因为返回的值为负值。
实现代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int num;
int score;
} Student;
int score_compare(const void *elem1, const void *elem2) {
Student *stu1 = (Student *) elem1;
Student *stu2 = (Student *) elem2;
int s1, s2;
s1 = (*stu1).score;
s2 = (*stu2).score;
if(s1==s2){
return (*stu1).num - (*stu2).num;
}
return (*stu1).score - (*stu2).score;
}
int main() {
int num;
Student students[100] = {{0, 0}};
scanf("%d", &num);
for (int i = 0; i < num; ++i) {
scanf("%d%d", &students[i].num, &students[i].score);
}
qsort(students, num, sizeof(Student), score_compare);
for (int j = 0; j < num; ++j) {
printf("num=%d,score=%d\n", students[j].num, students[j].score);
}
return 0;
}
最终通过后结果: