1028 人口普查

2021-09-02 20:33:21 字數 2107 閱讀 8053

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

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