程序错误和编程风格.ppt_第1页
程序错误和编程风格.ppt_第2页
程序错误和编程风格.ppt_第3页
程序错误和编程风格.ppt_第4页
程序错误和编程风格.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言程序设计 (Programming in C ),程序错误和编程风格,程序错误 编程风格,程序错误,一个编程大师说:“任何一个程序,无论它多么小,总存在着错误。” 初学者不相信大师的话,他问:“如果一个程序小得只能执行一个简单的功能,那会怎样?” “这样的程序没有意义,”大师说,“但如果这样的程序存在的话,操作系统最后将失效,产生一个错误。” 初学者不满足,他问:“如果操作系统不失效,那么会怎么样?” “没有不失效的操作系统,”大师说,“但如果这样的操作系统存在的话,硬件最后将失效,产生一个错误。” 初学者仍不满足,再问:“如果硬件不失效,那么会怎样?” 大师长叹一声道:“没有不失效的硬

2、件。但如果这样的硬件存在的话,用户就会想让那个程序做一件不同的事,这件事也是一个错误。” 没有错误的程序世间难求。【James 1999】,C程序错误,程序中的错误可分为 语法错误 逻辑错误(语义错误) 运行错误,C程序错误,语法错误,逻辑错误(语义错误),语法错误指编程时违背了C语法的规定,对这类错误,编译程序一般都能够给出“出错信息”,并且告诉在哪一行出错及出错的类型。只要仔细检查,可以很快发现并排除这类错误。,程序并没有违背语法规则,但程序的执行结果与预期不符。这是由于程序与设计人员的本意不相符,即出现逻辑错误(或语义错误)。,运行错误,运行时发生的、与运行状态或环境有关的错误。,C程序

3、中常见错误,使用的变量没有定义 变量没有赋值初就直接使用 输入输出的数据类型与所用格式说明符不一致 超出数据范围 输入变量时忘记使用地址符号 输入时数据的组织方式与要求不符 “=”与“=”混淆 语句的分号缺少或放置错误 缺少“ ” 符号引用错误,(、)、 括号不配对 引用数组元素越界 .,C程序中常见错误,使用的变量没有定义(语法错),例如:,正确: main ( ) int x, y; x = 3; y = x + 5; ,错误:x、y没有定义 main ( ) x = 3; y = x + 5; ,C/C+规定:任何变量都必须在使用前定义,否则编译时会出错。,C程序中常见错误(续),变量没

4、有赋初值就直接使用(逻辑错),例如:,错误:sum没有赋初值 int addition (int n) int i; int sum; for (i = 0; i n; i+) sum += i; return (sum);,正确: int addition (int n) int i; int sum = 0; for (i = 0; i n; i+) sum += i; return (sum);,C程序中常见错误(续),变量赋初值: 累加的初值应为0、连乘的初值应为1,例如:,求累加和: sum = 0; for (k=10; k=20; k+) sum = sum+k;,求累乘积: f

5、act = 1; for (k=1; k=8; k+) fact = fact * k;,求累加和: sum = 0; for (k=10; k=20; k+) sum = sum+k;,求累乘积: fact = 1; for (k=1; k=8; k+) fact = fact * k;,C程序中常见错误(续),输入输出的数据类型与所用格式说明符不一致(逻辑错),例如:,错误:数据输出时的格式错误 main ( ) int a = 3; float b = 4.5; printf(%f %dn,a,b);,正确: main ( ) int a = 3; float b = 4.5; prin

