資訊學競賽對拍器的設計

2021-08-20 16:57:11 字數 4157 閱讀 5477

下面的內容是我很久以前寫的,內容冗長,不怎麼實用,比較簡潔的**請參考:

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 ...

對資訊學競賽中除錯方法的建議

資訊學之於其他競賽學科的不同,就在於需要通過寫程式來表達自己的思維和想法。如何盡可能又快又好地除錯程式,成了我們必須要思考的問題。相信很多同學都有過這樣的經歷 思考乙個演算法只花了半個小時,但是把這個演算法寫對卻花了一天。思考與實現的時間往往不成正比。關於除錯有乙個大前提,就是思考的方向一定得嚴謹正...

對資訊學競賽中除錯方法的建議

自 資訊學之於其他競賽學科的不同,就在於需要通過寫程式來表達自己的思維和想法。如何盡可能又快又好地除錯程式,成了我們必須要思考的問題。相信很多同學都有過這樣的經歷 思考乙個演算法只花了半個小時,但是把這個演算法寫對卻花了一天。思考與實現的時間往往不成正比。關於除錯有乙個大前提,就是思考的方向一定得嚴...