手把手教你寫對拍程序(PASCAL)


誰適合看這篇文章?

  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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM