1. 程式人生 > >PAT乙級 1028 人口普查

PAT乙級 1028 人口普查

某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。

這裡確保每個輸入的日期都是合法的,但不一定是合理的——假設已知鎮上沒有超過 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

思路:

建立結構保體存居民的名字、出生日期。在錄入資訊時對年齡的合理性進行判斷,合理則計數加一併登記在冊,同時記錄下合理年齡中年齡最大者與年齡最小者的位置。最後輸出有效生日的個數、最年長人和最年輕人的姓名。

程式碼:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INIT_SIZE 100
#define INCREMENT 100 
typedef struct{
	char name[6],birthday[11];
}resident; 
typedef struct{
	resident *elem;
	int length,listsize;
}residentlist;
int main(){
	resident *newbase; 
	residentlist L;
	L.elem=(resident *)malloc(INIT_SIZE*sizeof(resident));
	L.listsize=INIT_SIZE;
	L.length=0;
	int N;
	scanf("%d",&N);
	char temp_name[6],temp_birthday[11],t_year[9];
	int thisyear=20140906;
	int birthday,age;
	int max=2000000,min=0;
	int oldest=min,youngest=max;
	int p_oldest=0,p_youngest=0;
	for(int i=0;i<N;++i){
		if(L.length>=L.listsize){
			newbase= (resident *)realloc(L.elem,(L.listsize+INCREMENT)*sizeof(resident));
			L.elem=newbase;
			L.listsize+=INCREMENT;
		}
		scanf("%s %s",temp_name,temp_birthday);
		for(int j=0,k=0;j<strlen(temp_birthday);++j){
			if(temp_birthday[j]!='/'){
				t_year[k++]=temp_birthday[j];
			}
		}
		birthday=atoi(t_year);
		age=thisyear-birthday;
		if(age<=max&&age>=min){
			if(age>oldest){
				oldest=age;
				p_oldest=L.length;
			}
			if(age<youngest){
				youngest=age;
				p_youngest=L.length;
			}
			strcpy(L.elem[L.length].name,temp_name);
			strcpy(L.elem[L.length++].birthday,temp_birthday);
		}
	}
	if(L.length>0){
		printf("%d %s %s",L.length,L.elem[p_oldest].name,L.elem[p_youngest].name);
	}
	else{
		printf("0");
	}
	return 0;
}

在這裡插入圖片描述