文件读写参考

A1001. A+B Problem(NOI系列比赛必做题)

对拍测试步骤: 例如,题目是输入n,求1+2+...+n的和是多少?

我们写了两种代码来对拍测试,样例如下:

第一步:创建测试数据(文件名保持为:indata.cpp)

#include <bits/stdc++.h>
#include <windows.h>
using namespace std;

int main(){
	freopen("test.in","w",stdout);
	mt19937 Rnd(time(0));
	cout<<Rnd()%100000<<endl;
  //cout<<Rnd()%(b-a+1)+a //生成[a,b]之间的随机数
	fclose(stdout);
	return 0;
}


第二步:暴力或者正确代码生成输出文件(文件名保持为:baoli.cpp)

#include <bits/stdc++.h>
#include <cstdio>
using namespace std;

int main(){
	freopen("test.in","r",stdin);
	freopen("baoli.out","w",stdout);
	long long sum=0; int n;
	cin>>n;
	for(int i=1;i<=n;i++) {
		sum+=i;
	}
	cout<<sum<<endl;
	fclose(stdin);
	fclose(stdout);
	return 0;
}

第三步:你想测试的代码(文件名保持为:mycode.cpp)

#include <bits/stdc++.h>
using namespace std;

int main(){
	freopen("test.in","r",stdin);
	freopen("mycode.out","w",stdout);
	int n,sum;//这里对拍的时候可以找到错误,需要定义long long
	cin>>n;
	sum=(1+n)*n/2;
	cout<<sum;
	fclose(stdin);
	fclose(stdout);
	return 0;
}

第四步:进行对拍测试(文件名保持为:pai.cpp)

#include <bits/stdc++.h>
#include <windows.h>//需要头文件
using namespace std;

int main(){
	while(1){
		system("indata.exe");//运行indata文件,indata是第一步代码的文件名
		system("baoli.exe");//baoli.exe是第二步代码编译后的文件
		system("mycode.exe");	//mycode.exe是第三步编译后的文件	
		if(system("fc baoli.out mycode.out  /n"))//文本比较第二步和第三步运行后产生的输出结果是否相同,如果遇到不同则退出,并显示不同的行号和数据,根据找到的测试数据进行代码调试
			break;
		Sleep(1000);//每一轮需要间隔1000毫秒,以便生成不同的随机数,否则间隔时间太短会重复生成相同的随机数据,进行很多次无效的对拍测试
	}
	return 0;
}

进行第4次对拍测试的时候,找到一组不同的测试数据,此时的输入数据在test.in文件内,对应的输出不同点为第1行,这时就可以根据这组找到的测试数据,进行代码修改和调试。

以下还可以进行查看代码运行的估算时间:

#include <bits/stdc++.h>
#include <windows.h>
using namespace std;

int main(){
	while(1){
		system("indata.exe");
		double begin = clock();//记录程序运行的起始时间
		system("baoli.exe");
		double end = clock();//记录代码运行的结束时间
		cout<<"baoli:"<<end-begin<<endl;//输出程序运行时间
		
		begin = clock();//记录程序运行的起始时间
		system("mycode.exe");
		end = clock();//记录代码运行的结束时间
		cout<<"mycode:"<<end-begin<<endl;//输出代码运行时间
		
		if(system("fc baoli.out mycode.out"))//对拍测试
			break;
		Sleep(1000);//每一轮需要间隔1000毫秒,以便生成不同的随机数,否则间隔时间太短会重复生成相同的随机数据,进行很多次无效的对拍测试
	}
	return 0;
}

上述四步骤均要存在同一个文件夹内,并且逐个编译运行。

每一步都编译运行后,文件夹内会产生以下文件:

1 条评论

  • 1