1028 人口普查(20)(20 分)
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月6日,所以超过200岁的生日和未出生的生日都是不合理的,应该被过滤掉。
输入格式:
输入在第一行给出正整数N,取值在(0, 10^5];随后N行,每行给出1个人的姓名(由不超过5个英文字母组成的字符串)、以及按“yy/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.0所示,我起初的思路是将年月日分开,判断生日是否有效时,先比较年份的大小,当年份和2014或者1814一样时,再去比较月份,以此类推,同理求最年长和最年轻的人时也是如此。虽然也是求了出来但是代码不够简便,于是便生成了代码2.0版本。
代码1:
#include<stdio.h>
#include<stdlib.h>
typedef struct Node {
char name[5];
int y,m,d;
}Node;
void cmp(Node *array,Node *min,Node *max)
{
if(max->y<array->y){
*max=*array;
}
else if(max->y==array->y&&max->m<array->m){
*max=*array;
}
else if(max->y==array->y&&max->m==array->m&&max->d<array->d){
*max=*array;
}
if(min->y>array->y){
*min=*array;
}
else if(min->y==array->y&&min->m>array->m){
*min=*array;
}
else if(min->y==array->y&&min->m==array->m&&min->d>array->d){
*min=*array;
}
return;
}
int main()
{
int n,i,j=0,k,value;
char str[6];
int a,b,c,result;
Node *array,max,min;
scanf("%d",&n);
array=(Node*)malloc(n*sizeof(Node));
for(i=0;i<n;i++){
scanf("%s %d/%d/%d",&str,&a,&b,&c);
k=j;
if(a>1814&&a<2014){
j++;
}
else if(a==1814&&b>9){
j++;
}
else if(a==1814&&b==9&&c>=6){
j++;
}
else if(a==2014&&b<9){
j++;
}
else if(a==2014&&b==9&&c<=6){
j++;
}
if(k!=j){
strcpy(array[k].name,str);
array[k].y=a;
array[k].m=b;
array[k].d=c;
}
}
max=array[0];
min=array[0];
for(i=1;i<j;i++){
cmp(&array[i],&max,&min);//求最年长和最年轻的人
}
if(j==0){
printf("0\n");//有效人数为零时没有人名
}
else{
printf("%d %s %s\n",j,max.name,min.name);
}
return 0;
}
减少了一半的代码行,直接将生日按字符串读取,通过比较字符串的大小直接剔除无效生日和确定最大值和最小值的字符串。
值得一提的是最大值字符串所代表的恰恰是最年轻的,最小值字符串代表最年长的,因而在输出时二者换了位置。
该代码运用了strcpy(),和strcmp()函数,小白请自行百度。
代码2.0:
#include<stdio.h>
#include<string.h>
typedef struct Node{
char name[6];
char data[11];
}Node;
int main()
{
Node up,low,max,min,p;
int n,cnt=0;
scanf("%d",&n);
strcpy(up.data,"2014/09/06");
strcpy(low.data,"1814/09/06");
max=low; //最大值字符串
min=up; //最小值字符串
while(n){
scanf("%s%s",&p.name,&p.data);
if(strcmp(up.data,p.data)>=0&&strcmp(low.data,p.data)<=0){
if(strcmp(max.data,p.data)<0){
max=p;
}
if(strcmp(min.data,p.data)>0){
min=p;
}
cnt++;
}
n--;
}
if(cnt==0){
printf("0\n");
return 0;
}
printf("%d %s %s\n",cnt,min.name,max.name);
return 0;
}