牛客网 华中科技大学 最小年龄的3个职工

本文介绍了一种使用C语言和qsort函数对职工信息进行排序的方法,重点在于如何实现基于年龄、工号和姓名的升序排列,以及如何打印出年龄最小的职工信息。

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

题目描述

职工有职工号,姓名,年龄.输入n个职工的信息,找出3个年龄最小的职工打印出来。

输入描述:

输入第一行包括1个整数N,1<=N<=30,代表输入数据的个数。
接下来的N行有N个职工的信息:
包括职工号(整数), 姓名(字符串,长度不超过10), 年龄(1<=age<=100)。

输出描述:

可能有多组测试数据,对于每组数据,
输出结果行数为N和3的较小值,分别为年龄最小的职工的信息。
关键字顺序:年龄>工号>姓名,从小到大。

示例1

输入

5
501 Jack 6
102 Nathon 100
599 Lily 79
923 Lucy 15
814 Mickle 65

输出

501 Jack 6
923 Lucy 15
814 Mickle 65

答案

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define N 30

typedef struct node
{
    int num;
    char name[11];
    int age;
} node;

/*
void print(struct node *p)  
{  
    printf("%d %s %d\n", p->num, p->name, p->age);  
} 
*/
//定义cmp函数
int cmp(const void *a, const void *b)
{
    //强转类型,这一步不能省
    node * c = (node *) a;
    node * d = (node *) b;
    //结构体指针访问结构体成员用 ->  
    if(c->age != d->age)
    {
        return c->age - d->age;
    }
    else if(c->num != d->num)
    {
        return c->num - d->num;
    }
    else
    {
        return strcmp(c->name, d->name);
    }
}
int main()
{
    int n, i;
    node a[N];
    //读取职工人数
    while(scanf("%d", &n) != EOF)
    {
        //读取职工信息
        for(i = 0; i < n; i++)
        {
            scanf("%d %s %d", &(a[i].num), a[i].name, &(a[i].age));
        }
        //qsort包含在stdlib.h头文件里,函数一共四个参数,没返回值
        //qsort(参与排序的数组名或者开始排序的地址,参与排序的元素个数,
        //单个元素的大小“推荐使用sizeof(s[0])这样的表达式”,比较函数)
        qsort(a, n, sizeof(a[0]), cmp);
        //输出结果行数为N和3的较小值
        int min = n > 3? 3 : n;
        for(i = 0; i < min; i++)
        {
            //print(&a[i]);
            //结构体变量访问结构体成员用 .   
            printf("%d %s %d\n", a[i].num, a[i].name, a[i].age);
        }
    }
    return 0;
}

个人心得

升序排列:数据从低到高排列。

降序排列:数据从高到低排列。

以本题为例:
//强转类型
node * c = (node *) a;
node * d = (node *) b;
1、使用qsort(a, n, sizeof(a[0]), cmp);做升序排列,在int cmp(const void *a, const void *b)中,应该是
return c->age - d->age;
return c->num - d->num;
return strcmp(c->name, d->name);

2、使用qsort(a, n, sizeof(a[0]), cmp);做降序排列,在int cmp(const void *a, const void *b)中,应该是
return d->age - c->age;
return d->num - c->num;
return strcmp(d->name, c->name);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可持续化发展

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值