• Linux下程序对拍_C++


    一、对拍背景

      对拍是一种十分实用的检查程序正确性的手段,在比赛时广泛使用

      我们一般对拍两个程序,一个是自己不确定正确性的高级算法,另一个一般是能保证正正确的暴力算法

      我们采用随机产生数据,然后分别用这两个程序读入数据,最后比较两程序答案的异同来进行验证

    二、程序准备

      首先我们准备两个程序

      一般一个是认为正确或较高部分分的解法,另一个是低分的暴力解法

      我们以a+b为例,一个用 C 输入,一个用 C++ 输入

    程序一:

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     freopen("ab.in","r",stdin);
     8     freopen("ab1.out","w",stdout);
     9     int a,b;
    10     cin>>a>>b;
    11     cout<<a+b<<endl;
    12     return 0;
    13 }

    程序二:

     1 #include<cstdio>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     int a,b;
     7     freopen("ab.in","r",stdin);
     8     freopen("ab2.out","w",stdout);
     9     scanf("%d%d",&a,&b);
    10     printf("%d
    ",a+b);
    11     return 0;
    12 }

    三、制作数据产生程序

      我们采用 C++ 来制作随机数据

      将数据输出到程序的输入文件里

      重置随机种子 srand(time(NULL));

      使用 rand() 函数生成随机数,后面的取模为数据范围

        如 x=rand()%100;   产生一个 0~99 的整数放入变量 x

      具体数据生成根据题目具体而定

    这里给出A+B的数据制作程序:

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<ctime>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     freopen("ab.in","w",stdout);
     9     int x,y;
    10     srand(time(NULL));
    11     x=rand()%1000000;
    12     y=rand()%1000000;
    13     printf("%d %d
    ",x,y);
    14     return 0;
    15 }

    四、对拍程序

      我们仍采用 C++ 程序来进行对拍,具体用 system 函数实现

      system("./***");  运行程序,其中***代表可执行文件名

      system("diff *** ***");  比较两个文件,我们在对拍时比较两个不同程序的输出文件

      若两个文件内容不相同则返回 真true ,相同则返回 假false ,这与C++中逻辑是相反的

     1 #include<cstdio>
     2 #include<cstdlib>
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     int i;
     8     for (i=1;i<=1000;i++)
     9         {
    10             system("./make");
    11             system("./ab1");
    12             system("./ab2");
    13             printf("%d : ",i);
    14             if (system("diff ab1.out ab2.out"))
    15                 {
    16                     printf("WA
    ");
    17                     return 0;
    18                 }
    19             else printf("AC
    ");
    20         }
    21     return 0;
    22 }

    版权所有,转载请联系作者,违者必究

    联系方式:http://www.cnblogs.com/hadilo/p/5932395.html

  • 相关阅读:
    Win10或Win8下ObjectARX2015 Wizard向导创建项目失败解决方法
    对用友二次开发的初次认识
    我对asp.net管道模型的理解
    wblockCloneObjects 写块克隆的使用
    acedCommand 之使用镜像命令
    MFC之动态调用自己写的类库中的类的成员方法
    objectarx 天正的墙转梁线
    objectarx 之让用户自定义插件命令
    MFC之多字节和宽字节的总结
    MFC之使用blat发送邮件
  • 原文地址:https://www.cnblogs.com/hadilo/p/5920621.html
Copyright © 2020-2023  润新知