您的位置:首页 > 编程语言 > C语言/C++

1028. 人口普查(20) PAT乙级真题

2017-12-02 11:10 387 查看
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

我在做这道题的时候在网上学到了两个挺好的(至少比我的方法好)的日期比较的方法,一:因为这道题的特殊输入格式,可以直接用字符串的字典比较法比较大小;二:将日期转化成数字如题目中的2001/05/12转化成20010512这个数字进行比较,这种方法比较通用,下面是我的代码(方法都没上面两种好,将就着看吧):
#include<stdio.h>
#include<string.h>

struct people
{
char name[10];
int year;
int month;
int day;
}old,young;

int main(void)
{
char c[10];
int s=0,k;
int i,j,f;
int year,month,day;
scanf("%d%*c",&k);
old.year=2014;old.month=9;old.day=7;
young.year=1814;young.month=9;young.day=5;
for (i=0;i<k;i++)
{
f=1;j=0;
do
{
scanf("%c",&c[j]);
}while(c[j++]!=' ');
c[--j]='\0';
scanf("%d%*c%d%*c%d%*c",&year,&month,&day);
if (year>=1814)
{
if (year==1814)
{
if (month>=9)
{
if (month==9)
if (day>=6)
f=1;
else
f=0;
}
else f=0;
}
}
else f=0;
if (year<=2014)
{
if (year==2014)
{
if (month<=9)
{
if (day<=6)
{
if (f==0) f=0;
}
else f=0;
}
else f=0;
}
}
else f=0;
if (f==1)
{
s++;
if (year<=old.year)
{
if (year==old.year)
{
if (month<=old.month)
{
if (month==old.month)
{
if (day<=old.day)
{
old.year=year;
old.month=month;
old.day=day;
strcpy(old.name,c);
}
}
}
else
{
old.year=year;
old.month=month;
old.day=day;
strcpy(old.name,c);

}
}
else
{
old.year=year;
old.month=month;
old.day=day;
strcpy(old.name,c);
}
}
if (year>=young.year)
{
if (year==young.year)
{
if (month>=young.month)
{
if (month==young.month)
{
if (day>=young.day)
{
young.year=year;
young.month=month;
young.day=day;
strcpy(young.name,c);
}
}
}
else
{
young.year=year;
young.month=month;
young.day=day;
strcpy(young.name,c);

}
}
else
{
young.year=year;
young.month=month;
young.day=day;
strcpy(young.name,c);

4000
}
}
}
}
if (s!=0)
{
printf("%d %s %s",s,old.name,young.name);
}
else
{
printf("0");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PAT c语言