C_C++程序设计教程与上机实训 教学课件 ppt 作者 于文强 程立福 毛慧凤 第十四章

上传人:E**** 文档编号:89393952 上传时间:2019-05-24 格式:PPT 页数:33 大小:116KB
返回 下载 相关 举报
C_C++程序设计教程与上机实训 教学课件 ppt 作者 于文强 程立福 毛慧凤 第十四章_第1页
第1页 / 共33页
C_C++程序设计教程与上机实训 教学课件 ppt 作者 于文强 程立福 毛慧凤 第十四章_第2页
第2页 / 共33页
C_C++程序设计教程与上机实训 教学课件 ppt 作者 于文强 程立福 毛慧凤 第十四章_第3页
第3页 / 共33页
C_C++程序设计教程与上机实训 教学课件 ppt 作者 于文强 程立福 毛慧凤 第十四章_第4页
第4页 / 共33页
C_C++程序设计教程与上机实训 教学课件 ppt 作者 于文强 程立福 毛慧凤 第十四章_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《C_C++程序设计教程与上机实训 教学课件 ppt 作者 于文强 程立福 毛慧凤 第十四章》由会员分享,可在线阅读,更多相关《C_C++程序设计教程与上机实训 教学课件 ppt 作者 于文强 程立福 毛慧凤 第十四章(33页珍藏版)》请在金锄头文库上搜索。

1、1,第14章 程序常见的错误、调试,2,14.1 程序的调试,C语言的最大特点是:功能强、使用方便灵活。C编译的程序对语法检查并不像其他高级语言那么严格,这就给编程人员留下“灵活的余地”,但同样由于这个灵活给程序的调试带来了许多不便。尤其对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误,看着有错的程序,不知该如何改起。下面介绍一些C语言使用过程中编程时常犯的错误,以供参考。,3,14.1.1 好的程序编写习惯,(1)应该特别注意程序的书写格式,让它的形式反映出其内在的意义结构。 (2)用最规范的、最清晰的、最容易理解的方式写程序。注意人们用C语言写程序的习惯写法,例如书中解决类似

2、问题时所使用的写法,在本书中有许多极好的程序实例可供参考。 (3)在编程中,应仔细研究编译程序给出的错误信息和警告信息,弄清楚每条信息的确切根源并予以解决。特别是不要忽略那些警告信息,许多警告信息源自隐含的严重错误。我们有许多办法去欺骗编译程序,使它不能发现程序中的错误,但这样做最终受到伤害的只能是自己。,4,(4)随时注意表达式计算过程和类型。注意运算符的优先级和结合顺序,不同类型的运算对象将怎样转换,运算的结果是什么类型的,等等。在必要的时候加上括号或显式的类型强制转换。 (5)绝不去写依赖于运算对象求值顺序的表达式。对于普通二元运算符的运算对象,函数调用的各个实参C语言都没有规定特定求值

3、顺序。因此,不应该写那种依赖于特定求值顺序的表达式,因为不能保证它一定得到什么结果。,5,(6)总保证一个函数的定义点和它的所有使用点都能看到同一个完整的函数原型说明。 (7)总注意检查数组的界限和字符串(也以数组的方式存放)的结束。C语言内部根本不检查数组下标表达式的取值是否在合法范围内,也不检查指向数组元素的指针是不是移出了数组的合法区域。写程序的人需要自己保证对数组使用的合法性。越界访问可能造成灾难性的后果。 (8)绝不对空指针或者悬空的指针做间接访问。这种访问的后果不可预料,可能会造成系统的破坏,也可能造成操作系统发现这个程序执行非法操作而强制将其终止。,6,(9)对于所有通过返回值报

4、告运行情况或者出错信息的库函数,都应该检查其执行是否正常完成。如果库函数没有完成操作(可能因为各种原因),随后的操作有可能就是非法的。这种错误也可能在程序运行中隐藏很长时间,到最后才暴露出来,检查错误非常困难。 (10)在带参数宏的定义字符串中,一般应该给整个字符串和其中出现的每个参数都加括号。 (11)所有外部变量名字和所有函数名字应该只靠前6个字符就能够互相区分。因为有些老的编译程序只关注这些名字的前6个字符。如果不注意这个问题,就可能引起隐含的连接错误。,7,14.1.2 C语言编写时容易出现的错误,(1)书写标识符时,忽略了大小写字母的区别。 #include main() int a

