十餘年前的入職C語言培訓作業-控制台日曆(下)

十餘年前的入職C語言培訓作業-控制台日曆(下)

來自專欄 我的代碼世界

上篇鏈接《十餘年前的入職C語言培訓作業-控制台日曆(上)》

中篇鏈接《十餘年前的入職C語言培訓作業-控制台日曆(中)

編碼實現

有了上兩篇的基礎,就可以沒什麼難度地著手編寫程序代碼了。

完整版的代碼鏈接在這裡:

github.com/loveaspdotne

這個代碼當年是用TC2.0環境編譯運行的,所以如果今天想讓它在別的編譯器下通過編譯,可能需要再做出一定的細節上的修改。

總結一下關鍵的技術點如下:

  1. 除2月外,其餘月份的總天數,通過查表方式獲得。2月的天數,需要判斷是不是閏年。
  2. 最複雜的計算,在計算給定月份的1日是星期幾。程序的思路是先把該日期到基準日的總天數計算出來,再求其與7的餘數,最後按基準日的星期調整結果。
  3. 1582年10月的日曆,不是正常月份的日曆,所以固定輸出就可以了。
  4. 各日期的排版,補空格和換行時需注意日期超過兩位數後的對齊。

這個代碼質量,現在看來真的非常差。現在我來重寫的話,首先全局變數消滅掉,其次函數的調用結構應該設計得更加合理,過大的函數應該進一步拆分,以方便單元測試。

同時再次請大家千萬要忽略我注釋中遍布的英語語法錯誤,真的好丟人。

測試

當年沒有做單元測試,只是通過不同的輸入數據,黑盒測試了各個不同年代的輸入對應的輸出。當年的測試數據見這個鏈接(Excel格式需下載才能查看):

github.com/loveaspdotne

因為不同的年代,計算日曆有不同的規則,所以在年代的結點處(1582年)以及結點前後都進行了很多的測試,以保證程序可以正常動作。

現在看來,當年的測試,沒有對「異常輸入」進行測試,這應該算是一個重大的遺漏了。

最後

感謝大家關注這個話題。我知道,把一個小程序做到這種程度,也許是有些小題大作吧。但在實際工作中,一個成功的軟體項目,從前期投入到後期維護,的確涉及了方方面面的知識。新手程序員,包括曾經的我,將精力過於用在對編程語言細節的掌握上,雖是開卷有益,但僅僅精通編程語言,是遠遠不夠的。

在今後的專欄中,我還會繼續記錄一些自己工作中的心得體會、編程相關的小技巧、以及學習的感悟等等,也歡迎大家繼續關注。

推薦閱讀:

Vagrant+Virtualbox 打造統一的部署環境
零基礎入門開發行業 - 0.0.1
萌萌牛遊戲330拆分模式解析
Git的理念
老王啊,你不管管你們家數據了?(技術周刊 2018-03-09)

TAG:編程 | C編程語言 | 軟體開發 |