描述
职工有职工号,姓名,年龄.输入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
数组中的职工信息,即年龄最小的三个职工信息。