华中科技大学结构体的运用C语言编程解答找出年龄最小的3个职工

描述

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

输入描述:

输入第一行包括1个整数N,3<=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>

#define MAX_N 30
#define MAX_NAME_LEN 11

struct Employee {
    int id;
    char name[MAX_NAME_LEN];
    int age;
};
int main() {
    int N;
    scanf("%d", &N);
    struct Employee employees[MAX_N];
    struct Employee min_ages[3];
    // 读取职工信息
    for (int i = 0; i < N; i++) {
        scanf("%d %s %d", &employees[i].id, employees[i].name, &employees[i].age);
    }
    // 初始化最小年龄数组
    for (int i = 0; i < 3; i++) {
        min_ages[i].age = 101; // 初始化为一个比较大的数
    }
    // 寻找最小年龄的三个职工
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < 3; j++) {
            if (employees[i].age < min_ages[j].age || (employees[i].age == min_ages[j].age && employees[i].id < min_ages[j].id)) {
                // 将找到的更小年龄的职工插入到合适位置
                for (int k = 2; k > j; k--) {
                    min_ages[k] = min_ages[k - 1];
                }
                min_ages[j] = employees[i];
                break;
            }
        }
    }
    // 输出结果
    for (int i = 0; i < N && i < 3; i++) {
        printf("%d %s %d\n", min_ages[i].id, min_ages[i].name, min_ages[i].age);
    }
    return 0;
}

详解

首先,我们定义了一个结构体 Employee,用于存储每个职工的信息,包括职工号、姓名和年龄。然后,我们声明了一个结构体数组 employees,用于存储所有输入的职工信息。同时,我们还声明了另一个结构体数组 min_ages,用于存储年龄最小的三个职工的信息。

接下来,我们通过循环读取输入的职工信息,并将其存储在 employees 数组中。

然后,我们初始化了 min_ages 数组,将年龄初始设为一个较大的值(101)以确保第一个职工一定会被选中。同时,我们也将职工号初始化为一个较大的值(10001)以确保在年龄相同时,较小的职工号会被选中。

接着,我们开始遍历 employees 数组,逐个比较每个职工的年龄和职工号。如果当前职工的年龄比 min_ages 中任何一个年龄小,或者年龄相同但职工号比 min_ages 中相应位置的职工号小,那么我们将当前职工插入到 min_ages 数组中,并调整其它职工的位置以确保数组中的职工信息始终是按照年龄从小到大、职工号从小到大排序的。

最后,我们按照顺序输出 min_ages 数组中的职工信息,即年龄最小的三个职工信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

多宝气泡水

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

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

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

打赏作者

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

抵扣说明:

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

余额充值