学生信息排序,题目在此:http://poj.grids.cn/practice/3719/
相对容易的一道题。但搞了很久都没做出来。对其中“按名字排序后输出”不甚了了。在网上搜索了一下测试数据。发现是自己开始的理解没有错,但对qsort的cmp函数的返回值的理解有错。特记录于此:
int cmp(a, b) { if (a > b) return 1; else if(a < b) return -1; else return 0; }而用qsort排序之后,如果a > b,那么a将出现在b的后面。一个很好理解的比喻是这样的:a > b,表明a比b重,a比b重,所以b冒在前面,而a跑到b的后面去了。
完整的AC代码如下:
#include <cstring> #include <cstdlib> #include <cctype> #include <cstdio> struct student //此处的student是一个结构体“标示符”。在C++中,定义结构体之后,结构体标识符同时也是对应的结构体类型符,可以用它来声明变量。 { char name[25], sex; int num, age; } s[110]; int cmp (const void *a, const void *b) { char *namea, *nameb; namea = ((student *)a)->name; nameb = ((student *)b)->name; int len1 = strlen(namea); int len2 = strlen(nameb); int len = (len1 < len2) ? len1 : len2; //此处i <= len中的=号,是考虑到其中较短的字符串是长的字符串的前缀。在这种情况下,假如a是b的前缀,那么len = strlen(a),a[len]<b[len]。因为a[len]是a的字符串结束标识符,值为0。 for (int i = 0; i <= len; i++) { if (tolower(namea[i]) > tolower(nameb[i])) return 1; else if (tolower(namea[i]) < tolower(nameb[i])) return -1; } } bool getalph(char *name0) { char c; while ((c = getchar()) != EOF && !isalpha(c)); if (c == EOF) return false; else { *name0 = c; return true; } } int main() { int i = 0, j = 0, k = 0; while (getalph(&s[i].name[0])) { gets(&s[i].name[1]); scanf("%d,%c%d", &s[i].num, &s[i].sex, &s[i].age); i++; } //qsort调用cmp函数时,向cmp传入的两个指针是数组s的两个元素的起始地址 qsort(s, i, sizeof(s[0]), cmp); for (j = 0; j < i; ++j) { printf("%s\n", s[j].name); printf("%08d,%c %d\n", s[j].num, s[j].sex, s[j].age); } return 0; }