6、tf(%d %fn,a,b);,TC2.0,C程序中常见错误(续),超出数据范围(逻辑错),例如:,错误:x的有效范围在-128127之间 main () char x; x = 300;,300101001011002,C程序中常见错误(续),输入变量时忘记使用地址符号 (本来是语法错,表现为逻辑错),例如:,错误:scanf函数的实参格式 main () int a,b; scanf(%d%d,a,b); printf(%d %d,a,b); ,正确: main () int a,b; scanf(%d%d,C程序中常见错误(续),输入时数据的组织方式与要求不符,例如:,main () i

7、nt a,b; scanf (%d,%d,运行时输入:35 12,C程序中常见错误(续),误把“=”作为关系运算符“=”,例如:,错误:关系运算与赋值运算混淆 if (a = b) c = 0;else c = 1;,正确: if (a = b) c = 0;else c = 1;,1. 为何if语句中的条件总是成立或不成立? 在排除可能出现的逻辑错误外,有可能与条件表达式书写不正确有关。 例如:if (x=3) x=x+8; 这时的条件x=3始终成立,语句x=x+8也总是执行。要判断x是否等于3就必须写成x = 3。 又如:if (x=0) x=x+8; 这时条件x=0总是不成立,语句x=x

8、+8永远不执行。要判断x是否等于0就必须写成x=0或!x。 同样,在其它使用条件的语句中也要注意类似问题。,C程序中常见问题-if语句,2.为什么会出现if-else不匹配? 这种错误的原因可能比较复杂;总的原则是: (1)有一个else必有一个if,所以首先在数量上要匹配 (2)逻辑关系要合理;若执行的是复合语句,不要漏掉复合语句标志 。 例如: if (xy) t=a; a=b; b=t; else t=m; 编译时就会提示出错信息,正确的写法: if (xy) t=a; a=b; b=t; else t=m; (3)若条件不成立时要求执行的语句有多条,else后必须为复合语句。 例如:i

9、f (xy) t=a; a=b; b=t; else t=m; m=n; n=t;,C程序中常见问题-if语句,C程序中常见错误(续),语句的分号放置错误,例如:,语法错误:缺少“;” main () unsigned int i,sum; sum=0; for (i=0;i10;i+) sum+=i ,正确: main () unsigned int i,sum; sum = 0; for (i = 0; i 10; i+) sum += i;,逻辑错误: “;”放错位置 main () unsigned int i,sum = 0; for (i = 0; i 10; i+); sum +

10、= i;,C程序中常见错误(续),语句的分号放置错误,例如:,正确: main () unsigned int i,sum; sum = 0; for (i = 0; i 10; i+) sum += i;,逻辑错误: “;”放错位置 main () unsigned int i,sum; sum = 0; for (i = 0; i 10; i+); sum += i;,C程序中常见错误(续),“ ”的使用问题,例如:,逻辑错误: 循环体部分没有使用” ” sum = 0; i = 1; while ( i = 10) sum += i; i+;,正确: sum = 0; i = 1; wh

11、ile ( i = 10) sum += i; i+; ,C程序中常见错误(续),符号引用错误,(、)、 括号不配对 引用数组元素超界 .,数组下标越界错误: int a10; for (i=0; i=10; i+) scanf(%d, ,正确方式: int a10; for (i=0; i10; i+) scanf(%d,C程序中常见错误(续),整除运算的结果依然是整数 字符与字符串,9/2的结果为4,而9.0/2的结果为4.5。 因此,需要对9或2进行强制类型转换,以得到4.5,即 9/(float)2 = 4.5 特别注意:1/3+1/3+1/3的结果为0。,字符常量是由单引号括起的一个

12、字符,如:s。而s是字符串常量,由双引号括起,包含两个字符:s和0。使用时不能混淆,例如: char c, p; p = s; /正确 c = s; /错误,字符变量c只能存放一个字符,(1)+和-运算只能适用于变量(尤其是整型变量) 例如:n*m+ 正确的, (n * m)+是错误的,因为(n * m)是表达式。 (2)前置和后置有区别: int n, post, pre; n = 2; post = n+; /执行后post为2,n为3 n = 2; pre = +n; /执行后pre为3,n为3,C程序中常见问题- +/-运算,C程序中常见问题-定长数组与变长数组,定义定长数组: int

13、 a5;,变长数组: int n; int an;,定义数组并初始化数组元素: int a5 = 1,2,3,4,5;,访问数组元素(写、读): for (i = 0; i 5; i+) ai = i*2; for (i = 0; i 5; i+) printf(%d ,ai);,变长数组: int n = 20; int an;,C99标准规定:定义数组时,其大小可以不确定,但不是所有的编译器都支持该特性,C程序中常见问题-字符数组 与 字符串,定义字符数组: char name5;,定义字符数组及初始化: char name15 = c, h, i, n, a ; char name2 =

14、 c, h, i, n, a ;,定义字符数组及初始化: char name1 = c, h, i, n, a, 0 ; char name2 = china ; Char name3 = china;,scanf(%s,name); 或 gets(name); 读入一个字符串时,系统会自动加上结束标志0 。,C程序中常见问题-if语句,Code 1: if (mark = 90) printf(优); else if (mark = 80) printf(良); else if (mark = 70) printf(中); else if (mark = 60) printf(及格); el

15、se printf(不及格);,例如:百分制成绩mark与对应五级制,Code 2: if (mark 60) printf(不及格); else if (mark 70) printf(及格); else if (mark 80) printf(中); else if (mark 90) printf(良); else printf(优);,Code 3: if ( mark = 60) printf(及格); else if (mark = 70) printf(中); else if (mark = 80) printf(良); else if (mark = 90) printf(优)

16、; else printf(不及格);,C程序中常见问题-if语句,Code 4: if (mark = 90) printf(优); else if (80 = mark 90) printf(良); else if (70 = mark 80) printf(中); else if (60 = mark 70) printf(及格); else printf(不及格);,例如:百分制成绩mark与对应五级制,Code 5: if (mark = 90) printf(优); else if (80 = mark ,编程风格,程序是最复杂的东西(虽然你开始写的程序很简单,但它们会逐渐变得复杂

17、起来),是需要用智力去把握的智力产品。编程时应强调程序的易读性,尤其在团队协作的情况下。一套鲜明的编程风格,可以让协作者、后继者和自己一目了然,在很短的时间内看清程序的结构,理解设计思路。 在简单程序中,涉及编程风格的内容主要有: 1) 缩进格式 2) 符号的声明和命名方式 3) 大括号的位置 4) 注释,编程风格,人们常用的缩进格式是:逻辑上属于同一个层次的互相对齐;逻辑上属于内部层次的推到下一个对齐位置。,1) 缩进格式 2) 符号的声明和命名方式 3) 大括号的位置 4) 注释,if (x max (y, z) sum = place4 + y; else while (x) sum +

18、= x; x-; sum = sum + z; ,if (x max (y, z) sum = place4 + y; else while (x) sum += x; x-; sum = sum + z; ,对比一下,编程风格,采用直观的符号为常量、变量、函数等命名 。在团队开发中,应有一套命名规范。,1) 缩进格式 2) 符号的声明和命名方式 3) 大括号的位置 4) 注释,double x, y; x = 1.5; y = x * x *3.14159;,#define PI 3.1415925 double radius, area; radius = 1.5; area = radi

