以前出题,很苦恼出数据和检查程序,由于不少繁琐的工做,还极可能小手一抖出问题。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的变量) 到这里,功能实现了,代码也很优美了。