• 对拍程序的写法


    什么是对拍及为什么写对拍

    对拍就是当你写完一个代码 ,你想要验证它是否是正确的

    但是单单手造样例或者看题目上的样例往往不一定能发现错误 而且十分繁琐

    所以我们可以依靠强大的计算机来帮助我们检验程序的正确性

    如何对拍

    接下来,讲一下对拍是如何实现的
    我们以a+b问题为例

    首先std是我们写的程序(可能有错误)

    #include 
    using namespace std;   
    int main()
    {   int a,b;  
        cin >> a >> b; 
        if (a%20==0)a++;
        cout << a+b << endl; 
        return 0;  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    然后我们再写一个程序bs 一般是暴搜等暴力程序 但一定要确保这个程序是没有错误的

    #include  
    using namespace std;   
    int main()
    {   int a,b;  
        cin >> a >> b; 
        int ans=0;
        while(a--) ans++;
        while(b--) ans++; 
        cout<<ans<<endl;
        return 0;  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    我们再写一个数据生成器data, 利用系统里的随机数来生成随机数

    #include  
    using namespace std;
    int main()
    {	srand(time(0));
    	int a,b;
    	a=rand()%100+1,b=rand()%100+1;
    	printf("%d %d\n",a,b); 
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    或者
    在这里插入图片描述

    最后我们写一个程序dp.cpp“对拍”,dp.cpp

    #include  
    using namespace std;
    int main()
    {   while(1)
        {  	system("data.exe > in.txt");
            system("std.exe < in.txt > out.txt");
             system("bs.exe < in.txt > ans.txt");
            if(system("fc out.txt ans.txt"))   return 1;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    先解释一下上面的代码是什么意思

    第7行 就是我们把随机数据生成器生成树数据导入到in.txt里

    第8行 我们把in.txt里的数据导入到我们写的更优的但是可能有错误的那个std程序

    然后把std程序的结果导入到out.txt里

    第9行 我们再按照同样的方式把那个暴力程序跑一边 存储结果到ans.txt

    第10行 就是比对out.txt和ans.txt这两个输出数据是否相同

    然后建一个目录夹,根据执行这四个cpp,生成四个exe,把生成的std.exe, data.exe, bs.exe,dp.exe放入那个对拍文件夹里。执行dp.exe。

    当然我们不能只验证一组数据就完事 ,所以我们一般在前面加上一个while(1)

    不停地制造数据进行验证,  直到发现错误

    就return 1 也就是异常返回 那个对拍的程序就会自动停止告诉你出现了错误 。

    具体的效果图如下
    在这里插入图片描述

    然后我们就发现 我们的a+b程序出现了问题

    暴力程序算出的正确答案是39268

    而我们写的程序得出的答案是39269 比正确答案多了1

    然后我们再回到我们的那个文件夹里瞅一瞅

    在这里插入图片描述

    在这里插入图片描述

    这时的输入数据是上面的12280和26988

    在这里插入图片描述
    左边是标准答案 右边是我们输出的答案

    所以我们再回到原std程序挑错

    利用中间输出的方式寻找错误

    结果我们就非常惊奇地发现

    在这里插入图片描述
    第8行是发生了什么情况 怎么多了一行这样的代码。。。

    至此’ 我们的对拍讲解就结束啦

  • 相关阅读:
    C++ std::hash 获得字符串哈希值
    Zookeeper 是如何保证数据一致性的
    112. 路径总和
    MC Layer Target
    go使用 github.com/influxdata/influxdb/client/v2 写数据到 influxdb
    Jackson中处理双向关系的最佳方法
    设计模式与应用:访问者模式
    数据库入门(SQL SEVER)之SQL语句删除单行数据,所有行数据,表和数据库
    Java 中项目路径映射物理机磁盘路径配置。
    android-service生命周期的实践结果
  • 原文地址:https://blog.csdn.net/weixin_43736974/article/details/127449076