19、us * radius * PI;,#define N 100 int aN; for(i = 0; i N; i+) ai = i *2 + 1;,#define ARR_SIZE 100 int arrARR_SIZE; for(i = 0; i ARR_SIZE; i+) arri = i *2 + 1;,编程风格,采用直观的符号为常量、变量、函数等命名 。,1) 缩进格式 2) 符号的声明和命名方式 3) 大括号的位置 4) 注释,#define TRUE 1 #define FALSE 0 /*判断正整数d是否为素数,若是返回TRUE,否则返回FALSE*/ int isPrime(

20、int d) int i; if (d 2) return FALSE; for(i = 2; i = (int)sqrt(d); i+) if ( d % i = 0 ) return FALSE; return TRUE; ,int isPrime(int d) int i; if (d 2) return 0; for(i = 2; i = (int)sqrt(d); i+) if ( d % i = 0 ) return 0; return 1; ,编程风格,经典C语言书中(Kernighan和Ritchie著)将开始的大括号放在一行的最后,而将结束大括号放在一行的第一位,函数体的“”

21、和“”则在最左边,.,1) 缩进格式 2) 符号的声明和命名方式 3) 大括号的位置 4) 注释,/*判断正整数d是否为素数,若是返回TRUE,否则返回FALSE*/ int isPrime(int d) int i; if (d 2) return FALSE; for(i = 2; i = (int)sqrt(d); i+) if ( d % i = 0 ) return FALSE; return TRUE; ,int isPrime(int d) int i; if (d 2) return FALSE; for(i = 2; i = (int)sqrt(d); i+) if ( d

22、% i = 0 ) return FALSE; return TRUE; ,编程风格,变量的注释;函数的功能和参数进行注释;文件注释;.,1) 缩进格式 2) 符号的声明和命名方式 3) 大括号的位置 4) 注释,/*判断正整数d是否为素数:先计算d的因子个数c(不包括1和d自己),若c不为0,则d是素数,返回TRUE,否则返回FALSE*/ int isPrime(int d) int i , count_factor = 0; /*用于计算因子数目*/ if (d 0) return FALSE; else return TRUE; ,int isPrime(int d) int i, c

