9

OJ程序简便调试方法

 3 years ago
source link: https://blog.csdn.net/yanxiangtianji/article/details/8826803
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

大部分OJ都使用屏幕输入输出作为数据通道,但是这并不适合我们进行调试。

我过去的做法:

1,每次测调试都去复制一遍,在命令行里面粘贴。

这样不仅操作麻烦,而且修改代码或者向OJ提交的时候难免会用到复制粘贴的功能,到头来又要重新去题目上复制,很麻烦。

而且大部分情况下多组测试数据我们都是一下粘进去的,需要多加断点来了解当前运行状态。

但是好处是,这样调试的程序可以直接提交到OJ上,没有别的问题。

2,程序里面使用文件打开数据

这么方便的多,每次不用去自行输入了。但是问题是,有时候就会忘了把文件读写改回标准读写,直接提交了!用这种方法的同学都遇到过吧。

这里有个小技巧,就是把标准输入输出重定向到文件,这样修改的时候只要注释掉这两行就可以了。

C++里面还可以,打开名为cin、cout的文件,覆盖掉全局的外部变量std::cin和std::cout。

有的OJ提供了编译选项,例如HDU OJ的,他们的编译器预定义的一个宏,可以使用C/C++的预处理器来解决是否重定向的问题,这样就解决了提交前忘了修改输入输出的问题。

例如HDU OJ预定义的是ONLINE_JUDGE,那么可以使用下面的代码来做这件事情:

#ifndef ONLINE_JUDGE
   freopen("input.txt", "rt", stdin);
   freopen("output.txt", "wt", stdout);
#endif
(以上代码摘自HDU OJ FAQ)

但是对于很多没有这些贴心功能的OJ就没有办法了。

我的新做法:

在学习linux的时候学习了重定向和管道功能。今天在突然想做个OJ,于是想起了他们。可以很简单地写个脚本来编译源码,重定向文件到编译的程序,在比较程序输入与标准输出文件。
其实这个还可以用在我们的代码开发阶段。
管道功能强大,但是windows下通过编程方法用起来很复杂。但是好在重定向部分的功能的在命令行下可以方便地实现(而且是windows和linux都一致的,跨平台哦):
核心技术就是使用“<”和“>”来重定向程序执行时的标准输入输出。
需要注意的是,这只是控制台程序调用OS的pipe相关API实现的一个接口,可以理解为另一程序。因此这种用法只在命令行下有效,通过其他方法打开则无效。
如果你不了解这个功能的话,可以自己编译这个程序:
这个小程序的功能我就不解释了,肯定看的懂。
你可以写一个输入文件input.txt,它的内容写:
3 string 5
假设程序编译为test.exe,然后命令行执行,重定向程序执行时的标准输入:
test.exe <input.txt
则可以看到屏幕上输出了
string
3 5

类似的,还可以试试标准输出的重定向。

做法:(IDE部分有误,待修正)

无论你是linux命令行搞定一切的大牛还是我们IDE仔,都可以轻松实现。
命令行下的用法正如上面所说,用“<”或“>”连接输入输出文件即可。
-----------------------------------------------有误("<"和">"的管道作用是shell(cmd、bash)定义和实现的,在IDE里面他们只是一般字符)----------------------------------------
IDE环境的工程属性里面都提供一个“带参数启动功能” ,在里面加入
<input.txt >output.txt 
就可以了。
vs2005和vs2008在工程属性里面,如下图设置:
Eclipse CDT里面是在工程属性的Run/Debug Setting里面新建一个configuration,在里面的“参数”选项卡里面输入。如下图:
这样做的优点在于:一次设置永久解决问题,不用每次复制输入数据;而且完全不用担心自己忘记改回重定向的问题,也不用管OJ是否提供了编译宏。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK