题目描述
职工有职工号,姓名,年龄.输入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);