十餘年前的入職C語言培訓作業-控制台日曆(下)
來自專欄 我的代碼世界
上篇鏈接《十餘年前的入職C語言培訓作業-控制台日曆(上)》
中篇鏈接《十餘年前的入職C語言培訓作業-控制台日曆(中)》
編碼實現
有了上兩篇的基礎,就可以沒什麼難度地著手編寫程序代碼了。
完整版的代碼鏈接在這裡:
https://github.com/loveaspdotnet/ccalendar/blob/master/CALENDER.C
這個代碼當年是用TC2.0環境編譯運行的,所以如果今天想讓它在別的編譯器下通過編譯,可能需要再做出一定的細節上的修改。
總結一下關鍵的技術點如下:
- 除2月外,其餘月份的總天數,通過查表方式獲得。2月的天數,需要判斷是不是閏年。
- 最複雜的計算,在計算給定月份的1日是星期幾。程序的思路是先把該日期到基準日的總天數計算出來,再求其與7的餘數,最後按基準日的星期調整結果。
- 1582年10月的日曆,不是正常月份的日曆,所以固定輸出就可以了。
- 各日期的排版,補空格和換行時需注意日期超過兩位數後的對齊。
這個代碼質量,現在看來真的非常差。現在我來重寫的話,首先全局變數消滅掉,其次函數的調用結構應該設計得更加合理,過大的函數應該進一步拆分,以方便單元測試。
同時再次請大家千萬要忽略我注釋中遍布的英語語法錯誤,真的好丟人。
測試
當年沒有做單元測試,只是通過不同的輸入數據,黑盒測試了各個不同年代的輸入對應的輸出。當年的測試數據見這個鏈接(Excel格式需下載才能查看):
https://github.com/loveaspdotnet/ccalendar/blob/master/calenderTest.xls
因為不同的年代,計算日曆有不同的規則,所以在年代的結點處(1582年)以及結點前後都進行了很多的測試,以保證程序可以正常動作。
現在看來,當年的測試,沒有對「異常輸入」進行測試,這應該算是一個重大的遺漏了。
最後
感謝大家關注這個話題。我知道,把一個小程序做到這種程度,也許是有些小題大作吧。但在實際工作中,一個成功的軟體項目,從前期投入到後期維護,的確涉及了方方面面的知識。新手程序員,包括曾經的我,將精力過於用在對編程語言細節的掌握上,雖是開卷有益,但僅僅精通編程語言,是遠遠不夠的。
在今後的專欄中,我還會繼續記錄一些自己工作中的心得體會、編程相關的小技巧、以及學習的感悟等等,也歡迎大家繼續關注。
推薦閱讀:
※Vagrant+Virtualbox 打造統一的部署環境
※零基礎入門開發行業 - 0.0.1
※萌萌牛遊戲330拆分模式解析
※Git的理念
※老王啊,你不管管你們家數據了?(技術周刊 2018-03-09)