1 调试技巧[/b]
调试之前,先要静态查错。
1.看算法是否正确(其实应该是在编码之前做的工作)
2.看有没有笔误(如i写成j)
调试一般是分几个步骤的。先把开关R,S,Q,I打开!
1.建立测试数据(技巧见后面的文章),可以抄样例数据
2.运行程序
3.如果结果正确,转1(测试新的数据)或结束
4.根据结果先判断可能的错误之处。如:
a.死机 - 可能是RANGE CHECK ERROR或指针指向错误的地方(前者不应该出现,因为...)
b.荒唐的结果(负数,很大的数等等):可能是子程序接口的问题,如结果忘记赋值,或者
忘记更新最优解了...
c.明显的不可行解:重点检查生成解/测试解的可行性的部分
d.解不是最优:如果是搜索,重点检查是否搜索完全了...
...
5.单独测试最容易测试的子程序(input/output/简单子程序)
6.开始单步调试,多用watch,或编一段程序输出中间结果(例如树,因为WATCH不好看树的内容)
7.利用断点测试。其实我不是很常用断点,而是在程序中加一段判断语句来实现断点的。
这个步骤用来调试搜索中的某一个节点的处理等用单步很难调试到的地方。说了这么多废话,再推荐一篇论文:
IOI2000国家集训队徐串的《论程序的调试技巧》
[b]2 常见错误
这个...每个人的常见错误都不同啊,因此大家要多总结。
我刚学电脑时就是错误不断,例如:
1)i写成j等(现在有时还要出现这样的错误)
2,3)下面的过程哪里错了?(两个错误,n,a是全局变量)
function findmax:longint;
var
i:integer;
max:longint;
begin
for i:=1 to n do
if a[i]>max then max:=a[i];
end;
以下列举一些常见的错误。
[错误1]
错误处理:很多语句本身就可能出错,例如:
a:=b div c;
有可能c=0,那么就要考虑这种情况。例如:
已知等比数列{an}的a1和q,求Sn,
如果写:(假设qn=q^n)
S:=a1*(1-qn)/(1-q)
那么q=1时就会出错。有些例子并不是这么显然,例如解方程组的时候,
总之,这样的语句要引起重视。
[错误2]
有的时候输入是integer,但是运算结果可能超过这个范围,导致runtime-error
大家注意我在《枚举》中的例题《离散函数》
[错误3]
很多时候是变量用重复了,特别是程序写得比较长的时候。例如:
for i:=1 to 100 do
..
..
...
for i:=1 to 10 do
..
..
.
..
结果是死循环。
还有局部变量屏蔽了全局变量,例如全局变量叫n,k等就容易重复。