原题链接:成绩排序
解题思路:
一开始我的思路是此题结构体大小应该根据每次输入的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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复