C语言程序设计实例教程(第2版)第13章程序调试与常见错误分析课件.ppt
《C语言程序设计实例教程(第2版)第13章程序调试与常见错误分析课件.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计实例教程(第2版)第13章程序调试与常见错误分析课件.ppt(61页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第13章章 程序调试与常见错误分析程序调试与常见错误分析13.1 程序调试程序调试13.2 常见错误分析常见错误分析13.1程序调试13.1.1程序调试的步骤所谓程序调试,是指对程序的查错和排错。调试程序一般应经过以下几个步骤。1.人工检查,即静态检查在写好一个程序以后,不要匆匆忙忙上机,而应对纸面上的程序进行人工检查。这一步是十分重要的,它能发现程序设计人员由于疏忽而造成的多处错误。而这一步骤往往容易被忽视。有的用户总希望把一切推给计算机系统去做,但这样就会多占用机器时间。而且,作为一个程序设计人员应当养成严谨科学的作风,每一步都要严格把关,不要把问题留给后面的工序。为了更有效地进行人工检
2、查,所编的程序应力求做到以下几点:(1)应当采用结构化程序方法编程,以增加可读性。(2)尽可能多地加注释,以帮助理解每段程序的作用。(3)在编写复杂的程序时,不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能。这样既易于阅读,也便于调试,各函数之间除用参数传递数据外,数据间应尽量少出现耦合关系,以便于分别检查和处理。2.上机调试,即动态检查在人工(静态)检查无误后,才可以上机调试。通过上机发现的错误称之为动态检查。在编译时,系统会给出语法错误的信息(包括哪一行有错以及错误类型),用户可以根据提示的信息具体找出程序中出错之处并进行修改。应当注意的是:有时提示的出错
3、行并不是真正出错的行,如果在提示出错的行上找不到错误的话,应当到上一行再找。另外,有时提示出错的类型并非绝对准确,由于出错的情况繁多而且各种错误互有关联,因此要善于分析,找出真正的错误,而不要死抱住提示的出错信息不放,钻牛角尖。如果系统提示的出错信息多,应当从上到下逐一改正。有时显示出一大片错误信息往往使人感到问题严重,无从下手。其实可能只有一两个错误。例如,对所用的变量未定义,编译时就会对所有含该变量的语句发出出错信息。这时只要加上一个变量定义,那么所有错误就都消除了。3.运行程序,试验数据在改正语法错误(包括“错误”error和“警告”warning)后,程序经过链接(link)就得到可执
4、行的目标程序。运行程序,输入程序所需数据,就可得到运行结果。应当对运行结果作分析,看它是否符合要求。有的初学者看到输出运行结果就认为没问题了,不作认真分析,这是危险的。有时,数据比较复杂,难以立即判断结果是否正确。可以事先考虑好一批“试验数据”,输入这些数据,可以判断结果正确与否。例如,解方程ax2+bx+c=0,输入a、b、c的值分别为1、-2、1时,根x的值是1。这是容易判断的,若根不等于1,程序显然有错。但是,用“试验数据”时,程序运行结果正确,还不能保证程序完全正确。因为有可能输入另一组数据时运行结果不对。例如,用公式求根x的值,当a0和b2-4ac0时,能得出正确结果;当a=0或b2
5、-4acb);printf(aislargerthanbn);本意为,当ab时输出“aislargerthanb”的信息。但由于在“if(ab)”后加了分号,因此if语句到分号结束。即当(ab)为真时,执行一个空语句。本来想ab时不输出上述信息,但现在printf函数语句并不从属于if语句,而是与if语句平行的语句。不论ab还是ab,“aislargerthanb”都被输出出来。又如:for(i=0;i10;i+);scanf(%d,&x);printf(%dn,x*x);本意为先后输入10个数,每输入一个数后输出它的平方值。由于在for()后加了一个分号,使循环体变成了空语句,因此,只能输入
6、一个整数并输出它的平方值。(10)输入变量时忘记使用地址符。例如:scanf(%d%d,a,b);这是许多初学者刚学习C语言时一个常见的疏忽,或者说是习惯性的错误,因为在其他语言中在输入时只需要写出变量名即可,而C语言要求指示:“向哪个地址标识的单元送值”,应写成scanf(%d%d,&a,&b);(11)括弧不配对。当一个语句中使用多层括弧时常出现括弧不配对的错误,纯属粗心所致。例如:while(c=getchar()!=#)putchar(c);少了一个右括弧。(12)switch语句的各分支中漏写break语句。例如:switch(score)case5:printf(Verygood!
7、);case4:printf(Good!);case3:printf(Pass!);case2:printf(Fail!);default:printf(dataerror!);上述switch语句的作用是希望根据score(成绩)打印出评语。但当score的值为5时,输出为:VeryGood!Good!Pass!Fail!dataerror!原因是漏写了break语句。case只起标号的作用,而不起判断作用,因此在执行完第一个printf函数语句后接着执行第二、三、四、五个printf函数语句。应改为switch(score)case5:printf(Verygood!);break;cas
8、e4:printf(Good!);break;case3:printf(Pass!);break;case2:printf(Fail!);break;default:printf(dataerror!);(13)引用数组元素时误用了圆括弧。例如:main()inti,a(10);for(i=0;i10;i+)scanf(%d,&a(i);C语言中对数组的定义或引用数组元素时必须用方括弧。14)对应该有花括弧的复合语句,忘记加花括弧。例如:sum=0;i=1;while(i=100)sum=sum+i;i+;本意是实现1+2+100,即。但上面的语句只是重复了sum+i的操作,而且循环永不终止。
9、因为i的值始终没有改变。错误在于没有写成复合语句形式。因此while语句的范围到其后第一个分号为止。语句“i+;”不属于循环体范围之内。应改为while(i=100)sum=sum+i;i+;(15)在用标识符时,忘记了大写字母和小写字母的区别。例如:main()inta,b,c;a=2;b=3;C=A+B;printf(%d+%d=%,A,B,C);编译时出错。编译程序把a和A认作是两个不同的变量名处理,同样,b和B,c和C都分别代表两个不同的变量。(16)在定义数组时,将定义的“元素个数”误认为是“可使用的最大下标值”。例如:main()staticinta10=1,2,3,4,5,6,7
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 实例教程 13 章程 调试 常见 错误 分析 课件
限制150内