下面的內容是我很久以前寫的,內容冗長,不怎麼實用,比較簡潔的**請參考:
1.對拍器
2.資料生成器
資訊學競賽中,很多時候我們需要檢驗需要提交程式的正確性,但手動測試有太慢而且不準確。
所以我們可以寫兩個程式,乙個用於提交,另乙個測試(通常是比較正確但是往往用暴力寫的,會超時),
當然寫對拍器之前要寫資料生成器,
以後介紹,這是最簡單的a+b problem的資料生成器:
#includeusing namespace std;
int main()
對拍器就是用於測試資料並比較兩程式的輸出是否相同的程式,下面介紹對拍器的寫法:
方法一:
**如下(程式b):
@echo off
set cnt=0
for /l %%i in (1,1,10) do (
::相當於for(int i = 1;i <= 10;i++) ,可以修改第三個數字來改變測試次數
randdata.exe
std.exe
mine.exe
fc out1.txt out2.txt >result.txt
if errorlevel 1 ( ::如果發現不一致
set cnt=1
echo %%i:unaccepted!
pause
) if not errorlevel 1 echo %%i:accepted!
)if %cnt%==0 color a && echo *** totally accepted! ***
if %cnt%==1 color c && echo *** not all accepted! ***
pause
以上**是批處理寫的,有興趣的可以學習一下,還是有用的
講**拷貝到記事本,然後儲存為 ***.bat 或 ***.cmd (***為檔名),就可以執行了
但是需要遵守以下規則:
i.使用程式a或b每個程式需要新增的語句:
a.你的程式:
1.需要把程式名稱改為mine.cpp
2.新增到main函式開頭:
freopen("in.txt","r",stdin);
freopen("out1.txt","w",stdout);
b.標準程式(或暴力正確程式)
1.把程式名稱改為std.cpp
2.新增到main函式開頭:
freopen("in.txt","r",stdin);
freopen("out2.txt","w",stdout);
還有另一種寫法(程式c):
@echo off
set cnt=0
for /l %%i in (1,1,10) do (
randdata.exe
std.exe < in.txt > out1.txt
mine.exe < in.txt > out2.txt
fc out1.txt out2.txt > result.txt
if errorlevel 1 (
set cnt=1
echo %%i:unaccepted!
pause
) if not errorlevel 1 echo %%i:accepted!
)if %cnt%==0 color a && echo *** totally accepted! ***
if %cnt%==1 color c && echo *** not all accepted! ***
pause
ii.使用程式c需要把freopen語句注釋掉,程式名稱同i方法二:
先說方法二的優缺點:程式a介面比b稍友好一些,但有時會判斷錯誤
**如下(程式a):
on error resume next '忽略所有錯誤
set obj=createobject("wscript.shell")
set fso=createobject("scripting.filesystemobject")
dim ct,result,cnt
cnt=0
ct=inputbox("請輸入需要測試的次數:","提示")
if ct>40 then
ct=40
msgbox"測試次數不能大於40,自動改為40次",vbinformation,"提示"
end if
for i=1 to ct
obj.run"randdata.exe",true '啟動資料生成程式
obj.run"std.exe",true '啟動標準程式(或暴力但準確性可以保證的程式)
obj.run"mine.exe",true '啟動你的程式
obj.run"datacmp.exe",true '啟動對比程式
set fread=fso.opentextfile("result.txt",1)
result=fread.readall '記錄測試結果
fread.close
if result<>"0" then '發現錯誤
msgbox"發現錯誤:第" & i & "次測試" & chr(13) & "錯誤行數:" & result ,16,"提示"
cnt=cnt+1
end if
next
obj.run"taskkill -f -im std.exe"
obj.run"taskkill -f -im mine.exe"
obj.run"taskkill -f -im datacmp.exe"
msgbox"測試完畢!" & chr(13) & "共發現" & cnt & "處錯誤" ,,"結果"
程式cmp:
#includeusing namespace std;
char x[100],a1[100005][100],a2[100005][100];//可以根據需要修改陣列大小
int main()
freopen("out2.txt","r",stdin);
i=0;
while(gets(x)!=0)
for(j=1;j<=i;j++)
if(strcmp(a1[j],a2[j])!=0)
cout同樣,程式a用記事本開啟,儲存為***.vbs,程式cmp儲存為datacmp.cpp,程式a注釋比較詳盡,就不多講了附:)
@echo off
for /l %%i in (1,1,10) do (
randdata.exe
code1.exe < in.txt > out1.txt
code2.exe < in.txt > out2.txt
fc out1.txt out2.txt > result.txt
if errorlevel 1 echo %%i:wa! && pause
if not errorlevel 1 echo %%i:ac!
)pause
效果圖:
效果圖(程式c):
程式a:
資訊學競賽
以資訊學,尤其是程式設計的相關知識為基礎的中 小學學科競賽。分為noi 全國青少年資訊學奧林匹克競賽 noip 全國青少年資訊學奧林匹克聯賽 分割槽聯賽 ioi 出國參加國際奧林匹克競賽 等等 推薦語言為 pascal lazarus 0.9.10或free pascal編譯器2.0.1版 c c ...
對資訊學競賽中除錯方法的建議
資訊學之於其他競賽學科的不同,就在於需要通過寫程式來表達自己的思維和想法。如何盡可能又快又好地除錯程式,成了我們必須要思考的問題。相信很多同學都有過這樣的經歷 思考乙個演算法只花了半個小時,但是把這個演算法寫對卻花了一天。思考與實現的時間往往不成正比。關於除錯有乙個大前提,就是思考的方向一定得嚴謹正...
對資訊學競賽中除錯方法的建議
自 資訊學之於其他競賽學科的不同,就在於需要通過寫程式來表達自己的思維和想法。如何盡可能又快又好地除錯程式,成了我們必須要思考的問題。相信很多同學都有過這樣的經歷 思考乙個演算法只花了半個小時,但是把這個演算法寫對卻花了一天。思考與實現的時間往往不成正比。關於除錯有乙個大前提,就是思考的方向一定得嚴...