POJ 3719 qsort学生信息排序

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


你可能感兴趣的:(poj,3719)