设计合适的函数指针,使得下列代码能够对学生结构体进行排序。排序依据为:优先以名字ascii码顺序进行排序,ascii码小的同学在前;如果名字完全相同,则学号小的在前。 此题为填空题,对于以下代码已经完成的部分提交时无需再次填写。 #include <iostream> using namespace std; struct Student { int id; char name[10]; }; int cmp(const void* a, const void* b) { //请在此补充合适的内容 } int main() { int num; cin >> num; Student* p = new Student[num]; for (int i = 0; i != num; i++) cin >> p[i].id >>p[i].name; qsort(p,num,sizeof(p[0]),cmp); for (int j = 0; j != num; j++) cout << p[j].name << ' '<< p[j].id<<endl; cout << endl; delete p; return 0; } Input 一个数字代表有多少个学生 每个学生包括两部分输入(姓名 学号) Output
时间: 2023-03-21 10:02:48 浏览: 343
这里是一个示例的函数指针声明:
```
typedef int (*CompareFunc)(const void *, const void *);
```
其中 `CompareFunc` 是函数指针类型的名称,用来声明指向比较函数的指针。比较函数的原型为:
```
int compare(const void *a, const void *b);
```
下面是一份示例的排序代码,可以根据题目要求进行修改:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[20];
int id;
} Student;
int compare(const void *a, const void *b) {
Student *sa = (Student *) a;
Student *sb = (Student *) b;
int name_cmp = strcmp(sa->name, sb->name);
if (name_cmp != 0) {
return name_cmp;
}
return sa->id - sb->id;
}
void sort(Student *students, int num_students) {
qsort(students, num_students, sizeof(Student), (CompareFunc) compare);
}
int main() {
Student students[] = {
{"Alice", 1},
{"Bob", 2},
{"Charlie", 3},
{"Dave", 4},
{"Eve", 5},
{"Alice", 6},
{"Charlie", 7},
{"Eve", 8},
{"Bob", 9},
{"Dave", 10},
};
int num_students = sizeof(students) / sizeof(Student);
sort(students, num_students);
for (int i = 0; i < num_students; i++) {
printf("%s %d\n", students[i].name, students[i].id);
}
return 0;
}
```
这段代码定义了一个 `Student` 结构体,其中包含学生的名字和学号。`compare` 函数用来比较两个学生结构体的大小,按照题目要求,先比较名字的字典序,如果名字相同则比较学号大小。`sort` 函数调用了 `qsort` 函数进行排序,其中传入了 `compare` 函数的指针作为参数。最后在 `main` 函数中调用 `sort` 函数对学生数组进行排序,并输出排序后的结果。
阅读全文