信息學之於其他競賽學科的不同,就在於需要通過寫程序來表達自己的思維和想法。如何盡可能又快又好地調試程序,成了我們必須要思考的問題。相信很多同學都有過這樣的經歷:思考一個算法只花了半個小時,但是把這個算法寫對卻花了一天。。思考與實現的時間往往不成正比。
下面是我結合自己的經驗給出的一些小建議,僅供大家參考,如果有不太好的地方,也歡迎指正~
關於調試有一個大前提,就是思考的方向一定得嚴謹正確,因為思考決定實現,如果思考的時候有漏洞,那麼實現的程序肯定也不強健。在想出算法之後不要急著實現,一定要認真反復地論證:我的算法每一步的定義是否嚴謹,是不是哪裡還有漏洞,我的算法所得到的東西是否就是題目需要求解的。確認了自己的想法後再開始實現。
假設我們現在寫完了一個程序:
第一步:靜態查錯(俗稱裸眼觀察^_^),即不測試數據,而是通過反復地看代碼來檢查。靜態查錯首先要檢查是否有變量名打錯,語法是否正確,你打的代碼和你的想法是否相符。然後要分析代碼的邏輯性是否嚴謹正確,是否能在所有情況下都能正確運行。最後還要驗證是否在所有邊界情況都能得到正確的解,包括數組是否開夠,會不會有n=0的情況等等。靜態查錯是最有效的查錯方法,為什麼有的大牛能夠一遍寫對很復雜的代碼,因為他們靜態查錯的能力非常之強,並且在敲程序的過程中就已經在靜態查錯了。在實踐中,我建議大家盡量讓自己的程序模塊化(即一個函數做一件事情),然後檢查的時候邊看邊打上注釋,這樣能讓自己更清醒地判斷,也方便以後能輕松閱讀自己的程序。
第二步:動態查錯,用數據來驗證代碼的正確性。人眼往往不可靠,我們需要用更安全的數據來判定。一般而言在普通的OI競賽中,時間是比較充裕的,我們有時間來對拍。對拍需要三個程序,一個是你需要提交的標准程序(std),一個是能夠通過部分數據的暴力程序(plain),一個是用來生成數據的程序(mk_data)。
關於plain程序,一般會比較好寫,所以一定要認真檢查,不要寫錯!
關於mk_data,一般需要得到一個隨機的整數,c++語言寫法如下:
我們可以運行一次mk_data,得到一組數據,然後分別用std和plain跑一遍,看結果是否一樣。當然這樣手動是比較麻煩的,我們可以用腳本來自動對拍,下面是windows下用bat腳本對拍的普通寫法:
(約定plain的輸出文件是1.out,std的輸出文件是2.out)
將這一段話寫在一個文本文件中,將其重命名為ck.bat,然後和上述三個程序放在同一文件夾下,雙擊ck.bat,就能夠實現對拍了。對拍的優勢在於能夠近似模擬出出題人的數據來檢驗你的程序,一般在考場上通過了對拍的程序很難寫掛。當然有的時候隨機數據不一定能夠滿足我們的需求,這時候需要我們從出題人的角度出發,去構造一些最壞情況下的數據,來檢驗我們程序的強健性。
第三步:提交之前,檢查文件名,再次編譯程序,運行一遍樣例,以防手抽。
靜態差錯大大降低了程序出錯的概率,減少了動態調試的時間,動態查錯給程序上了雙保險,最後的檢查防止了意外情況的出現。這樣的程序的正確性能夠大大提高。
在調試中,最關鍵的一點,是站在邏輯的高度去思考程序,而不是從某個數據的角度去查看變量,這樣才能避免陷於調試的泥潭不能自拔。
轉自:
http://hi.baidu.com/pty123/item/410fec03607fb8e0f55ba631