zoukankan      html  css  js  c++  java
  • 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 :NEXT
    11     set /a a=%a%+1
    12     rand.exe>%a%.in
    13     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 :NEXT
    10     set /a a=%a%+1
    11     std.exe<%a%.in>%a%.out
    12     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 :NEXT
    11     set /a a=%a%+1
    12     rand.exe>%a%.in
    13     echo %a%
    14 call out_maker.bat
    15 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 :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  
    checker_goto

      之前的代码已经可以解决问题了,但是使用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的变量)
      到这里,功能实现了,代码也很优美了。

  • 相关阅读:
    java工作复习——执行JS脚本——滚动条01
    java工作复习——cookie的增删查
    java工作复习——4大时间等待——显示等待(转载)
    java工作复习——4大时间等待——显示等待
    java工作复习——4大时间等待——隐式等待等待(driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);)
    java工作复习——4大时间等待——强制等待(Thread.sleep(5000);)
    java工作复习——键盘事件——action类——复制、粘贴 (转载)
    java工作复习——键盘事件——action类——复制、粘贴
    java工作复习——鼠标事件——action类——转载总结
    java工作复习——鼠标事件——action类——模拟鼠标从一个位置移动到另外一个位置
  • 原文地址:https://www.cnblogs.com/xuwangzihao/p/5840661.html
Copyright © 2011-2022 走看看