您的位置:首页 > 其它

【OJ使用起步】判题模式分析,重定向与文件比对的一种方法

2014-03-12 22:33 363 查看
我们在 VC6.0 等编译器编译运行程序后,会用键盘输入一些数据对程序功能进行检查。而众所周知,OJ是自动判题平台,不会有人在电脑前输入测试数据,故提交程序中的scanf接受的肯定不是从键盘输入的数据。那么OJ系统如何将本应该用键盘输入的数据传入程序并完成评判呢?以下是我猜想的一种可能方法。

下面这个程序,假设是
HDU1089 的标准程序,我们管它叫 “std.cpp” :

#include <stdio.h>

int main()
{
int a,b;

freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);

while(scanf("%d%d",&a,&b)!=EOF){
printf("%d\n",a + b);
}
return 0;
}

其中的 freopen() 称为重定向函数(参看词条),它包含在 stdio.h 中。

其格式为:

freopen ( const char *filename, const
char *mode, FILE *stream
);

三个参数分别为文件名、要进行的操作和流。

文件名就不说了,你从哪个文件读数据,还有向哪个文件写数据(读的文件必须存在,写的文件如果不存在程序会给你新建一个),最好把要读的文件跟要运行的exe放在一个目录下,不然还要再加上文件的路径,比较麻烦;

操作:一般使用的是“r”(只读)和“w”(只写);

流:一般使用的是stdin(标准输入流,默认键盘)和stdout(标准输出流,默认屏幕)。此外还有一个stderr(标准错误流),不太懂就不说了。

PS.关于此函数网上还有很多大神给出了使用方法,我见到的CSDN里就有不少,感兴趣的同学可以去读读那些文章哦~

发布题目的人要先拟定一个供输入的文本文件,命名为 “in.txt” ,这个文件里的数据必然是经过细致考虑的,涉及到可能的各种情况,防止被蒙混过关。然后编译运行 std.cpp ,由于输入输出都被重定向到文件了,所以估计控制台上只有一行“请按任意键继续”。其实这时输出的数据已经写入了 out.txt 。至此 std.cpp 的任务已经结束了。

然后我们做题时编了一个程序,假如和 std.cpp 一样吧(当然,没有重定向的两行)。提交后OJ系统会自动给代码加上这两行:

freopen("in.txt","r",stdin);
freopen("myout.txt","w",stdout);

然后对代码进行编译运行,输出数据自动存入了 myout.txt.

接下来的任务,就是要比对myout.txt 跟 out.txt 是否相同了。

OJ上返回错误类型非常细致,那它的数据比对程序必然很复杂了,暂不对这个进行讨论,下面只介绍一个简单的比较方法(系统自带)。

在开始菜单中打开“运行”,输入 cmd 进入DOS界面;

通过 cd 操作符移动当前目录至两个文件所在处;

运行 fc(即file compare)指令,比较两个文件。



其中的 “d:” 是移动到盘符d,“cd 文件夹名” 是进入文件夹,“fc 文件1 文件2” 是执行文件比较,如没有差异就如图所示,如果有会显示不同的内容。

此法好处是简单,不必再编写判断程序,缺点就是对错误的显示不是那么清楚。

通过以上的探讨,可以得出这样几点结论:

1、当你改程序时需要经常测试相同的输入数据,不妨把输入用freopen重定向到文本文件,可以免去每次都手动输入的麻烦。

2、提交到OJ的代码不可以加freopen,否则会妨碍OJ重定向你的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm
相关文章推荐