5、=5; printf(“%d“,A); 编译程序把a和A认为是两个不同的变量名,而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写表示,变量名用小写表示,以增加可读性。,8,(2)忽略了变量的类型,进行了不合法的运算。 #include main() float a,b; printf(“%d“,a%b); %是求余运算,得到a/b的整余数。整型变量a和b可以进行求余运算,而实型变量则不允许进行求余运算。 (3)将字符常量与字符串常量混淆。 char c; c=“a“;,9,(4)忽略了=与=的区别。 在许多高级语言中,用=符号作为关系运算符等于。如在BASIC

6、程序中可以写: if (a=3) then 但C语言中,=是赋值运算符,=是关系运算符。 (5)忘记加分号。 分号是C语句中不可缺少的一部分,语句末尾必须有分号。 a=1 b=2; 编译时,编译程序在a=1后面没发现分号,就把下一行b=2也作为上一行语句的一部分,这就会出现语法错误。改错时,有时在被指出有错的一行中未发现错误,就需要看上一行是否漏掉了分号。,10,(6)多加分号。 对于一个复合语句,如: z=x+y; t=z/100; printf(“%f“,t); ; 复合语句的花括号后不应再加分号,否则将会画蛇添足。 (7)输入变量时忘记加地址运算符 这是不合法的。scanf函数的作用是:

