原题链接:成绩排序
解题思路:
一开始我的思路是此题结构体大小应该根据每次输入的n值来分配,但是分配内存时没有考虑到连续性,不能使用qsort来排序,需要自己编写排序函数。
于是嫌麻烦偷懒,先建立大小为1000的结构体数组,保证不会超出,然后利用qsort函数来排序。
最后又写了一个分配连续内存的结构体数组进行qsort,两全其美(参考代码2)。
注意事项:
坑1:用malloc务必保证连续性,一次分配完所需大小,否则不能qsort,得自己写排序算法。如果用指针数组循环分配单个结构体大小会吃这个亏。
坑2:样例只给了一组数据输入输出,但实际上题意是多组数据输入输出,需要while循环scanf至EOF。
坑3:题目说按成绩排序,相同再按名字,但仅仅做到这样还是WA,还得拓展思考——名字也相同,按年龄来排序。
参考代码1(不使用动态内存分配):
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct student
{
char name[101];
int age;
int mark;
}stu;
int cmp(const void * e1, const void* e2)
{
if (((stu*)e1)->mark != ((stu*)e2)->mark)//成绩不同优先判断成绩
return ((stu*)e1)->mark - ((stu*)e2)->mark;
if (strcmp(((stu*)e1)->name, ((stu*)e2)->name))//成绩相同,判断名字
return strcmp(((stu*)e1)->name, ((stu*)e2)->name);
return ((stu*)e1)->age - ((stu*)e2)->age;//名字也相同,再根据年龄判断
}
int main()
{
int n = 0,i = 0;
stu group[1000];
while (scanf("%d", &n) != EOF)//注意多组输入
{
for (i = 0;i < n;i++)
{
scanf("%s %d %d", group[i].name, &group[i].age, &group[i].mark);//循环录入每组数据
}
qsort(group, n, sizeof(stu), cmp);//快速排序
for (i = 0;i < n;i++)
{
printf("%s %d %d\n", group[i].name, group[i].age, group[i].mark);//输出排序后的结果
}
}
return 0;
}参考代码2(优化版,动态内存分配,结构体数组在内存连续以进行qsort):
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct student
{
char name[101];
int age;
int mark;
}stu;
int cmp(const void * e1, const void* e2)
{
if (((stu*)e1)->mark != ((stu*)e2)->mark)
return ((stu*)e1)->mark - ((stu*)e2)->mark;
if (strcmp(((stu*)e1)->name, ((stu*)e2)->name))
return strcmp(((stu*)e1)->name, ((stu*)e2)->name);
return ((stu*)e1)->age - ((stu*)e2)->age;
}
int main()
{
int n = 0, i = 0;
while (scanf("%d", &n) != EOF)
{
stu* p = (stu*)malloc(sizeof(stu)*n);//一次分配好空间,保证连续性
for (i = 0;i < n;i++)
{
scanf("%s %d %d", (p[i].name), &(p[i].age), &(p[i].mark));
}
qsort(p, n, sizeof(stu), cmp);
for (i = 0;i < n;i++)
{
printf("%s %d %d\n", (p[i].name), (p[i].age), (p[i].mark));
}
free(p);//每当一组输入输出结束,将p释放掉。
}
return 0;
}0.0分
11 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复