【转】对信息学竞赛中调试方法的建议

信息学之于其他竞赛学科的不同,就在于需要通过写程序来表达自己的思维和想法。如何尽可能又快又好地调试程序,成了我们必须要思考的问题。相信很多同学都有过这样的经历:思考一个算法只花了半个小时,但是把这个算法写对却花了一天。。思考与实现的时间往往不成正比。

下面是我结合自己的经验给出的一些小建议,仅供大家参考,如果有不太好的地方,也欢迎指正~

关于调试有一个大前提,就是思考的方向一定得严谨正确,因为思考决定实现,如果思考的时候有漏洞,那么实现的程序肯定也不强健。在想出算法之后不要急着实现,一定要认真反复地论证:我的算法每一步的定义是否严谨,是不是哪里还有漏洞,我的算法所得到的东西是否就是题目需要求解的。确认了自己的想法后再开始实现。

假设我们现在写完了一个程序:

第一步:静态查错(俗称裸眼观察^_^),即不测试数据,而是通过反复地看代码来检查。静态查错首先要检查是否有变量名打错,语法是否正确,你打的代码和你的想法是否相符。然后要分析代码的逻辑性是否严谨正确,是否能在所有情况下都能正确运行。最后还要验证是否在所有边界情况都能得到正确的解,包括数组是否开够,会不会有n=0的情况等等。静态查错是最有效的查错方法,为什么有的大牛能够一遍写对很复杂的代码,因为他们静态查错的能力非常之强,并且在敲程序的过程中就已经在静态查错了。在实践中,我建议大家尽量让自己的程序模块化(即一个函数做一件事情),然后检查的时候边看边打上注释,这样能让自己更清醒地判断,也方便以后能轻松阅读自己的程序。

第二步:动态查错,用数据来验证代码的正确性。人眼往往不可靠,我们需要用更安全的数据来判定。一般而言在普通的OI竞赛中,时间是比较充裕的,我们有时间来对拍。对拍需要三个程序,一个是你需要提交的标准程序(std),一个是能够通过部分数据的暴力程序(plain),一个是用来生成数据的程序(mk_data)。

对拍的优势在于能够近似模拟出出题人的数据来检验你的程序,一般在考场上通过了对拍的程序很难写挂。当然有的时候随机数据不一定能够满足我们的需求,这时候需要我们从出题人的角度出发,去构造一些最坏情况下的数据,来检验我们程序的强健性。

第三步:提交之前,检查文件名,再次编译程序,运行一遍样例,以防手抽。

静态差错大大降低了程序出错的概率,减少了动态调试的时间,动态查错给程序上了双保险,最后的检查防止了意外情况的出现。这样的程序的正确性能够大大提高。

在调试中,最关键的一点,是站在逻辑的高度去思考程序,而不是从某个数据的角度去查看变量,这样才能避免陷于调试的泥潭不能自拔。

原文地址:https://www.cnblogs.com/xkui/p/4571448.html