- 1、本文档共61页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]C语言程序设计实例教程第2版丁爱萍第13章 程序调试与常见错误分析
第13章 程序调试与常见错误分析 13.1 程序调试 13.2 常见错误分析 13.1 程序调试 13.1.1 程序调试的步骤 所谓程序调试,是指对程序的查错和排错。调试程序一般应经过以下几个步骤。 1. 人工检查,即静态检查 在写好一个程序以后,不要匆匆忙忙上机,而应对纸面上的程序进行人工检查。这一步是十分重要的,它能发现程序设计人员由于疏忽而造成的多处错误。而这一步骤往往容易被忽视。有的用户总希望把一切推给计算机系统去做,但这样就会多占用机器时间。 而且,作为一个程序设计人员应当养成严谨科学的作风,每一步都要严格把关,不要把问题留给后面的工序。 为了更有效地进行人工检查,所编的程序应力求做到以下几点: (1) 应当采用结构化程序方法编程,以增加可读性。 (2) 尽可能多地加注释,以帮助理解每段程序的作用。 (3) 在编写复杂的程序时,不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能。这样既易于阅读,也便于调试,各函数之间除用参数传递数据外,数据间应尽量少出现耦合关系,以便于分别检查和处理。 2. 上机调试,即动态检查 在人工(静态)检查无误后,才可以上机调试。通过上机发现的错误称之为动态检查。在编译时,系统会给出语法错误的信息(包括哪一行有错以及错误类型),用户可以根据提示的信息具体找出程序中出错之处并进行修改。应当注意的是:有时提示的出错行并不是真正出错的行,如果在提示出错的行上找不到错误的话,应当到上一行再找。另外,有时提示出错的类型并非绝对准确,由于出错的情况繁多而且各种错误互有关联,因此要善于分析,找出真正的错误,而不要死抱住提示的出错信息不放,钻牛角尖。 如果系统提示的出错信息多,应当从上到下逐一改正。有时显示出一大片错误信息往往使人感到问题严重,无从下手。其实可能只有一两个错误。例如,对所用的变量未定义,编译时就会对所有含该变量的语句发出出错信息。这时只要加上一个变量定义,那么所有错误就都消除了。 3. 运行程序,试验数据 在改正语法错误(包括“错误”error和“警告”warning)后,程序经过链接(link)就得到可执行的目标程序。运行程序,输入程序所需数据,就可得到运行结果。应当对运行结果作分析,看它是否符合要求。有的初学者看到输出运行结果就认为没问题了,不作认真分析,这是危险的。 有时,数据比较复杂,难以立即判断结果是否正确。可以事先考虑好一批“试验数据”,输入这些数据,可以判断结果正确与否。例如,解方程ax2+bx+c=0,输入a、b、c的值分别为1、-2、1时,根x的值是1。这是容易判断的,若根不等于1,程序显然有错。 但是,用“试验数据”时,程序运行结果正确,还不能保证程序完全正确。因为有可能输入另一组数据时运行结果不对。例如,用 公式求根x的值,当a0和b2-4ac0时,能得出正确结果;当a=0或b2-4ac0时,就得不到正确结果(假设程序中未对a=0作防御处理以及未作复数处理)。因此,应当把程序可能遇到的多种方案都一一试到。再如,if语句有两个分支,有可能在流程经过其中一个分支的结果正确,而经过另一个分支时结果不正确。这些都必须考虑周全。 13.1.2 检查和分析错误原因 运行结果不对,大多属于逻辑错误。对这类错误往往需要仔细检查和分析才能发现,可以采用的方法有以下几种: (1) 如果在程序中没有发现问题,可以检查流程图有无错误,即算法有无问题,如有,就需改正,接着修改程序。将程序与流程图(或伪代码)仔细对照,如果流程图是正确的话,则是程序写错了,这很容易被发现的。例如,复合语句忘记写花括弧“{ }”,只要对照流程图很快就能发现。 (2) 如果实在找不到错误,可以采取“分段检查”的方法。在程序不同位置设几个printf函数语句,输出有关变量的值,逐段往下检查,直到找到在某一段中数据不对的段为止。这时就已经把错误局限在这一段中了。不断缩小“查错区”,就可能发现错误所在。 (3) 也可以用第9章介绍过的“条件编译”命令来进行程序调试。在程序调试阶段,若干printf函数语句要进行编译并执行。当调试完毕时,这些语句不再编译,也不再被执行了。这种方法可以不必一一删除printf函数语句,因此可以提高效率。 (4) 有的系统还提供debug(调试)工具,跟踪流程并给出相应信息,使用更为方便,相关内容请查阅有关手册。 总之,程序调试是一项细致深入的工作,需要下功夫、动脑子、善于累积经验。在程序调试过程中往往反映出一个人的水平、经验和科学态度。上机调试程序的目的
文档评论(0)