某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。
這裡確保每個輸入的日期都是合法的,但不一定是合理的——假設已知鎮上沒有超過 200 歲的老人,而今天是 2014 年 9 月 6 日,所以超過 200 歲的生日和未出生的生日都是不合理的,應該被過濾掉。
輸入格式:
輸入在第一行給出正整數 n,取值在(0,105];隨後 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
思路
&esmp;先定義結構體型別 person 來存放人的姓名、出生日期,由於題目中涉及下面 4 個資訊,因此需要設定四個變數來存放它們:
① 最年長的人,需要根據輸入不斷修正,因此不妨設定 person 型結構體變數 oldest 來存放它,初始化其出生日期為 2014 年 9 月 6 日。
② 最年輕的人,需要根據輸入不斷修正,因此不妨設定 person 型結構體變數 youngest 來存放它,初始化其出生日期為 1814 年 9 月 6 日。
③ 合法日期的左邊界 1814 年 9 月 6 日在程式中固定不變,因此不妨設定 person 型結構體變數 left 來存放它,初始化其日期為 1814 年 9 月 6 日。
④ 合法日期的右邊界 2014 年 9 月 6 日在程式中固定不變,因此不妨設定 person 型結構體變數 right 來存放它,初始化其日期為 2014 年 9 月 6 日。
程式的基本思路是:再讀入日期時判斷該日期是否在合法日期的區間內,如果在,就使其更新最年長的人的出生日期和最年輕的人的出生日期。由於判斷日期是否在合法日期區間內、更新最年長和最年輕的資訊都將涉及日期的比較操作,因此不妨寫兩個比較函式 lessequ(person a, person b) 與 moreequ(person a, person b),用來比較 a 與 b 的日期,其中,當 a 的日期小於等於 b 的日期時 lessequ 返回 true,而當 a 的日期大於等於 b 的日期時 moreequ 返回 true 。
注意① 有可能存在所有人的日期都不在合法區間內的情況,這是必須特判輸出 0 ,否則會因後面多輸出空格而返回 「 格式錯誤 」 。
② 在使用新讀入的日期來更新最大日期和最小日期時,有可能同時更新最大日期和最小日期,因此不能使用 if … else 的寫法來選擇其中乙個更新。
&esmp;&esmp;③ 日期比較函式只寫乙個的寫法會導致邊界日期的處理出現問題。
**:
#include
struct personoldest, youngest, left, right, temp;
//oldest與youngest存放最年長與最年輕的人,left與right存放合法日期的左右邊界
bool
lessequ
(person a, person b)
bool
moreequ
(person a, person b)
//youngest與left為2023年9月6日,oldest與right為2023年9月6日
void
init()
intmain()
}if(num ==0)
printf
("0\n");
//所有人的日期都不合法,只輸出0
else
printf
("%d %s %s\n"
, num, oldest.name, youngest.name)
;return0;
}
結果:
1028 人口普查
某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。這裡確保每個輸入的日期都是合法的,但不一定是合理的 假設已知鎮上沒有超過200歲的老人,而今天是2014年9月6日,所以超過200歲的生日和未出生的生日都是不合理的,應該被過濾掉。輸入格式 輸入在第一行給出正整數n...
1028 人口普查
某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。這裡確保每個輸入的日期都是合法的,但不一定是合理的 假設已知鎮上沒有超過200歲的老人,而今天是2014年9月6日,所以超過200歲的生日和未出生的生日都是不合理的,應該被過濾掉。輸入格式 輸入在第一行給出正整數n...
1028 人口普查
某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。這裡確保每個輸入的日期都是合法的,但不一定是合理的 假設已知鎮上沒有超過200歲的老人,而今天是2014年9月6日,所以超過200歲的生日和未出生的生日都是不合理的,應該被過濾掉。輸入格式 輸入在第一行給出正整數n...