欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    C语言程序设计实例教程(第2版)第13章程序调试与常见错误分析课件.ppt

    • 资源ID:73174776       资源大小:172.50KB        全文页数:61页
    • 资源格式: PPT        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C语言程序设计实例教程(第2版)第13章程序调试与常见错误分析课件.ppt

    第第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-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()后加了一个分号,使循环体变成了空语句,因此,只能输入一个整数并输出它的平方值。(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!);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;case4: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的操作,而且循环永不终止。因为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,8,9,10;inti;for(i=1;iy?x:y);这个程序乍看起来没有什么问题,但在编译时有出错信息。原因是,max函数是实型的,而且在main函数之后才定义,也就是max函数的定义位置在main函数中的调用max函数之后。改错的方法可以用下面两种方法之一。在main函数中增加一个对max函数的说明,即main()floatmax();/*说明将要用到的max函数为实型*/floatx,y,z;x=3.5;y=-7.6;z=max(x,y);printf(%fn,z);将max函数的定义位置调到main函数之前。即floatmax(x,y)floatx,y;return(z=xy?x:y);main()floatx,y,z;x=3.5;y=-7.6;z=max(x,y);printf(%fn,z);这样,编译时不会出错,程序运行结果是正确的。(23)将函数的形参和函数中的局部变量一起定义。例如:max(x,y)intx,y,z;z=xy?x:y;return(z);形参应该在函数体之前定义,而函数中用到的局部变量应在函数体中定义。应改为max(x,y)intx,y;intz;z=xy?x:y;return(z);(24)函数的实参和形参类型不一致。例如:main()inta=3;b=4;c=fun(a,b);fun(x,y)floatx,y;实参a、b为整型,形参x、y为实型。a和b的值传递给x和y时,x和y的值并非3和4。C要求实参与形参的类型一致。(25)没有注意函数参数的求值顺序。例如:i=3;printf(%d,%dn,i,+i,+i);许多人认为输出必然是3,4,5实际不尽然。在许多系统中输出是5,5,4因为许多系统是采取自右至左的顺序求函数参数值的。先求出最右面一个参数(+i)的值为4,再求出第2个参数(+i)的值为5,最后求出最左面的参数(i)的值为5。C标准没有具体规定函数参数求值的顺序是自左而右还是自右而左。但每个C编译程序都有自己的顺序,在有些情况下,从左到右求解和从右到左求解的结果是相同的。例如:fun1(a+b,b+c,c+a);fun1是一个函数名,a+b、b+c、c+a是3个实参表达式。在一般情况下,自左至右地求这三个表达式的值和自右至左地求它们的值是一样的,但在前面的例子中却不相同。因此,建议最好不用会引起二义性的用法。如果在上例中,希望输出“3,4,5”时,可以改用i=3;j=i+1;k=j+1;printf(%d,%d,%dn,i,j,k);(26)混淆数组名与指针变量的区别。例如:main()inti,a5;for(i=0;i5;i+)scanf(%d,a+);企图通过a的改变使指针下移,每次指向欲输入数据的数组元素。它的错误在于:不了解数组名代表数组首地址,它的值是不能改变的,用a+是错误的,应当用指针变量来指向各数组元素。即inti,a5,*p;p=a;for(i=0;i5;i+)scanf(%d,p+);或者inta5,*p;for(p=a;pa+5;p+)scanf(%d,p);(27)误认为形参值的改变会影响实参的值。例如:main()inta,b;a=3;b=4;swap(a,b);printf(%d,%dn,a,b);swap(x,y)intx,y;intt;t=x;x=y;y=t;原意是通过调用swap函数使a和b的值对换,然后在main函数中输出已对换了值的a和b。但是这样的程序是达不到目的的,因为x和y值的变化是不传送回实参a和b的,main函数中的a和b值并未改变。如果想从函数得到一个以上的变化了的值,应该用指针变量。用指针变量作函数参数,使指针变量所指向的变量的值发生变化。此时变量的值改变了,主调函数中可以利用这些已改变的值。如:main()inta,b,*P1,*P2;a=3;b=4;p1=&a;p2=&b;swap(p1,p2);printf(%d,%dn,a,b);/*a和b的值已对换*/swap(pt1,pt2)int*pt1,*pt2;intt;t=*pt1;*pt1=*pt2;*pt2=t;(28)混淆结构体类型与结构体变量的区别,对一个结构体类型赋值。例如:structworkerlongintnum;charname20;charsex;intage;worker.num=187045;strcpy(worker.name,ZhangFan);worker.sex=M;worker.age=18;这是错误的,只能对变量赋值而不能对类型赋值。上面只定义了structworker类型而未定义变量。应改为structworkerlongintnum;charname20;charsex;intage;structworkerworker_1;worker_1.num=187045;strcpy(worker_1.name,ZhangFan);worker_1.sex=M;worker_1.age=18;今定义了结构体变量worker_1,并对其中的各成员赋值。(29)使用文件时忘记打开,或打开方式与使用情况不匹配。例如:if(fp=fopen(test,r)=NULL)printf(cannotopenthisfilen);exit(0);ch=fgetc(fp);while(ch!=#)ch=ch+4;fputc(ch,fp);ch=fget(fp);对以“r”方式(只读方式)打开的文件,进行既读又写的操作,显然是不行的。此外,有的程序常忘记关闭文件,虽然系统会自动关闭所用文件,但可能会丢失数据。因此必须在用完文件后关闭它。以上只是列举了一些初学者常出现的错误,这些错误大多是由于对C语言的语法不熟悉造成的。对C语言使用多了,熟练了,错误自然就会减少了。在深入使用C语言后,还会出现其他一些更深入、更隐蔽的错误。程序出错有下面两种情况。语法错误。指违背了C语言的语法的规定,对这类错误,编译程序一般能给出“出错信息”,并且告诉你在哪一行出错。只要细心,错误是可以很快发现并排除的。逻辑错误。程序并没有违背语法规则,但程序执行结果与原意不符。这是由于程序设计人员通知给系统的指令与原意不相同,即出现了逻辑上的混乱。例如,前面第14条错误:sum=0;i=1;while(i=100)sum=sum+i;i+;语法并无错误。但while语句通知给系统的信息是:当i100时,执行“sum=sum+i;”。C语言系统无法辨别程序中这个语句是否符合作者的原意,而只能忠实地执行这一指令。这种错误比语法错误更难检查,要求程序员有较丰富的经验。

    注意事项

    本文(C语言程序设计实例教程(第2版)第13章程序调试与常见错误分析课件.ppt)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开