1. 程式人生 > >PAT 1028人口普查的程式碼實現及錯誤分析(C語言)

PAT 1028人口普查的程式碼實現及錯誤分析(C語言)

題目

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

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

實現思路:乍一看此題不難,結構體陣列,比較時間大小,陣列中抽取最大最小值,但實際操作還有一些竅門。

1.定義結構體,包含每個人姓名,年,月,日;

2.定義合適大小的結構體陣列,迴圈輸入資料,剔除掉不符合的,有效存入陣列;

3.存入陣列過程中比較選出時間的最大值和最小值;

4.輸出。

程式碼實現:

#include<stdio.h>

typedef struct{
  char szName[6];
  int iYear;
  int iMonth;
  int iDate;
} PEOPLE;

int main()
{
  int iNum=0;
  scanf("%d",&iNum);
  PEOPLE people[iNum+1];
  int iCnt=0;
  int iYTemp=0,iMTemp=0,iDTemp=0;
  int iMax=0,iYMax=0,iMMax=0,iDMax=0;
  int iMin=0,iYMin=2015,iMMin=0,iDMin=0;
  for(int i=0;i<iNum;i++)
  {
    getchar();
    scanf("%s %d/%d/%d",people[iCnt].szName,&iYTemp,&iMTemp,&iDTemp);
    if((iYTemp>1814||(iYTemp==1814&&iMTemp>9)||(iYTemp==1814&&iMTemp==9&&iDTemp>5))&&(iYTemp<2014||(iYTemp==2014&&iMTemp<9)||(iYTemp==2014&&iMTemp==9&&iDTemp<7)))
    {
		people[iCnt].iYear=iYTemp;
        people[iCnt].iMonth=iMTemp;
        people[iCnt].iDate=iDTemp;
        if(iYMax<iYTemp||(iYMax==iYTemp&&iMMax<iMTemp)||(iYMax==iYTemp&&iMMax==iMTemp&&iDMax<iDTemp))
        {
           iYMax=iYTemp;
           iMMax=iMTemp;
           iDMax=iDTemp;
           iMax=iCnt;
        }
        if(iYMin>iYTemp||(iYMin==iYTemp&&iMMin>iMTemp)||(iYMin==iYTemp&&iMMin==iMTemp&&iDMin>iDTemp))
        {
           iYMin=iYTemp;
           iMMin=iMTemp;
           iDMin=iDTemp;
           iMin=iCnt;
        }
        iCnt++;
    }
  }
  if(iCnt==0)
  {
    printf("0");
  }
  else
  {
    printf("%d %s %s",iCnt,people[iMin].szName,people[iMax].szName);
  }
  return 0;
}

錯誤及改進分析:在以上時間的比較中,涉及到的臨時變數和判斷條件太多太繁瑣,後參考網友JimmieZou的方法,即將年月日的時間統一比較,如18140906=年*10000+月*100+日,可以節省很多變數和步驟,擴充套件思考時分秒的比較也可以採用類似方法。在第一次提交後有一個測試點沒通過,經分析邊界條件都設定準確,後想到如果沒有一個數據符合,則沒有最大最小年齡的人,所以只輸出0,通過。

相關推薦

PAT 1028人口普查程式碼實現錯誤分析C語言

題目 某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。 這裡確保每個輸入的日期都是合法的,但不一定是合理的——假設已知鎮上沒有超過200歲的老人,而今天是2014年9月6日,所以超過200歲的生日和未出生的生日都是不合理的,應該被過濾

PAT 1084外觀數列的程式碼實現錯誤分析C語言

題目 外觀數列是指具有以下特點的整數序列: d, d1, d111, d113, d11231, d112213111, ... 它從不等於 1 的數字 d 開始,序列的第 n+1 項是對第 n 項的描述。比如第 2 項表示第 1 項有 1 個 d,所以就是 d1;第

PAT 1074宇宙無敵加法器的程式碼實現錯誤分析C語言

題目 地球人習慣使用十進位制數,並且預設一個數字的每一位都是十進位制的。而在 PAT 星人開掛的世界裡,每個數字的每一位都是不同進位制的,這種神奇的數字稱為“PAT數”。每個 PAT 星人都必須熟記各位數字的進製表,例如“……0527”就表示最低位是 7 進位制數、第 2

PAT 1075連結串列元素的分類程式碼實現錯誤分析C語言

題目 給定一個單鏈表,請編寫程式將連結串列元素進行分類排列,使得所有負值元素都排在非負值元素的前面,而 [0, K] 區間內的元素都排在大於 K 的元素前面。但每一類內部元素的順序是不能改變的。例如:給定連結串列為 18→7→-4→0→5→-6→10→11→-2,K 為 1

PAT 1065單身狗的程式碼實現錯誤分析C語言

題目 “單身狗”是中文對於單身人士的一種愛稱。本題請你從上萬人的大型派對中找出落單的客人,以便給予特殊關愛。 輸入格式: 輸入第一行給出一個正整數 N(≤ 50 000),是已知夫妻/伴侶的對數;隨後 N 行,每行給出一對夫妻/伴侶——為方便起見,每人對應一個 ID 號

八大排序——氣泡排序的優化演算法效能分析C語言

穩定性:氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,是不必再去交換的;如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前後順序並沒有改變,所以氣泡排序是一種穩定排序演算法。

