PAT- 1028人口普查(C語言)
阿新 • • 發佈:2019-02-01
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; }