誰適合看這篇文章?
ACMERS,OIERS或其它參加算法競賽或需要算法的人
對操作系統並不太熟悉的人
不會寫對拍的人
在網上找不到一個特別詳細的對拍樣例的人
不嫌棄我寫的太低幼的人
前言
在NOIP或是ACM比賽中,一個對拍程序的重要性不言而喻,再有一個效率較低的正確程序下(這是大前提,如果你連一個絕對正確的程序都無法保證的話,那還是不要考慮對拍了),他可以檢驗你的“高級算法”是不是正確。當然,正確性是完全無法保證的。一般對拍都會用隨機函數生成數據,邊界條件極限條件極有可能遇不上,也會有很多對拍程序NP交上去WA的情況。但對拍的效率是毋庸置疑的,他有很大的幾率檢查出你的程序中的錯誤,或許能多得上不少分。從數學期望角度來講,對拍還是很划算的。
配置
電腦系統:Windows XP
PASCAL編譯器:Free Pascal 2.4.0
過程
我們以a+b問題為例:
首先你要寫一個完全正確的程序
a.pas

然后你要寫一個不一定完全正確的程序
b.pas
(當然,由加法交換律可知這個程序也完全正確)

數據生成器也是需要我們自己寫的
maker.pas

這里只需要寫出一組數據的生成就可以了,不用去做下面這樣的東西,這樣反而會讓對拍無法進行,聰明的系統會一遍一遍的調用你的數據生成器的。
while true do begin randomize; write(random(maxint)); end;
再編譯程序,可以不去運行。
(雖然我知道幾乎沒有人會這么干,不過我還是想提一句,一定要編譯程序啊親!)
然后我們右鍵桌面上IDE的快捷方式,打開屬性:

點擊查找圖標,到了這樣一個文件夾:

為了方便查找,我們可以按修改時間排序,"xx.pas"是我們的源碼,但這不是我們想要的,“xx.exe”才是我們的目標,於是我們把用藍線標注的三個exe文件取出來,單獨放到一個地方。
接着是關鍵的一步,我們需要一個什么東西實現這個對拍功能。
當當當當!某bat文件閃亮登場:它把數據生成器和你的兩個程序集合在一起,有機的做到比較%……&&……¥%#¥%#¥@%#¥
好,我們新建一個txt文件(其實什么文件都行,有后綴名不是文件夾什么的就行),把它改成"xx.bat"這樣的格式,bat是文件后綴,然后用記事本打開,在里面輸入
:loop
maker.exe
a.exe
b.exe
fc out.txt out.txt
if errorlevel 1 goto end
goto loop
:end
這是DOS語言,意思差不多是這樣的:
loop//循環
maker.exe//運行 數據生成器
a.exe//運行 正確程序
b.exe//運行 待檢測程序
fc o1.txt o2.txt//比較 兩個程序的輸出結果
if errorlevel 1 goto end//如果 有錯誤(兩個輸出文件不一樣) 就跳到end
goto loop//跳到loop
:end
就像這樣:

我們把bat哥和那三個exe拉到一塊,就F盤吧

都准備好了,怎么運行呢?
點開你的開始菜單,打開運行,輸入cmd后點確定
(PS:cmd命令提示符可是程序猿必備神器,不會cmd都不好意思出門了)

把當前處理位置移到你放對拍程序的地方,輸入你的對拍程序名

按下回車,看你的程序“嘩嘩嘩”的運行就好了
誒?怎么沒有結果,我怎么知道對不對?
不對人家會停止的,如果程序一直在跑還想查看結果的話可以右鍵

找不到,相異處,兩個程序結果吻合,OK了。
(一個A+B吻合有什么軟用嗎o(╯□╰)o)
PS:
1.程序檢測的是執行程序,而不是源程序。所以每改一次源程序都要編譯一次。
2.dos中不識別 .in .out 文件,所以要用 .txt
3.衷心希望這篇文章能對大家有所幫助,謝謝。
本文原創,轉載請說明出處,歡迎用於學習方面的交流,用於商業用途前請先聯系作者。http://www.cnblogs.com/yangqingli/