7、按照a,b在内存中的地址将a,b的值存储进去。&a指a在内存中的地址。 (8)输入数据的方式与要求不符。,11,(9)输入字符的格式与要求不一致。 在用%c格式输入字符时,空格字符和转义字符都作为有效字符输入。 scanf(“%c%c%c“, 如输入a b c 字符a送给c1,字符(空格)送给c2,字符b送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔。 (10)输入输出的数据类型与所用格式说明符不一致。,12,(11)输入数据时,企图规定精度。 scanf(“%7.2f“, 这样做是不合法的,输入数据时不能规定精度。 (12)switch语句中漏写break语句。 (

8、13)忽视了while和dowhile语句在细节上的区别。 (14)定义数组时误用变量。 (15)在定义数组时,将定义的元素个数误认为是可使的最大下标值。,13,(16)初始化数组时,未使用静态存储。 int a3=0,1,2; 这样初始化数组是不对的。C语言规定只有静态存储(static)数组和外部存储(exterm)数组才能初始化。应改为: static int a3=0,1,2; (17)在不应加地址运算符 (18)同时定义了形参和函数中的局部变量。,14,14.2 Turbo C的使用与差错判定,14.2.1 Turbo C简介 Turbo C是美国Borland 公司的产品,Borl

9、and公司是一家专门从事软件开发、 研制的大公司。1987年发布Turbo C 1.0,1990年发布Turbo C/C+,1992年发布Borland C/C+ 3.0,Turbo C+ 3.0与Turbo C 2.0的主要区别: Turbo C+ 3.0不仅能设计和编译C程序文件,而且修正了Turbo C 2.0中存在的一些Bug(如不能正常使用float数组等问题); Turbo C+ 3.0还支持多窗口操作,窗口间可以快速切换; 完全支持鼠标选择、拖放和右键操作,很好地照顾了习惯于图形操作环境的用户;,15,建立了即时帮助系统,只需要选定关键字后按【Ctrl+F1】键即可查看详细的帮助

10、说明,并且每个函数都具有完整的示例解释说明,只需要复制到新文件即可运行,无论对C语言初学者还是C+高手都是不错的实例教材; 可以自定义语句按照语法高亮多色显示,令代码编写、程序查错时更直观方便; 程序编辑器的查找、替换等编辑功能更方便易用; 建立和管理Project项目更方便容易; 3.0支持C+的,2.0不支持,而且3.0可以将不同的关键字以不同的颜色显示。,16,14.2.2 Turbo C 3.0的安装和启动,Turbo C 3.0的安装非常简单,将1#盘插入A驱动器中,在DOS的A下键入 AINSTALL,只要在安装过程中按对盘号的提示,顺序插入各个软盘,就可以顺利地进行安装。安装完毕

11、将在C盘根目录下建立一个TC 子目录,TC下还建立了两个子目录LIB和INCLUDE,LIB子目录中存放库文件,INCLUDE子目录中存放所有头文件。只要在TC子目录下键入TC并回车即可进入Turbo C 3. 0集成开发环境。,17,14.2.3 Turbo C的错误报告及其处理,Turbo C 的源程序错误分为3种类型:致命错误、一般错误和警告。其中,致命错误通常是内部编译出错;一般错误指程序的语法错误、磁盘或内存存取错误或命令行错误等;警告则只是指出一些怀疑的情况,它并不防止编译的进行。,18,14.3 上机实训,实验目的: 本章是程序设计的最后环节,涵盖内容多、范围广、决定程序的最终运

12、行结果。通过本实训要求掌握程序编写时应具备的规范书写以及改错技巧,并能够通过Turbo C的编译提示信息找到错误所在,从而达到改正的目的;对能够编译通过但是结果不符的程序修改,要求熟练掌握常用的解决方法。 实验内容: 计算PI值 简单二维数组的操作 指针的使用 编译后的连接,19,14.3.1 计算PI值,利用参考级数(1-1/3+1/5-1/7)4PI可以求得PI的近似值,计算的级数越高所得到的PI值就越精确,现给定一个精度为10-7,计算PI值。下面我们就通过对一个C语言编写的PI值计算程序的修改为例,说明程序修改的一般过程。分别采用前面几节讲过的知识找到明显的错误,上机运行该程序通过编译

13、器修改编译错误,最后检查运行结果是否满足要求。,20,修改前的源程序如下: #include void main() double PI,Nn,num; int sign; nn=1.0; num=1; sign=1; PI=0; While(fabs(num)=le-7) PI+=num; nn+=2; sign=-sign; Num=signnn; PI*=4; printf(“PI=%fn”,PI); ,21,实现步骤: 对一个已有的程序通过分析查找错误,运行程序分析其运行结果是否满足要求: (1)规范书写格式:一个行只放一条语句;书写时上下对应;定义的变量名称前后要统一;改正明显的语法

14、错误Num=signnn改为Num=sign/nn。 (2)经过初步改正后,程序的执行流程就有了初步的了解,这时候需要通过上机调试,进行试编译发现错误。运行后有如下提示: Error 1111.C 2: Declaration syntax error (3)查看程序,因为包含了数学函数fabs(num)=le-7,所以需要调用数学函数库 #include (4)这样经过多次修改,我们得到了该程序的最终运行结果: PI=3.141592,22,经过校正后的程序代码如下: #include #include void main() double PI,nn,num; int sign; nn=1

15、.0; num=1; sign=1; PI=0; while(fabs(num)=le-7); PI+=num; nn+=2; sign=-sign; num=sign/nn; PI*=4; printf(“PI=%fn“,PI); ,23,14.3.2 简单二维数组的操作,经过上面实例,我们对程序改错有了一定的认识,这里以二维数组的操作为例说明改错时应该具备的技巧。本实例要做的是把112装入一个二维数组中,然后按照行打印。 源程序: int main(void) int t,i,num34; for(t=1;t3;+t) for(i=1;i4;+i) numti=(t*4)+i+1; /*n

16、ext is print*/ int t,i,num34; for(t=1;t3;+t) for(i=1;i4;+i) printf(“%3d“,numti); printf(“n“); return 0; ,24,实现步骤: 对一个已有的程序通过分析查找错误,运行程序分析其运行结果是否满足要求: (1)经过上一个实例的修改,我们开始能够规范的书写程序。查找变量名字是否有大小写问题,相同函数是否有重复定义情况(t,i,num23被重复定义,应该删除后面的一个)函数库调用是否缺少(这里有输出函数printf(),因此需要调用stdio.h), (2)明显的错误已经消除,下面采用Turbo C编译器进行编译修改,运行程序,提示到如下问题: error C2059: syntax error : error C2143:

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号