zoukankan      html  css  js  c++  java
  • 【转】对信息学竞赛中调试方法的建议

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    几种常用的曲线
    0188. Best Time to Buy and Sell Stock IV (H)
    0074. Search a 2D Matrix (M)
    0189. Rotate Array (E)
    0148. Sort List (M)
    0859. Buddy Strings (E)
    0316. Remove Duplicate Letters (M)
    0452. Minimum Number of Arrows to Burst Balloons (M)
    0449. Serialize and Deserialize BST (M)
    0704. Binary Search (E)
  • 原文地址:https://www.cnblogs.com/xkui/p/4571448.html
Copyright © 2011-2022 走看看