解题思路:
一开始我的思路是此题结构体大小应该根据每次输入的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 人评分
指针做法浏览:935 |
C语言程序设计教程(第三版)课后习题6.7 (C++代码)浏览:1160 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:1055 |
点我有惊喜!你懂得!浏览:1705 |
2003年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:561 |
最小公倍数 (C语言代码)浏览:895 |
简单的a+b (C语言代码)浏览:752 |
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:818 |
2004年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:539 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:541 |