C++对拍程序设计框架

程序对拍

所谓“对拍”,就是输入相同数据,用两个不同的程序运行,然后比较运行结果是否相同的做法。

其中,一个程序是保证结果一定正确的(一般用简单暴力或未优化的算法得到),但在比赛中会超时或爆内存;另一个程序是目标程序(比赛提交的代码程序),使用了高级的算法或算法优化,效率高,速度快,但完全准确性不确定。对拍的目的就是对目标程序完全正确性进行验证。

对拍验证一般要用四个程序完成。

1、输入数据的生成程序,在复杂的输入数据面前,手动输入是不现实的,也很难达到随机和全面,因此要用程序在合法范围内随机产生多组输入数据。

2、保证正确的代码程序。

3、对拍的目标程序。

4、对拍过程控制程序。

*******************************************************************************

以C++程序设计环境举例说明:

给定正整数n,求1+2+3+4+……+n的值。1<=n<10000

输入格式:一个整数n

输出格式:一个整数,即所求结果

  1. 随机产生程序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;
    }

  2. 假设题解代码一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;
    }

  3. 假设题解代码二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;
    }

  4. 对拍控制程序编写,首先把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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值