PTA 1028人口普查的代码实现及错误分析(C语言)

题目

某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过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,通过。

猜你喜欢

转载自blog.csdn.net/bawangtu/article/details/81176505