一、对拍背景
对拍是一种十分实用的检查程序正确性的手段,在比赛时广泛使用
我们一般对拍两个程序,一个是自己不确定正确性的高级算法,另一个一般是能保证正正确的暴力算法
我们采用随机产生数据,然后分别用这两个程序读入数据,最后比较两程序答案的异同来进行验证
二、程序准备
首先我们准备两个程序
一般一个是认为正确或较高部分分的解法,另一个是低分的暴力解法
我们以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 }
版权所有,转载请联系作者,违者必究