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

原文地址:https://www.cnblogs.com/hadilo/p/5920621.html