• 手把手教你写对拍程序(PASCAL)


    谁适合看这篇文章?

      ACMERS,OIERS或其它参加算法竞赛或需要算法的人

      对操作系统并不太熟悉的人

      不会写对拍的人

      在网上找不到一个特别详细的对拍样例的人

      不嫌弃我写的太低幼的人

    前言

    在NOIP或是ACM比赛中,一个对拍程序的重要性不言而喻,再有一个效率较低的正确程序下(这是大前提,如果你连一个绝对正确的程序都无法保证的话,那还是不要考虑对拍了),他可以检验你的“高级算法”是不是正确。当然,正确性是完全无法保证的。一般对拍都会用随机函数生成数据,边界条件极限条件极有可能遇不上,也会有很多对拍程序NP交上去WA的情况。但对拍的效率是毋庸置疑的,他有很大的几率检查出你的程序中的错误,或许能多得上不少分。从数学期望角度来讲,对拍还是很划算的。

    配置

    电脑系统:Windows XP

    PASCAL编译器:Free Pascal 2.4.0 

    过程

    我们以a+b问题为例:

    首先你要写一个完全正确的程序

    a.pas

    然后你要写一个不一定完全正确的程序

    b.pas

    (当然,由加法交换律可知这个程序也完全正确)

    数据生成器也是需要我们自己写的

    maker.pas

    这里只需要写出一组数据的生成就可以了,不用去做下面这样的东西,这样反而会让对拍无法进行,聪明的系统会一遍一遍的调用你的数据生成器的。

    while true do 
           begin
                randomize;
                write(random(maxint));
           end;

    再编译程序,可以不去运行。

    (虽然我知道几乎没有人会这么干,不过我还是想提一句,一定要编译程序啊亲!)

    然后我们右键桌面上IDE的快捷方式,打开属性:

    点击查找图标,到了这样一个文件夹:

    为了方便查找,我们可以按修改时间排序,"xx.pas"是我们的源码,但这不是我们想要的,“xx.exe”才是我们的目标,于是我们把用蓝线标注的三个exe文件取出来,单独放到一个地方。

    接着是关键的一步,我们需要一个什么东西实现这个对拍功能。

    当当当当!某bat文件闪亮登场:它把数据生成器和你的两个程序集合在一起,有机的做到比较%……&&……¥%#¥%#¥@%#¥

    好,我们新建一个txt文件(其实什么文件都行,有后缀名不是文件夹什么的就行),把它改成"xx.bat"这样的格式,bat是文件后缀,然后用记事本打开,在里面输入

    :loop
    maker.exe
    a.exe
    b.exe
    fc out.txt out.txt
    if errorlevel 1 goto end
    goto loop
    :end

    这是DOS语言,意思差不多是这样的:

    loop//循环
    maker.exe//运行 数据生成器
    a.exe//运行 正确程序
    b.exe//运行 待检测程序
    fc o1.txt o2.txt//比较 两个程序的输出结果
    if errorlevel 1 goto end//如果 有错误(两个输出文件不一样) 就跳到end

    goto loop//跳到loop
    :end

    就像这样:

    我们把bat哥和那三个exe拉到一块,就F盘吧

    都准备好了,怎么运行呢?

    点开你的开始菜单,打开运行,输入cmd后点确定

    (PS:cmd命令提示符可是程序猿必备神器,不会cmd都不好意思出门了)

    把当前处理位置移到你放对拍程序的地方,输入你的对拍程序名

    按下回车,看你的程序“哗哗哗”的运行就好了

    诶?怎么没有结果,我怎么知道对不对?

    不对人家会停止的,如果程序一直在跑还想查看结果的话可以右键

    找不到,相异处,两个程序结果吻合,OK了。

    (一个A+B吻合有什么软用吗o(╯□╰)o)

    PS:

    1.程序检测的是执行程序,而不是源程序。所以每改一次源程序都要编译一次。

    2.dos中不识别 .in .out 文件,所以要用 .txt

    3.衷心希望这篇文章能对大家有所帮助,谢谢。

    本文原创,转载请说明出处,欢迎用于学习方面的交流,用于商业用途前请先联系作者。http://www.cnblogs.com/yangqingli/

  • 相关阅读:
    基于visual Studio2013解决面试题之1101差值最小
    基于visual Studio2013解决面试题之1009兄弟字符串
    基于visual Studio2013解决面试题之1007鸡蛋和篮子
    基于visual Studio2013解决面试题之1006判断升序
    4.16 删除重复记录
    4.9 当相应行存在时更新
    4.8 在表中编辑记录
    4.7 阻止对某几列插入
    4.6 一次向多个表中插入记录
    4.4 从一个表向另外的表中复制行
  • 原文地址:https://www.cnblogs.com/yangqingli/p/4928174.html
Copyright © 2020-2023  润新知