第11篇 ACM/ICPC競賽之調試

在寫程序時,調試程序也是一個重要的環節。怎樣才能夠更有效地調試程序,發現並修正錯誤呢?

1、調試中的輸入輸出

爲了調試程序,我們可能需要反覆執行程序,也就需要反覆輸入相同或不相同的測試數據。如果每次調試運行時都是以手工的方式輸入測試數據,相信很多人都會覺得不勝其煩。其實我們可以用一些輔助的手段來簡化這個過程。

方法一:使用剪貼板

可以將輸入數據預先寫好(用記事本、開發環境的編輯器或隨便什麼能夠錄入的東西),再將輸入數據複製到剪貼板上(也就是說我們通常所說的複製操作)。在調試運行時,就可以直接將輸入數據粘貼上去,不需要手工輸入,這對於反覆調試同一組測試數據尤其方便。

方法二:使用重定向

使用剪貼板對於多組測試數據或者比較長的測試數據就會顯得不那麼好用了。而使用輸入輸出的重定向則會更方便。

輸入輸出重定向是在終端窗口下的一種命令行功能,在命令行上可以用“<”表示輸入重定向,在“<”後跟隨輸入文件名,則程序將從指定的輸入文件中獲取輸入數據,而不再從鍵盤讀入數據。也可以用“>”表示輸出重定向。在“>”後跟輸出文件名,則程序產生的標準輸出將寫入指定的輸出文件中,而不是顯示在屏幕上。

我們可以預先將輸入數據存到文本文件中(如果有多組測試數據,可以存成多個文件),用重定向指定準備使用的輸入數據。

 

例如,程序名爲myprog,輸入數據已經存到文件test.txt中,則在命令行下可以這樣執行:

C:>myprog < test.txt

則程序會直接從test.txt中讀取輸入。如果想把輸出結果也存到文件中(這在輸出結果比較多的時候尤其有用,因爲直接輸出到屏幕上可能會來不及看到輸出,或看不全所有的輸出),例如,可以這樣執行:

C:>myprog > test.out

這樣我們就可以在執行後,用一個文本編輯器打開輸出文件,慢慢閱讀和分析輸出結果。

如果把輸入和輸出的重定向結合起來,也可以這樣執行:

C:>myprog < test.txt > test.out

2、輸出調試信息

在調試時,很多同學往往首先想到的是使用開發環境所提供的調試功能:設置斷點、單步執行、查看和修改變量,甚至改變程序的流程。不可否認,使用開發環境所提供的調試功能的確很方便,但當你過分依賴於這些集成工具時,你可能忽略了很多更有效的手段:仔細地分析、充分的信息。

當我們發現程序沒有按照自己預期得那樣工作時,不要急於跟蹤甚至修改程序,而是應該首先仔細對程序的邏輯、語句、表達式進行檢查和分析,儘可能使程序在表達上更簡潔、更乾淨。如果實在難以發現問題所在,也不必急於藉助於集成工具去跟蹤程序的運行。早期的程序員在調試程序時經常會在程序中加入輸出調試信息的語句或過程,用以觀察程序的運行過程,分析程序的運行邏輯,這種調試手段即使在今天也仍然是非常有效的。

輸出的調試信息要儘量容易閱讀,格式清楚,在必要的時候,可以藉助工具程序或自己編寫的程序對輸出信息進行處理,以幫助分析問題。

3、發現線索

調試的目的就是要分析錯誤發生的原因,尋找線索。盲目的調試只會浪費時間。

調試中的技巧很多,這裏提出幾條基本原則:

首先是要使錯誤可重現,要設法保證能夠使錯誤按照自己的意願重複出現。對於不知道什麼時候會冒出來的錯誤,分析起來會困難得多!

縮小導致錯誤的輸入,設法構造出最小的又能保證錯誤出現的輸入,這樣可以減少變化的可能性,使分析範圍更集中。經常可以採用二分選擇的方法來選擇輸入,就是舍掉一半輸入,看看錯誤是否會出現,如果不出現,則選擇另一半輸入,如此反覆,並不斷縮小導致錯誤的輸入。

4、構造測試數據和測試程序

在題目中所給出的測試樣例只是一小組測試數據,這雖然通常是我們用來測試程序的第一組數據,但卻是遠遠不夠的。我們應該根據題意自行構造更多的測試數據,尤其是一些邊界狀態的測試數據(數據極大、數據極小、數據量極多、數據量極少、預期出現極端結果等情況)。

邊界測試數據可以用於檢查程序中是否存在邊界錯誤,設計有缺陷的程序,在處理邊界測試數據時往往容易暴露出錯誤。但如果沒有發生明顯的運行錯誤,就需要對結果的正確性進行驗證。

有些測試數據可以通過手工計算求出結果,再與程序的計算結果相對比,而也有些問題,可以通過構造測試程序來進行驗證。

測試程序通常是用確定可靠的算法編寫的解題程序,但不須考慮時間和空間的消耗,用測試程序對測試數據進行求解,用計算結果與待測試程序的計算結果進行對比。

以題1041--純素數問題爲例,我們可以用最簡單的窮舉法進行求解,也許這樣的解法是不被接受的,因爲效率太低,但這個解法卻可以用作我們的測試程序,甚至——有同學索性在本地先用這個程序把結果算出來,再寫一個程序直接輸出結果——居然也被接受了!

寫得有點疲了,腦子也有點麻木了~~~~先這樣吧,等緩一緩再說吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章