程序对拍
所谓“对拍”,就是输入相同数据,用两个不同的程序运行,然后比较运行结果是否相同的做法。
其中,一个程序是保证结果一定正确的(一般用简单暴力或未优化的算法得到),但在比赛中会超时或爆内存;另一个程序是目标程序(比赛提交的代码程序),使用了高级的算法或算法优化,效率高,速度快,但完全准确性不确定。对拍的目的就是对目标程序完全正确性进行验证。
对拍验证一般要用四个程序完成。
1、输入数据的生成程序,在复杂的输入数据面前,手动输入是不现实的,也很难达到随机和全面,因此要用程序在合法范围内随机产生多组输入数据。
2、保证正确的代码程序。
3、对拍的目标程序。
4、对拍过程控制程序。
*******************************************************************************
以C++程序设计环境举例说明:
给定正整数n,求1+2+3+4+……+n的值。1<=n<10000
输入格式:一个整数n
输出格式:一个整数,即所求结果
- 随机产生程序data.cpp 代码如下
#include<iostream> #include<cstdio> #include<ctime> #include<cstdlib> using namespace std; int n; int main() { srand(time(0));//设置随机种子 n=rand()%10000+1;//所产生的数据要包含输入数据所有的可能范围。 cout<<n; return 0; }
- 假设题解代码一code1.cpp是保证正确的程序代码:
#include<iostream> #include<cstdio> using namespace std; long long s,n,i; int main() { cin>>n; for(i=1;i<=n;i++) s+=i; cout<<s; return 0; }
- 假设题解代码二code2.cpp是我目标程序代码代码:
#include<iostream> #include<cstdio> using namespace std; long long s,n,i; int main() { cin>>n; s=n*(1+n)/2; cout<<s; return 0; }
- 对拍控制程序编写,首先把data.cpp,code1.cpp,code2.cpp放到同一个文件目录下(同一个文件夹中),并分别编译成生对应的exe类型的可执行文件,然后在这个目录下建立一个对拍控制程序代码duipai.cpp,主要完成使data产生的输入数据,分别让code1和code2来执行,并判断结果是否一致。duipai.cpp要用到<windows.h>头文件,代码如下:
#include<iostream> #include<cstdio> #include<windows.h>//调用system()函数,system()函数的用法可到网络中查找学习。 using namespace std; int main() { int t=50;//对拍次数 while(t--) { cout<<t<<endl;//查看对拍次数 system("data>n.in");//调用data产生n.in输入文件 system("code1<n.in>ans1.out");//用code1程序调用n.in文件中的数据,结果存到ans1.out中 system("code2<n.in>ans2.out");//用code2程序调用n.in文件中的数据,结果存到ans2.out中 if(system("fc ans1.out ans2.out"))break;//比较ans1.out和ans2.out中的结果,如果不相同,则结束 } system("pause");//等待 return 0; }
5. 编译执行duipai.cpp