学生信息排序,题目在此: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;
}