1028 人口普查 (20分)
1028 人口普查 (20分)
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。
输入格式:
输入在第一行给出正整数 N,取值在(0,105];随后 N 行,每行给出 1 个人的姓名(由不超过 5 个英文字母组成的字符串)、以及按 yyyy/mm/dd
(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。
输出格式:
在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。
输入样例:
5
John 2001/05/12
Tom 1814/09/06
Ann 2121/01/30
James 1814/09/05
Steve 1967/11/20
输出样例:
3 Tom John
#include<stdio.h>
#include<string.h>
typedef struct dang
{
char a[6];
int year,month,day;
}dang;
int legal(int year,int month,int day)
{
if(year>2014||year<2014-200)
return 0;
if(year==2014&&(month>9||(month==9&&day>6)))
{
return 0;
}
if(year==2014-200&&(month<9||(month==9&&day<6)))
return 0;
return 1;
}
int compare(dang s1,dang s2)
{
if(s1.year!=s2.year)
return s1.year-s2.year;
else
{
if(s1.month!=s2.month)
return s1.month-s2.month;
else
return s1.day-s2.day;
}
}
int main()
{
int n;
scanf("%d",&n);
int i;
dang s[n];
int year,month,day;
char name[6];
int count=0;
for(i=0;i<n;i++)
{
scanf("%s %d/%d/%d",name,&year,&month,&day);
if(legal(year,month,day))
{
strcpy(s[count].a,name);
s[count].year=year;
s[count].month=month;
s[count].day=day;
count++;
}
}
dang max,min;
max=s[0];
min=s[0];
for(i=1;i<count;i++)
{
if(compare(max,s[i])>0)
max=s[i];
if(compare(min,s[i])<0)
min=s[i];
}
if(count)
printf("%d %s %s\n",count,max.a,min.a);
else
printf("%d\n",count);
return 0;
}
代码讲解:此题主要是考虑年龄是否合法。。上,想清楚这个问题就很简单了