首先定义结构体变量:
#define N 5
//这里是学生的个数
struct student
{
long card;
char name[20];
int grade;
};
可以根据需要进行调整.
然后是信息读取函数:
//从键盘上读取学生信息
void input_student(struct student* p, int n)
{
for (int i = 0; i < n; i++)
{
printf("请输入第%d个学生的信息:",i+1);
scanf("%ld %s %d", &p[i].card, &p[i].name, &p[i].grade);
getchar();
}
}
接下来是写一个比较的依据,以便于传入qsort中比较
// 将学生按照成绩由高到低排序
// compare_grade函数用于比较两个学生的成绩,并返回一个int值来表示大小关系
int compare_grade(const void* p1, const void* p2)
{
// 将指针的类型转化为struct student,然后比较两个学生的成绩
int temp = ((struct student*)p1)->grade - ((struct student*)p2)->grade; //将指针的类型转化为struct student
if (temp > 0)
return -1; // 成绩高的学生返回-1,用于升序排列
else if (temp < 0)
return 1;
else
return 0; // 如果成绩相同,返回0
}
最后一步:对数据进行输出:
// 输出结构体数组中的数据
void printf_student(struct student* p, int n)
{
printf("学号\t姓名\t成绩\n"); // 输出表头
for (int i = 0; i < n; i++)
{
printf("%ld\t%s\t%d\n", p[i].card, p[i].name, p[i].grade); // 按照格式输出每个学生的信息
}
}
使用:
int main()
{
struct student student_list[N];
input_student(student_list, N);
int len = sizeof(student_list) / sizeof(student_list[0]);
qsort(student_list, N, sizeof(student_list[0]), compare_grade);
printf_student(student_list, N);
return 0;
}
结果如下:
这里为了方便,我就输入了两个学生的信息.可以根据需要调整N即可