求斐波那契數列第n位的幾種實現方式效能對比c#語言

在每一種程式語言裡,斐波那契數列的計算方式都是一個經典的話題。它可能有很多種計算方式,例如:遞迴、迭代、數學公式。哪種演算法最容易理解,哪種演算法是效能最好的呢? 這裡給大家分享一下我對它的研究和總結:下面是幾種常見的程式碼實現方式,以及各自的優缺點、效能對比。 Iteration using Syst

LeetCode 28. 實現strStr() Implement strStr()C語言

題目描述: 實現 strStr() 函式。 給定一個 haystack 字串和一個 needle 字串,在 haystack 字串中找出 needle 字串出現的第一個位置 (從0開始)。如果不存在,則返回 -1。 示例 1: 輸入: haystack = “hell

PAT 1028. 人口普查

ace 輸入格式 2014年 als birt stream spa 返回 年輕 人口普查 某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程序,找出鎮上最年長和最年輕的人。 這裏確保每個輸入的日期都是合法的,但不一定是合理的——假設已知鎮上沒有超過200歲的老人,而今

PAT- 1028人口普查(C語言

1028 人口普查(20)(20 分) 某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。 這裡確保每個輸入的日期都是合法的,但不一定是合理的——假設已知鎮上沒有超過200歲的老人,而今天是2014年9月6日,所以超過200歲的生日和未

PAT 1028 人口普查(20)STL-set+思路+測試點分析

1028 人口普查(20)(20 分) 某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。 這裡確保每個輸入的日期都是合法的,但不一定是合理的——假設已知鎮上沒有超過200歲的老人,而今天是2014年9月6日,所以超過200歲的生日和未

1028 人口普查 Python實現

1028 人口普查(20)(20 分) 某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。 這裡確保每個輸入的日期都是合法的,但不一定是合理的——假設已知鎮上沒有超過200歲的老人,而今天是2014年9月6日,所以超過200歲的生日和未

在樹莓派上讀取土壤溼度感測器讀數-python程式碼實現常見問題全面簡單易懂

本篇文章簡單介紹瞭如何在樹莓派上配置土壤溼度感測器以讀取土壤溼度及程式碼實現。 主要包含有以下4個模組: 一、土壤溼度感測器常見型別及介紹 二、實驗所需裝置 三、裝置連線方式與程式碼實現 四、常見問題及注意事項 需要哪個模組的內容直接跳轉去看即可~   一、土壤溼度感測器常見型別及介紹  

資料結構c語言——鏈棧儲存結構實現

鏈棧:就是一種特殊的單鏈表,FILO(先進後出) 通常對於連結串列來說: 1.是不需要頭節點的。 2.基本不存在滿棧的情況,除非記憶體已沒有可用的空間。   不多bibi你們都懂哈,直接上程式碼:  鏈棧結構: typedef struct Stock

分數的四則運算化簡C語言實現

下面這個程式使用C語言的結構體實現了分數的加減乘除四則運算,同時將結果最簡化。這裡為了簡化,將輸入值固定了,如果需要根據輸入進行計算,將main函式內的相應部分稍作修改即可。 #include <stdio.h> struct fraction { int nu

順序表的插入操作原理實現C語言詳解

順序表中存放資料的特點和陣列這種資料型別完全吻合,所以順序表的實現使用的是陣列。換句話說,順序表中插入元素問題也就等同於討論如何向陣列中插入資料。 因此,順序表中插入資料元素,無非三種情況: 在表頭插入; 在表的中間某個位置插入; 直接尾隨順序表,作為表的最後一個元素; 無論在順序表的什麼位置插

資料結構c語言——鏈佇列儲存結構實現

是佇列鴨,FIFO,先進先出! 對於帶頭節點的和不帶頭節點的鏈佇列的操作有個小小的區別: 不帶頭結點的鏈佇列在入佇列的時候,第一個元素時要先判斷是否為空,再插入。而帶頭結點不需要,操作更方便些;  我是分割線-----------------------------

迴圈佇列全部操作實現程式碼C語言

棧和佇列不愧為親兄弟,在棧的實現基礎上簡單改改即可實現佇列全部操作,加上迴圈二字,也就是多了個%取餘(模)運算,放上成果,立碼為證: /* 實現迴圈佇列的全體操作 */ #include "stdio.h" #define MAXSIZE 50 #define TRUE

判斷點是否在多邊形內的Python實現小應用射線法

判斷點是否在多邊形內的Python實現及小應用(射線法) 轉 https://www.jianshu.com/p/ba03c600a557 判斷一個點是否在多邊形內是處理空間資料時經常面對的需求,例如GIS中的點選功能、根據多邊形邊界篩選出位於多邊形內的點、求交集、篩選不在多邊形內

資料結構C語言讀書筆記6:棧的應用之括號匹配的C程式碼實現

括號匹配的演算法思想: 初始化一個空棧,掃描表示式,依次讀入字元,知道掃描完或者出現錯誤匹配。對於讀入的每個字元,分以下情況處理: (1)、如果是‘’(“”或“【”,將其壓入棧。 (2)、如果是“)”,則根據當前棧頂元素的值分情況考慮。若棧頂元素是“(”,則匹配成功,否則為