POJ 3719 qsort学生信息排序

本文介绍了一道关于学生信息排序的问题,并提供了解决方案。通过使用C++中的qsort函数及自定义比较函数cmp实现了按姓名排序的功能。文章还详细解释了cmp函数的工作原理及其返回值意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值