Linux下程序对拍_C++
一、对拍背景
对拍是一种十分实用的检查程序正确性的手段,在比赛时广泛使用
我们一般对拍两个程序,一个是自己不确定正确性的高级算法,另一个一般是能保证正正确的暴力算法
我们采用随机产生数据,然后分别用这两个程序读入数据,最后比较两程序答案的异同来进行验证
二、程序准备
首先我们准备两个程序
一般一个是认为正确或较高部分分的解法,另一个是低分的暴力解法
我们以a+b为例,一个用 C 输入,一个用 C++ 输入
程序一:
 1 #include
 2 #include
 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<endl;
12     return 0;
13 }  
程序二:
 1 #include
 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\n",a+b);
11     return 0;
12 } 
三、制作数据产生程序
我们采用 C++ 来制作随机数据
将数据输出到程序的输入文件里
重置随机种子 srand(time(NULL));
使用 rand() 函数生成随机数,后面的取模为数据范围
    如 x=rand()%100;   产生一个 0~99 的整数放入变量 x
具体数据生成根据题目具体而定
这里给出A+B的数据制作程序:
 1 #include
 2 #include
 3 #include
 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\n",x,y);
14     return 0;
15 }   
四、对拍程序
我们仍采用 C++ 程序来进行对拍,具体用 system 函数实现
system("./***"); 运行程序,其中***代表可执行文件名
system("diff *** ***"); 比较两个文件,我们在对拍时比较两个不同程序的输出文件
若两个文件内容不相同则返回 真true ,相同则返回 假false ,这与C++中逻辑是相反的
 1 #include
 2 #include
 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\n");
17                     return 0;
18                 }
19             else printf("AC\n");
20         }
21     return 0;
22 }  
版权所有,转载请联系作者,违者必究
联系方式:http://www.cnblogs.com/hadilo/p/5932395.html