以前出題,很苦惱出數據和檢查程序,由於不少繁瑣的工做,還極可能小手一抖出問題。ide
最近又在出題。。。想起以前的對拍腳本,感受不能更方便,因而擼了一套出題用的小工具,也學習了一點點的DOS命令工具
首先是輸入數據,須要十組,命名規則爲01.in,02.in,……,10.in,寫好數據生成器rand.cpp後去掉輸出重定向而後編譯,運行如下腳本oop
1 @echo off 2 set a=0 3 :loop 4 set /a a=%a%+1 5 rand.exe>0%a%.in 6 echo %a% 7 ping -n 2 127.0.0.1>nul 8 if %a% == 9 goto NEXT 9 goto loop 10 :NEXT 11 set /a a=%a%+1 12 rand.exe>%a%.in 13 echo %a% 14 pause
@符號表示不把指令顯示出來,echo off表示不輸出提示學習
這裏學到一個小技巧,dos命令裏(貌似)沒有sleep命令,因而經過ping來代替,由於每次ping會等待1s,因此須要sleep多少秒就ping多少次(加一)就行,這裏由於數據生成器使用時間初始化隨機種子,因此須要間隔一秒,因此ping兩次測試
這裏第一次接觸set操做和變量,具體的之後再研究,這裏的變量是 %variable% (注意格式,和for的變量區分)。spa
這裏用到了輸出指向>,固然,接下來的out_maker用到了輸入指向<3d
---------------------------------------------------------------------------------------------------------------------------code
接下來是輸出,命名規則爲01.out,02.out,……,10.out,寫好標程std.cpp後去掉輸入輸出重定向,運行如下腳本blog
1 @echo off 2 set a=0 3 :loop 4 set /a a=%a%+1 5 std.exe<0%a%.in>0%a%.out 6 echo %a% 7 if %a% == 9 goto NEXT 8 goto loop 9 :NEXT 10 set /a a=%a%+1 11 std.exe<%a%.in>%a%.out 12 echo %a% 13 pause
--------------------------------------------------------------------------------------------------------------------------------自動化
若是肯定rand.cpp和std.cpp都沒有問題,其實能夠寫在一塊兒,在in的最後一行,加上call out_maker.bat便可,之後就能夠自動化生成數據
1 @echo off 2 set a=0 3 :loop 4 set /a a=%a%+1 5 rand.exe>0%a%.in 6 echo %a% 7 ping -n 2 127.0.0.1>nul 8 if %a% == 9 goto NEXT 9 goto loop 10 :NEXT 11 set /a a=%a%+1 12 rand.exe>%a%.in 13 echo %a% 14 call out_maker.bat 15 pause
------------------------------------------------------------------------------------------------------------------------------
而後就是對拍啊,不敢保證本身的標程是對的,要找小夥伴寫代碼來測試數據,拿到他的代碼my.cpp後去掉輸入輸出重定向編譯,而後運行如下腳本
1 @echo off 2 set a=0 3 :loop 4 set /a a=%a%+1 5 my.exe<0%a%.in>std%a%.out 6 fc std%a%.out 0%a%.out 7 if errorlevel 1 goto dif 8 if errorlevel 0 goto sam 9 :dif 10 del std%a%.out 11 echo %a% 12 pause 13 if %a% == 9 goto NEXT 14 goto loop 15 :sam 16 del std%a%.out 17 echo %a% 18 if %a% == 9 goto NEXT 19 goto loop 20 21 :NEXT 22 set /a a=%a%+1 23 my.exe<%a%.in>std%a%.out 24 fc std%a%.out %a%.out 25 del std%a%.out 26 echo %a% 27 pause
以前的代碼已經能夠解決問題了,可是使用goto的話有兩個弊病,一是破壞程序結構,使邏輯混亂,二是爲了保持結構,有不少重複代碼出現,爲了解決這個問題,使用for語句和if語句
1 @echo off 2 for /l %%a in (1,1,10) do ( 3 if %%a == 10 ( 4 my.exe<%%a.in>std%%a.out 5 fc std%%a.out %%a.out 6 del std%%a.out 7 echo %%a 8 ) else ( 9 my.exe<0%%a.in>std%%a.out 10 fc std%%a.out 0%%a.out 11 if errorlevel 1 ( 12 del std%%a.out 13 echo %%a 14 pause 15 ) else ( 16 del std%%a.out 17 echo %%a 18 ) 19 ) 20 ) 21 pause
這裏須要注意的就是,dos命令是格式敏感的if-else必須寫成這個格式(注意其中的空格),for循環有不少寫法,經過參數區分,這裏只使用了/L的,是從1每次加1到10爲止。
for中使用的變量是&&variable(區分於set的變量) 到這裏,功能實現了,代碼也很優美了。