標籤:
在任意檔案夾中放入“data.in”和“data.out”文字檔,它們分別表示輸入檔案和輸出檔案。
當然還有將被評測的代碼檔案“代碼.cpp”。
將下面的批處理代碼複製進txt檔案,改尾碼名為.bat,放入檔案夾。
@echo offstart /wait 擷取時間.exe set t1=%errorlevel%代碼 < data.in > 代碼.outstart /wait 擷取時間.exeset t2=%errorlevel%set /a t=%t2%-%t1%fc 代碼.out data.out > nulif not errorlevel 1 (echo Accepted)if errorlevel 1 (echo Wrong Anwser)echo 已耗用時間:%t%mspause
其中包含擷取已耗用時間的功能,所以要在檔案夾中再放入一個c語言編譯的“擷取時間.exe”,其代碼如下:
#include <windows.h>#include <stdio.h>int main(int argc, char** argv){ int t = GetTickCount(); printf("%d\n", t); return t;}
檔案夾如下:
其中“產生隨機數”檔案夾先不用管。
現在將“代碼.cpp”編譯成“代碼.exe”,運行上面的.bat批次程式(我的是“進行!!測試.bat”),就會輸出程式已耗用時間、AC/WA資訊。
也可以把結果呈現為對話方塊形式,批處理代碼如下:
@echo offstart /wait 擷取時間.exe set t1=%errorlevel%代碼 < data.in > 代碼.outstart /wait 擷取時間.exeset t2=%errorlevel%set /a t=%t2%-%t1%fc 代碼.out data.out > nulif not errorlevel 1 start mshta vbscript:msgbox("已耗用時間:%t%ms,程式輸出與data.out吻合",0,"Accepted")(window.close)&&exit start mshta vbscript:msgbox("已耗用時間:%t%ms,程式輸出與data.out不吻合!!!!",0,"Wrong Answer")(window.close)&&exit
運行結果如下:
==========================================================================
這個功能可以用來出題或者進行本地程式對拍,個人感覺非常方便。
data.in是輸入檔案,它可以是手動編寫的資料,但大多數情況下都是隨機產生的。
data.out可以用別人正確的代碼產生,或者自己編寫一個暴力的程式來產生。
產生隨機資料的程式如下:
#include <stdio.h>#include <stdlib.h>#include<cstring>#include <time.h> //用到了time函數long long w,m,sum;int main(){ srand(time(NULL)); //用時間做種,每次產生隨機數不一樣 int X=10,T=50000,n=1000; printf("%d\n",X); printf("%d %d\n",n,T); while(T--) { int lx=rand()%n+1,ly=rand()%n+1,rx=rand()%n+1,ry=rand()%n+1; while(rx<lx||ry<ly) {rx=rand()%n+1;ry=rand()%n+1;} printf("C %d %d %d %d\n",lx,ly,rx,ry); }}
上面的代碼只是一個樣本,不同題目輸入資料格式不同,但一般都用到rand()函數。
同樣,為了避免在c程式中與檔案打交道,可以用批處理命令來將大量資料輸出到文字檔中:
CreateData > data.out
其中CreateData是c語言編譯的可執行檔。
windows本地評測批處理指令碼