首页 > 代码库 > ACM/OI 出题用

ACM/OI 出题用

  之前出题,很苦恼出数据和检查程序,因为很多繁琐的工作,还很可能小手一抖出问题。

  最近又在出题。。。想起之前的对拍脚本,感觉不能更方便,于是撸了一套出题用的小工具,也学习了一点点的DOS命令

  首先是输入数据,需要十组,命名规则为01.in,02.in,……,10.in,写好数据生成器rand.cpp后去掉输出重定向然后编译,运行以下脚本

技术分享
 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 :NEXT11     set /a a=%a%+112     rand.exe>%a%.in13     echo %a%14 pause  
in_maker

  @符号表示不把指令显示出来,echo off表示不输出提示

  这里学到一个小技巧,dos命令里(貌似)没有sleep命令,于是通过ping来代替,因为每次ping会等待1s,所以需要sleep多少秒就ping多少次(加一)就行,这里因为数据生成器使用时间初始化随机种子,所以需要间隔一秒,所以ping两次

  这里第一次接触set操作和变量,具体的以后再研究,这里的变量是 %variable% (注意格式,和for的变量区分)。

  这里用到了输出指向>,当然,接下来的out_maker用到了输入指向<

---------------------------------------------------------------------------------------------------------------------------

  接下来是输出,命名规则为01.out,02.out,……,10.out,写好标程std.cpp后去掉输入输出重定向,运行以下脚本

技术分享
 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 :NEXT10     set /a a=%a%+111     std.exe<%a%.in>%a%.out12     echo %a%13 pause  
out_maker

--------------------------------------------------------------------------------------------------------------------------------

  如果确定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 :NEXT11     set /a a=%a%+112     rand.exe>%a%.in13     echo %a%14 call out_maker.bat15 pause  
data_maker

------------------------------------------------------------------------------------------------------------------------------

  然后就是对拍啊,不敢保证自己的标程是对的,要找小伙伴写代码来测试数据,拿到他的代码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 :dif10     del std%a%.out11     echo %a%12     pause13     if %a% == 9 goto NEXT14     goto loop15 :sam16     del std%a%.out17     echo %a%18     if %a% == 9 goto NEXT19     goto loop20     21 :NEXT22     set /a a=%a%+123     my.exe<%a%.in>std%a%.out  24     fc std%a%.out %a%.out  25     del std%a%.out26     echo %a%27 pause  
checker_goto

(未完待续。。。)

ACM/OI 出题用