概述
题目
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月6日,所以超过200岁的生日和未出生的生日都是不合理的,应该被过滤掉。
输入格式:
输入在第一行给出正整数N,取值在(0, 10^5^];随后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
实现思路:乍一看此题不难,结构体数组,比较时间大小,数组中抽取最大最小值,但实际操作还有一些窍门。
1.定义结构体,包含每个人姓名,年,月,日;
2.定义合适大小的结构体数组,循环输入数据,剔除掉不符合的,有效存入数组;
3.存入数组过程中比较选出时间的最大值和最小值;
4.输出。
代码实现:
#include<stdio.h>
typedef struct{
char szName[6];
int iYear;
int iMonth;
int iDate;
} PEOPLE;
int main()
{
int iNum=0;
scanf("%d",&iNum);
PEOPLE people[iNum+1];
int iCnt=0;
int iYTemp=0,iMTemp=0,iDTemp=0;
int iMax=0,iYMax=0,iMMax=0,iDMax=0;
int iMin=0,iYMin=2015,iMMin=0,iDMin=0;
for(int i=0;i<iNum;i++)
{
getchar();
scanf("%s %d/%d/%d",people[iCnt].szName,&iYTemp,&iMTemp,&iDTemp);
if((iYTemp>1814||(iYTemp==1814&&iMTemp>9)||(iYTemp==1814&&iMTemp==9&&iDTemp>5))&&(iYTemp<2014||(iYTemp==2014&&iMTemp<9)||(iYTemp==2014&&iMTemp==9&&iDTemp<7)))
{
people[iCnt].iYear=iYTemp;
people[iCnt].iMonth=iMTemp;
people[iCnt].iDate=iDTemp;
if(iYMax<iYTemp||(iYMax==iYTemp&&iMMax<iMTemp)||(iYMax==iYTemp&&iMMax==iMTemp&&iDMax<iDTemp))
{
iYMax=iYTemp;
iMMax=iMTemp;
iDMax=iDTemp;
iMax=iCnt;
}
if(iYMin>iYTemp||(iYMin==iYTemp&&iMMin>iMTemp)||(iYMin==iYTemp&&iMMin==iMTemp&&iDMin>iDTemp))
{
iYMin=iYTemp;
iMMin=iMTemp;
iDMin=iDTemp;
iMin=iCnt;
}
iCnt++;
}
}
if(iCnt==0)
{
printf("0");
}
else
{
printf("%d %s %s",iCnt,people[iMin].szName,people[iMax].szName);
}
return 0;
}
错误及改进分析:在以上时间的比较中,涉及到的临时变量和判断条件太多太繁琐,后参考网友JimmieZou的方法,即将年月日的时间统一比较,如18140906=年*10000+月*100+日,可以节省很多变量和步骤,扩展思考时分秒的比较也可以采用类似方法。在第一次提交后有一个测试点没通过,经分析边界条件都设置准确,后想到如果没有一个数据符合,则没有最大最小年龄的人,所以只输出0,通过。
最后
以上就是温柔发带为你收集整理的PAT 1028人口普查的代码实现及错误分析(C语言)的全部内容,希望文章能够帮你解决PAT 1028人口普查的代码实现及错误分析(C语言)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复