ACM ICPC競賽之除錯

2021-06-13 16:34:13 字數 2187 閱讀 2862

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

1、除錯中的輸入輸出 

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

方法一:使用剪貼簿 

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

方法二:使用重定向 

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

輸入輸出重定向是在終端視窗下的一種命令列功能,在命令列上可以用「<」表示輸入重定向,在「<」後跟隨輸入檔名,則程式將從指定的輸入檔案中獲取輸入資料,而不再從鍵盤讀入資料。也可以用「>」表示輸出重定向。在「>」後跟輸出檔名,則程式產生的標準輸出將寫入指定的輸出檔案中,而不是顯示在螢幕上。 

我們可以預先將輸入資料存到文字檔案中(如果有多組測試資料,可以存成多個檔案),用重定向指定準備使用的輸入資料。 

例如,程式名為myprog,輸入資料已經存到檔案test.txt中,則在命令列下可以這樣執行: 

c:>myprog < test.txt 

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

c:>myprog > test.out 

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

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

2、輸出除錯資訊 

在除錯時,很多同學往往首先想到的是使用開發環境所提供的除錯功能:設定斷點、單步執行、檢視和修改變數,甚至改變程式的流程。不可否認,使用開發環境所提供的除錯功能的確很方便,但當你過分依賴於這些整合工具時,你可能忽略了很多更有效的手段:仔細地分析、充分的資訊。 

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

輸出的除錯資訊要盡量容易閱讀,格式清楚,在必要的時候,可以借助工具程式或自己編寫的程式對輸出資訊進行處理,以幫助分析問題。 

3、發現線索 

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

除錯中的技巧很多,這裡提出幾條基本原則: 

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

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

4、構造測試資料和測試程式 

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

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

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

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

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

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

ACM ICPC競賽之STL簡介

acm模版 stl standard template library,標準模版庫 是c 語言標準中的重要組成部分。stl以模板類和模版函式的形式為程式設計師提供了各種資料結構和演算法的實現,程式設計師吐過能夠充分的利用stl,可以在 空間 執行時間和編碼效率上獲得極大的好處。stl大致可以分為三大...

一年ACM ICPC競賽的感想

想自己剛接觸acm icpc時,看到乙個華東理工寫的acm辛苦歷程,甚是激情澎湃,因為我的學校也是弱校,只不過我們比他們還弱而已。我是在大二的上學期才開始接觸它的,當時沒多大感情,它只不過是我混過的大一向學習的大二的乙個跳板。沒想到,到現在整整一年,我的這一年的大部分時間都花在這上面,從剛開始的學資...

除錯技巧之 找準調試點

除錯的時候,你要找到除錯的點。比如你要抓乙個url,那麼你就在你的coustwebview loaurl的時候,去抓。到最後肯定要走到那裡的那個地方加個斷點,不管怎麼走,都會走到 的地方。除錯除了低階的按按鈕,高階的是知道在 加斷點。真的。為什麼我沒想到,我想到的竟然是在onlinefragment...