23、 = 0; if (d 0) return FALSE; else return TRUE; ,编程风格,风格没有对和错,没有什么理由去选择一种风格而不选择另外一种。 程序是最复杂的东西(虽然你开始写的程序很简单,但它们会逐渐变得复杂起来),是需要用智力去把握的智力产品。编程时应强调程序的易读性,尤其在团队协作的情况下。一套鲜明的编程风格,可以让协作者、后继者和自己一目了然,在很短的时间内看清程序的结构,理解设计思路。 应该用规范的、清晰的、容易理解的方式写程序。,编程,学习程序设计就好比学习射击,而程序设计语言就对应射击中的气枪、手枪、步枪等各种枪械。 学习射击必须要选择一种枪械,不可能没有

24、枪还能学好射击的,也不可能同时学会使用所有的枪械。 但是,如果掌握一种枪械的射击,再学别的也就触类旁通了。因为在熟悉一种枪械的同时,也学习了射击技术本身。再学其他的,自然事半功倍。 学习程序设计也是一样,必然要从学习一门程序设计语言开始入手。在学会系统的编程理念之后,用什么工具都一样!,学 C/C+ 的 50 条忠告:来自网落,供参考,1.把C+当成一门新的语言学习(和C没啥关系!真的。); 2.看Thinking In C+,不要看C+变成死相; 3.看The C+ Programming Language和Inside The C+ Object Model,不要因为他们很难而我们自己是初

25、学者所以就不看; 4.不要被VC、BCB、BC、MC、TC等词汇所迷惑他们都是集成开发环境,而我们要学的是一门语言; 5.不要放过任何一个看上去很简单的小编程问题他们往往并不那么简单,或者可以引伸出很多知识点; 6.会用Visual C+,并不说明你会C+; 7.学class并不难,template、STL、generic programming也不过如此难的是长期坚持实践和不遗余力的博览群书;,学 C/C+ 的 50 条忠告:来自网落,供参考,8.如果不是天才的话,想学编程就不要想玩游戏你以为你做到了,其实你的C+水平并没有和你通关的能力一起变高其实可以时刻记住:学C+是为了编游戏的; 9.

26、看Visual C+的书,是学不了C+语言的; 10.浮躁的人容易说:XX语言不行了,应该学YY;是你自己不行了吧!? 11.浮躁的人容易问:我到底该学什么;别问,学就对了; 12.浮躁的人容易问:XX有钱途吗;建议你去抢银行; 13.浮躁的人容易说:我要中文版!我英文不行!不行?学呀! 14.浮躁的人容易问:XX和YY哪个好;告诉你吧,都好只要你学就行; 15.浮躁的人分两种:a)只观望而不学的人;只学而不坚持的人;,学 C/C+ 的 50 条忠告:来自网落,供参考,16.把时髦的技术挂在嘴边,还不如把过时的技术记在心里; 17.C+不仅仅是支持面向对象的程序设计语言; 18.学习编程最好的

27、方法之一就是阅读源代码; 19.在任何时刻都不要认为自己手中的书已经足够了; 20.请阅读The Standard C+ Bible(中文版:标准C+宝典),掌握C+标准; 21.看得懂的书,请仔细看;看不懂的书,请硬着头皮看; 22.别指望看第一遍书就能记住和掌握什么请看第二遍、第三遍; 23.请看Effective C+和More Effective C+以及Exceptional C+; 24.不要停留在集成开发环境的摇篮上,要学会控制集成开发环境,还要学会用命令行方式处理程序;,学 C/C+ 的 50 条忠告:来自网落,供参考,25.和别人一起讨论有意义的C+知识点,而不是争吵XX行不行或者YY与ZZ哪个好; 26.请看程序设计实践,并严格的按照其要求去做; 27.不要因为C和C+中有一些语法和关键字看上去相同,就认为它们的意义和作用完全一样; 28.C+绝不是所谓的C的扩充如果C+一开始就起名叫Z语言,你一定不会把C和Z语言联系得那么紧密; 29.请不要认为学过XX语言再改学C+会有什么问题你只不过又在学一门全新的语言而已; 30.读完了Inside The C+ Object Model以后再来认定自己是不是已经学会了C+; 31.学习编程的秘诀是:编程,编程,再编程;,学 C/C+ 的 50

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论