• 【FBI WARNING】对拍


    很多时候,我们或许有一个标程(或者爆搜程序什么的,反正答案是对的),一个自己的程序,然而一组一组的数据经过我们的手动输入后并没有什么问题,可就是有错……

    咋办,一个一个输数据得到什么时候啊,于是,一个很“高端”的东西诞生了——对拍。

    对拍是什么?简单说就是把两个程序对于同一个输入的输出进行比较,没有问题就再来,有问题就停下来,你就可以找到你程序的问题所在了

    对拍,需要4个东西:你的程序,答案正确的程序,一个数据生成器,和一个对拍器。

    你的程序和答案正确的程序不多说,数据生成器讲讲(知道直接跳过这里):

    通常,一个程序的数据一个一个想很累,所以,我们就可以用数据生成器,用来生成随机数据(才能保证数据不同)。

    怎么生成随机数呢?很简单:

    #include<cstdio>
    #include<ctime>
    #include<cstdlib>//这两个头文件不可少
    int main()
    {
        srand(time(NULL));//程序开头写上这一句
        printf("%d %d
    ",rand()%10,rand()%10);
    }


    上面的程序就是随机输出两个0-9之间的整数

    为什么是0-9之间?

    rand()就是生成一个随机数(由于前面的一句是以time为标准,所以rand()会根据时间生成一个正整数,自然不会一样),但是它有可能会很大,所以我们通常在后面mod一个数,如果想从1开始,就在后面加一个1,2开始就加2……

    随机数就是这些了,接下来讲怎么写对拍程序。

    首先,我们知道运行源代码后会有一个exe文件,把要对拍的两个程序生成的exe文件放在一个文件夹中。

    如:

    /*待对拍程序1.cpp*/
    #include<cstdio>
    int main()
    {
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%d",(3*a+3*b)/3);
    }
    /*待对拍程序2.cpp*/
    #include<cstdio>
    int main()
    {
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%d",a+b);
    }


    好的,就这两个程序了(不要说我无耻,临时打一个,打长了麻烦)。

    然后编译运行一次,就有了这个:

    将后两个放在一个文件夹中:

    再做一个数据生成器,用同样的办法将它的exe文件放在这个文件夹中:

    /*数据生成器:用于生成2个0-1000的整数*/
    #include<cstdio>
    #include<ctime>
    #include<cstdlib>
    int main()
    {
        srand(time(NULL));
        printf("%d %d
    ",rand()%1000,rand()%1000);
    }

    然后找到exe文件放入:

    接下来就是对拍程序了,这里用c++来写(其实是一样的,只是用system来执行windows命令):

    #include<iostream>
    #include<windows.h>
    using namespace std;
    int main()
    {
        int t=1000;
        while(--t)
            {
            system("data.exe > data.txt");
            system("1.exe < data.txt > 1.txt");
            system("2.exe < data.txt > 2.txt");
            if(system("fc 2.txt 1.txt"))
                break;
        }  
        if(t==0)
            cout<<"no error"<<endl;
        else
            cout<<"error"<<endl;
        return 0;
    }  
    #include<iostream>
    #include<windows.h>
    using namespace std;
    int main()
    {
        /*这个是有对拍次数的*/
        int t=这里是检查(对拍)次数;
        while(--t)
        {
            system("这里写数据生成器名称.exe > 这里写数据生成器名称.txt");
            system("这里写程序1名称.exe < 这里写数据生成器名称.txt > 这里写程序1名称.txt");
            system("这里写程序2名称.exe < 这里写数据生成器名称.txt > 这里写程序2名称.txt");
            if(system("fc 这里写程序2名称.txt 这里写程序1名称.txt"))
                break;
        }
        if(t==0)
            cout<<"no error"<<endl;
        else
            cout<<"error"<<endl;
        /*下面这个没有对拍次数,直到错了为止*/
        /*
        while(1)
        {
            system("这里写数据生成器名称.exe > 这里写数据生成器名称.txt");
            system("这里写程序1名称.exe < 这里写数据生成器名称.txt > 这里写程序1名称.txt");
            system("这里写程序2名称.exe < 这里写数据生成器名称.txt > 这里写程序2名称.txt");
            if(system("fc 这里写程序2名称.txt 这里写程序1名称.txt"))
                break;
        }
        */
        return 0;
    }

    运行结果:

    文件夹内是这样的:

    如果对拍显示有问题,就直接打开data.txt,里面有数据,1.txt和2.txt中分别是你程序1的答案和程序2的答案。

    如果你的对拍程序一出错就关闭了,就在return 0前加一个getchar(),让程序停一下,头文件:cstdio

    改动一下测试程序,让它出现错误,就会这样了。

    感谢:

    https://blog.csdn.net/c20190102/article/details/60138907

  • 相关阅读:
    接口调用实现类&& 为什么Autowired定义在接口上
    getSuperclass与getGenericSuperclass区别
    Error resolving template “pages”, template might not exist or might not be accessible by any of the configured Template Resolver 或者 springboot使用thymeleaf时报html没有结束标签
    dcm4che-core导包失败! mvn pom文件导包总是失败
    使用IDEA springboot 如何通过mybatis-generator自动生成mapper dao model
    《剑指offer》第三十八题:字符串的排列
    《剑指offer》第三十七题:序列化二叉树
    《剑指offer》第三十六题:二叉搜索树与双向链表
    《剑指offer》第三十五题:复杂链表的复制
    《剑指offer》第三十四题:二叉树中和为某一值的路径
  • 原文地址:https://www.cnblogs.com/_Yrh/p/9252401.html
Copyright © 2020-2023  润新知