C语言程序设计第七章课件实用教案

上传人:ni****g 文档编号:569523275 上传时间:2024-07-30 格式:PPT 页数:67 大小:3.06MB
返回 下载 相关 举报
C语言程序设计第七章课件实用教案_第1页
第1页 / 共67页
C语言程序设计第七章课件实用教案_第2页
第2页 / 共67页
C语言程序设计第七章课件实用教案_第3页
第3页 / 共67页
C语言程序设计第七章课件实用教案_第4页
第4页 / 共67页
C语言程序设计第七章课件实用教案_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《C语言程序设计第七章课件实用教案》由会员分享,可在线阅读,更多相关《C语言程序设计第七章课件实用教案(67页珍藏版)》请在金锄头文库上搜索。

1、本章(bnzhn)学习内容函数定义、函数调用、函数原型、函数的参数传递与返回值递归函数和函数的递归调用函数封装,函数复用,函数设计的基本原则,程序的健壮性变量(binling)的作用域与存储类型,全局变量(binling)、自动变量(binling)、静态变量(binling)、寄存器变量(binling)“自顶向下、逐步求精”的模块化程序设计方法第1页/共66页第一页,共67页。数学(shxu)中的函数自变量自变量因变量因变量函数函数(hnsh)名名程序设计程序设计程序设计程序设计(chn x sh j)(chn x sh j)中的中的中的中的函数函数函数函数 程序设计中的函数不局限于计算程

2、序设计中的函数不局限于计算计算类,如打印阶乘表的程序计算类,如打印阶乘表的程序判断推理类,如排序、查找判断推理类,如排序、查找第2页/共66页第二页,共67页。问题(wnt)的提出读多少行的程序能让你不头疼?假如(jir)系统提供的函数printf()由10行代码替换,那么你编过的程序会成什么样子?实际上一个printf()有上千行代码main()中能放多少行代码?如果所有代码都在main()中,怎么团队合作?如果代码都在一个文件中,怎么团队合作?第3页/共66页第三页,共67页。问题(wnt)的提出三国演义中有这样一段描写:懿问曰:“孔明寝食及事之烦简若何?”使者曰:“丞相夙兴夜寐,罚二十以

3、上皆亲览焉。所啖之食,日不过数升。”懿顾谓诸将曰:“孔明食少事烦,其能久乎?”此话音落不久,诸葛亮果然病故于五丈原。“事无巨细”,“事必躬亲” 管理学的观点(gundin)是极其排斥这种做法的,认为工作必须分工,各司其职其中的思想,在程序设计里也适用 第4页/共66页第四页,共67页。7.1分而治之(fnrzhzh)与信息隐藏分而治之(DivideandConquer,Wirth,1971)函数把较大的任务分解成若干个较小的任务,并提炼出公用任务信息隐藏(InformationHiding,Parnas,1972)设计得当的函数可把具体操作细节对外界隐藏起来(qli),从而使整个程序结构清楚使

4、用函数时,不用知道函数内部是如何运作的,只按照我们的需要和它的参数形式调用它即可第5页/共66页第五页,共67页。程序设计(chnxshj)的艺术算法设计艺术程序(chngx)的灵魂Donald E. Knuth,“The Art of Computer Programming”, 清华大学出版社(英),国防工业出版社(中)结构设计艺术程序(chngx)的肉体模块化(Parnas, 1972)结构化(Structural)面向对象(Object-Oriented)面向组件(Component-Oriented)面向智能体(Agent-Oriented)第6页/共66页第六页,共67页。函数是C

5、语言中模块化编程的最小单位可以把每个函数看做一个模块(Module)如把编程比做制造一台机器,函数就好比其零部件可将这些“零部件”单独设计、调试、测试好,用时拿出来装配,再总体调试。这些“零部件”可以是自己设计制造/别人设计制造/现成的标准(biozhn)产品7.2 7.2 函数函数函数函数(hnsh)(hnsh)的定义的定义的定义的定义MoeCurlyLarry第7页/共66页第七页,共67页。7.2函数(hnsh)的定义若干相关的函数可以合并成一个“模块”一个C程序由一个或多个源程序文件(wnjin)组成一个源程序文件(wnjin)由一个或多个函数组成第8页/共66页第八页,共67页。7.

6、2.1函数(hnsh)的分类函数生来都是平等的,互相独立(dl)的,没有高低贵贱和从属之分main( )稍微特殊一点点C程序的执行从main ( )函数开始调用其他函数后流程回到main ( )函数在main ( )函数中结束整个程序运行第9页/共66页第九页,共67页。7.2.1函数(hnsh)的分类标准库函数ANSI/ISO C定义的标准库函数符合标准的C语言编译器必须提供这些函数函数的行为也要符合ANSI/ISO C的定义第三方库函数由其他厂商自行(zxng)开发的C语言函数库不在标准范围内,能扩充C语言的功能(图形、网络、数据库等)自定义函数自己定义的函数包装后,也可成为函数库,供别人

7、使用第10页/共66页第十页,共67页。7.2.2函数(hnsh)的定义(FunctionDefinition)类型 函数名(类型 参数(cnsh)1, 类型 参数(cnsh)2, )声明语句序列 可执行语句序列 return 表达式;返回值类型返回值类型(lixng)函数名函数名标识符,标识符,说明运说明运算规则算规则参数表参数表相当于运算的相当于运算的操作数操作数返回返回运算的结果运算的结果函数出口函数出口第11页/共66页第十一页,共67页。类型 函数名(类型 参数1, 类型 参数2, ) 声明语句(yj)序列 可执行语句(yj)序列 return 表达式;函数体的定界符函数体的定界符参

8、数表里参数表里(bio l)的变量(叫形式参数,的变量(叫形式参数,Formal Parameter)也是内部变量)也是内部变量函数函数(hnsh)体体7.2.27.2.2函数的定义函数的定义(Function DefinitionFunction Definition)第12页/共66页第十二页,共67页。void 函数名(void)声明语句(yj)序列 可执行语句(yj)序列 return;函数无返回值,用函数无返回值,用void定义定义(dngy)返回值类型返回值类型用用void定义参数,表示定义参数,表示(biosh)没有参数没有参数return语句后无需任何表达语句后无需任何表达式式

9、7.2.27.2.2函数的定义函数的定义(Function DefinitionFunction Definition)第13页/共66页第十三页,共67页。【例7.1a】计算(jsun)整数n的阶乘n!/* 函数功能: 用迭代法计算n! 函数入口(r ku)参数: 整型变量n表示阶乘的阶数 函数返回值: 返回n!的值*/long Fact(int n) /* 函数定义 */ int i; long result = 1; for (i=2; i=n; i+) result *= i; return result; 返回值类型返回值类型(lixng)函数名说明函数的函数名说明函数的功能功能返回

10、值作为函数调用表返回值作为函数调用表达式的值达式的值形参表,函数入口形参表,函数入口函数内部可以定义只能自函数内部可以定义只能自己使用的变量,称内部变己使用的变量,称内部变量量第14页/共66页第十四页,共67页。 函数名(表达式1, 表达式2, );实际参数(cnsh)(Actual Argument )函数调用(Founction Call)时提供的表达式有返回值时放到一个数值表达式中 c = max(a,b);作为另一个函数调用的参数(cnsh) c = max(max(a,b),c); printf(%dn, max(a,b);无返回值时函数调用表达式 display(a,b); 返回

11、值返回值返回值返回值 = = = = 函数名函数名函数名函数名( ( ( (实参表列实参表列实参表列实参表列);););); 函数名函数名函数名函数名( ( ( (实参表列实参表列实参表列实参表列););););7.37.3向函数传递向函数传递(chund)(chund)简单变量的简单变量的值值和从函数返回值和从函数返回值第15页/共66页第十五页,共67页。函数(hnsh)的参数传递实参和形参必须(bx)匹配数目一致,类型一一对应(否则会发生自动类型转换)【例例7.1】 第16页/共66页第十六页,共67页。7.3.2函数(hnsh)原型(FunctionPrototype)在调用函数前先声

12、明(shngmng)其返回值类型、函数名和参数函数原型有助于编译器对函数参数类型的匹配检查 末尾末尾(m(m wi)wi)有一个分号,声有一个分号,声明时不要省略形参和返回值明时不要省略形参和返回值的类型的类型【例例7.1】 第17页/共66页第十七页,共67页。函数(hnsh)定义与函数(hnsh)声明的区别函数定义指函数功能的确立指定函数名、函数类型、形参及类型、函数体等是完整独立的单位 函数声明(shngmng)是对函数名、返回值类型、形参类型的说明不包括函数体是一条语句,以分号结束,只起一个声明(shngmng)作用第18页/共66页第十八页,共67页。7.3.3函数(hnsh)封装与

13、防御性程序设计函数封装(Encapsulation)使得外界(wiji)对函数的影响仅限于入口参数,而函数对外界(wiji)的影响仅限于一个返回值和数组、指针类型的参数 【例例7.1】 Why?传入传入(chun r)负数实参负数实参会怎样?会怎样?第19页/共66页第十九页,共67页。防御性程序设计(chnxshj)(DefensiveProgramming)如何使函数具有遇到(y do)不正确使用或非法数据输入时避免出错的能力,增强程序的健壮性? 在函数的入口处,检查输入参数的合法性 【例【例7.27.2】 计算计算(j sun)(j sun)整数整数n n的阶乘的阶乘n n! 第20页/

14、共66页第二十页,共67页。如何使函数具有(jyu)遇到不正确使用或非法数据输入时避免出错的能力,增强程序的健壮性? 在函数的入口处,检查输入参数的合法性 防御性程序设计(chnxshj)(DefensiveProgramming)【例【例7.27.2】计算】计算(j sun)(j sun)整数整数n n的阶乘的阶乘n n! 第21页/共66页第二十一页,共67页。主函数如何修改?增加(zngji)对函数返回值的检验 防御性程序设计(chnxshj)(DefensiveProgramming)【例【例【例【例7.37.37.37.3】计算】计算】计算】计算(j sun)(j sun)(j su

15、n)(j sun)整数整数整数整数n n n n的阶乘的阶乘的阶乘的阶乘n n n n! 第22页/共66页第二十二页,共67页。传入负数的实参时Fact()会返回-1吗?存在死代码的原因(yunyn)何在?防御性程序设计(chnxshj)(DefensiveProgramming)【例【例7.37.3】计算】计算(j sun)(j sun)整数整数n n的阶乘的阶乘n n! 第23页/共66页第二十三页,共67页。如何修改程序去除冗余代码?如何保证不会(b hu)传入负数实参?防御性程序设计(chnxshj)(DefensiveProgramming)【例【例【例【例7.27.27.27.2

16、】计算整数】计算整数】计算整数】计算整数(zhngsh)n(zhngsh)n(zhngsh)n(zhngsh)n的阶乘的阶乘的阶乘的阶乘n n n n! 第24页/共66页第二十四页,共67页。【例【例7.4】编写计算】编写计算(j sun)组合数组合数的程序的程序函数函数(hnsh)复复用用第25页/共66页第二十五页,共67页。7.3.4函数设计的基本(jbn)原则信息(xnx)隐藏1函数规模函数规模要小要小2函数功能函数功能要单一要单一3函数接口函数接口定义定义要要清楚清楚入口参数有效性检查入口参数有效性检查敏感操作前的检查敏感操作前的检查调用调用(dioyng)(dioyng)成功与成

17、功与否的检查否的检查第26页/共66页第二十六页,共67页。函数函数函数函数(hnsh)(hnsh)的嵌套调用的嵌套调用的嵌套调用的嵌套调用 嵌套调用嵌套调用嵌套调用嵌套调用 在调用一个在调用一个在调用一个在调用一个(y )(y )(y )(y )函数的过程中,又调用另一个函数的过程中,又调用另一个函数的过程中,又调用另一个函数的过程中,又调用另一个(y )(y )(y )(y )函数函数函数函数 C C C C语言规定函数不能嵌套定义,但可以嵌套调用语言规定函数不能嵌套定义,但可以嵌套调用语言规定函数不能嵌套定义,但可以嵌套调用语言规定函数不能嵌套定义,但可以嵌套调用 函数是相互平行的函数是

18、相互平行的函数是相互平行的函数是相互平行的 main()a();a 函数函数(hnsh)b();return;b函数函数return;第27页/共66页第二十七页,共67页。7.4函数(hnsh)的递归调用和递归函数(hnsh)如果一个对象部分地由它自己组成或按它自己定义,则我们称它是递归(Recursive)的。生活中,字典就是一个递归问题的典型实例字典中的任何一个词汇都是由“其他词汇”解释或定义的,但是“其他词汇”在被定义或解释时又会间接或直接地用到那些由它们定义的词递归方法的基本原理将复杂问题逐步化简,最终转化为一个最简单(jindn)的问题最简单(jindn)问题的解决就意味着整个问题

19、的解决 第28页/共66页第二十八页,共67页。递归函数(RecursiveFunction)long fact(int n) if (n 0) return -1; else if (n = 0 | n = 1) return 1; else return n * fact(n-1); 【例【例7.57.5】计算】计算(j sun)n(j sun)n!= n *(n-= n *(n-1)*(n-2)*1 1)*(n-2)*1 函数直接或间接调用自函数直接或间接调用自己己(zj),称为递归调,称为递归调用(用(Recursive Call)第29页/共66页第二十九页,共67页。递归函数(Re

20、cursiveFunction)unsigned long fact(unsigned int n) if (n = 0 | n = 1) return 1;else return n * fact(n-1); 基线基线(jxi(jxi n)n)情况情况(base (base case)case)一般一般(ybn)(ybn)情况情况(general case)(general case)无需无需(wx)考考虑虑n0了了【例例7.57.5】计算计算n!= n *(n-1)*(n-2)*1 第30页/共66页第三十页,共67页。递归函数(RecursiveFunction)递归调用应该能够在有限次

21、数内终止递归递归调用若不加以限制,将无限循环调用必须在函数内部加控制语句,仅当满足一定条件时,递归终止,称为条件递归任何一个递归调用程序必须包括两部分递归循环继续(jx)的过程递归调用结束的过程 if (递归终止条件递归终止条件(tiojin)成立成立) return 递归公式的初值递归公式的初值; else return 递归函数调用返回的结果递归函数调用返回的结果值值; 第31页/共66页第三十一页,共67页。n!=n(n-1)! (n-1)!=(n-1)(n-2)! (n-2)! (n-3)! 5! 4!=43! 3!=32! 2!=21! 1!=1回推过程(guchng)递推过程(gu

22、chng)每个递归函数必须至少有一每个递归函数必须至少有一每个递归函数必须至少有一每个递归函数必须至少有一个基线条件个基线条件个基线条件个基线条件一般一般一般一般(ybn)(ybn)(ybn)(ybn)情况必须最终能情况必须最终能情况必须最终能情况必须最终能简化为基线条件简化为基线条件简化为基线条件简化为基线条件 递归层数太多易递归层数太多易递归层数太多易递归层数太多易导致栈空间溢出导致栈空间溢出导致栈空间溢出导致栈空间溢出后果很严重,程序被异后果很严重,程序被异后果很严重,程序被异后果很严重,程序被异常中止常中止常中止常中止 fact(5)=5*fact(4)= 120 fact(4)= 4

23、*fact(3)= 24 fact(3)= 3*fact(2)= 6 fact(2)= 2*fact(1)=2 fact(1)=1mainmainfact(5)fact(5)fact(4)fact(4)fact(3)fact(3)fact(2)fact(2)fact(1)fact(1)第32页/共66页第三十二页,共67页。递归与迭代(didi)用迭代(即循环)方法编写的阶乘函数unsigned long Fact(unsigned int n) unsigned long result = 1; unsigned int i; for (i = 1; i = n; i+) result *=

24、 i; return result;递归程序遵循了数学中对阶乘的定义因此递归方法编写程序具有更清晰(qngx)、可读性更好的优点 第33页/共66页第三十三页,共67页。递归与迭代(didi)1,1,2,3,5,8,.longlong Fib( Fib(intint n) n) longlong f; f;ifif (n = 0) f = 0; (n = 0) f = 0;else ifelse if (n = 1) f = 1; (n = 1) f = 1;else else f = Fib(n-1) + Fib(n-2);f = Fib(n-1) + Fib(n-2);returnretu

25、rn f; f; 1 15 54 43 32 23 32 22 21 11 10 01 10 01 10 0计算计算计算计算fib(5)fib(5)共需共需共需共需1515次次次次fibfib调用调用调用调用【例【例【例【例7.67.67.67.6】计算】计算】计算】计算(j sun)Fibonacci(j sun)Fibonacci(j sun)Fibonacci(j sun)Fibonacci数数数数列列列列 第34页/共66页第三十四页,共67页。递归与迭代(didi)优点:从编程角度来看,比较直观、精炼,逻辑清楚符合人的思维习惯,逼近数学公式的表示尤其适合非数值计算领域(ln y)ha

26、noi塔,骑士游历、八皇后问题(回溯法)缺点:增加了函数调用的开销,每次调用都需要进行参数传递、现场保护等耗费更多的时间和栈空间应尽量用迭代形式替代递归形式第35页/共66页第三十五页,共67页。7.5变量的作用域和存储(cnch)类型7.5.1变量的作用域 ( Scope )指在源程序中定义变量的位置及其能被读写访问的范围(fnwi)分为局部变量(Local Variable) 全局变量(Global Variable )第36页/共66页第三十六页,共67页。局部变量(LocalVariable)在语句块内定义的变量形参也是局部变量特点生存期是该语句块,进入语句块时获得内存,仅能由语句块内

27、语句访问,退出语句块时释放(shfng)内存,不再有效定义时不会自动初始化,除非程序员指定初值并列语句块各自定义的同名变量互不干扰 形参和实参可以同名第37页/共66页第三十七页,共67页。全局变量(GlobalVariable)在所有函数之外定义的变量生存期是整个程序,从程序运行起占据内存,程序运行过程中可随时访问,程序退出时释放(shfng)内存有效范围是从定义变量的位置开始到本程序结束第38页/共66页第三十八页,共67页。全局变量(GlobalVariable)【例7.7】打印计算Fibonacci数列每一项时所需的递归调用(dioyng)次数 全局变量使函数间的数据交换更容易全局变量

28、使函数间的数据交换更容易(rngy),更高效,但建议尽量少用,因为谁都可改写它,更高效,但建议尽量少用,因为谁都可改写它,所以很难确定是谁改写了它所以很难确定是谁改写了它全局变量全局变量第39页/共66页第三十九页,共67页。7.5.2变量(binling)的存储类型(StorageClass)指数据在内存(ni cn)中存储的方式即编译器为变量分配内存(ni cn)的方式,它决定变量的生存期 存储类型 数据类型 变量名;C程序的存储类别auto型(自动变量)static型(静态变量)extern型(外部变量)register型(寄存器变量)第40页/共66页第四十页,共67页。静态存储静态存

29、储(cn ch)区中的变量:与程序区中的变量:与程序“共存亡共存亡” 动态存储动态存储(cn ch)区中的变量:与程序块区中的变量:与程序块“共存共存亡亡” 寄存器中的变量:寄存器中的变量: 同动态存储同动态存储(cn ch)区区变量的生存期(Lifetime )决定(judng)何时“生”,何时“灭”7.5.27.5.2变量的存储变量的存储(cn ch)(cn ch)类型(类型( Storage ClassStorage Class)第41页/共66页第四十一页,共67页。 auto 数据类型 变量名;auto体现在进入语句块时自动申请内存(ni cn),退出时自动释放内存(ni cn)动态

30、局部变量,缺省的存储类型静态变量 static 数据类型 变量名;static storage class for local variables (declared inside a block or function) - the lifetime of the entire program生存期为整个程序运行期间自动自动(zdng)变量和静态变量变量和静态变量第42页/共66页第四十二页,共67页。自动自动(zdng)变量和静态变量变量和静态变量【例例例例7.97.97.97.9】自动变量不初始化时,值自动变量不初始化时,值是随机是随机(su(su j) j)值,静态值,静态局部变量和全

31、局变量自动局部变量和全局变量自动初始化为初始化为0 0值值第43页/共66页第四十三页,共67页。【例7.10】利用(lyng)静态变量计算整数n的阶乘n! 自动自动(zdng)变量和静态变量变量和静态变量静态变量静态变量(bi(bi nlinli ng)ng)仅仅初始化一次,变量初始化一次,变量(bi(bi nlinli ng)ng)的值可保存的值可保存到下次进入函数,使函到下次进入函数,使函数具有记忆功能数具有记忆功能第44页/共66页第四十四页,共67页。寄存器变量(binling)寄存器CPU内部(nib)容量有限、但速度极快的存储器 register 类型名 变量名; 使用频率比较高

32、的变量声明为register ,可使程序更小、执行速度更快现代编译器有能力自动把普通变量优化为寄存器变量,并且可以忽略用户的指定所以一般无须特别声明变量为register 第45页/共66页第四十五页,共67页。全局变量全局变量静态外部变量静态外部变量 (只限本文件(只限本文件(wnjin)(wnjin)使用)使用)外部变量外部变量(binling) (binling) (非静态外部变量(非静态外部变量(binling)(binling),允许其他文件引用)允许其他文件引用)局部变量局部变量 自动变量,(离开(l ki)函数,值就消失)寄存器变量寄存器变量(离开函数,值就消失)(离开函数,值就

33、消失)定义点之前定义点之前使用,需用使用,需用extern声明声明静态局部变量静态局部变量 (离开函数,值仍保留)(离开函数,值仍保留)动态局部变量动态局部变量7.57.5变量的作用域和存储类型变量的作用域和存储类型变量的作用域和存储类型变量的作用域和存储类型第46页/共66页第四十六页,共67页。7.6模块化程序设计(chnxshj)模块各司其职每个模块只负责一件事情,它可以更专心便于进行单个模块的设计、开发、调试、测试和维护等工作一个模块一个模块地完成,最后再将它们集成开发人员各司其职按模块分配任务,职责(zhz)明确并行开发,缩短开发时间什么时候需要模块化?某一功能,如果重复实现3遍以上

34、,即应考虑模块化,将它写成通用函数,并向小组成员发布第47页/共66页第四十七页,共67页。7.6模块化程序设计(chnxshj)模块化的优点复用构建新的软件系统可以不必每次从零做起,直接使用已有的经过反复验证的软构件,组装或加以合理修改后成为新的系统,提高软件生产率和程序质量在其他函数的基础上构造程序拿来拿去主义,指尽可能复用其他人现成的模块不是人类懒惰的表现,而是智慧的表现一般要靠日积月累才能建立可以被复用的软件库前期投入多,缺乏近期(jn q)效益,大部分公司都注重近期(jn q)效益,是为了生存,所以软件复用对公司来说不是最高优先级第48页/共66页第四十八页,共67页。7.6模块化程

35、序设计(chnxshj)功能分解自顶向下、逐步求精的过程模块分解的基本原则保证模块的相对独立性高聚合、低耦合模块的实现细节对外不可见信息隐藏外部:关心做什么;内部:关心怎么做设计好模块接口接口指罗列出一个模块的所有的与外部打交道的变量等 定义好后不要轻易(qng y)改动在模块开头(文件的开头)进行函数声明第49页/共66页第四十九页,共67页。7.6模块化程序设计(chnxshj)逐步求精(Stepwise Refinement)由不断(bdun)的自底向上修正所补充的自顶向下(Top-down)的程序设计方法第50页/共66页第五十页,共67页。【例7.11】用函数(hnsh)完成猜数游戏

36、猜多个数,10次猜不对就猜下一个数模块(m kui)分解过程 开始开始开始开始(kish)(kish)结束结束结束结束初始化初始化初始化初始化退出处理退出处理退出处理退出处理主功能主功能主功能主功能为程序运行所做为程序运行所做的准备工作的准备工作在退出前要做的事在退出前要做的事情,如打印结果、情,如打印结果、资源释放等资源释放等自底向上自底向上自顶向下的模块化程序设计自顶向下的模块化程序设计第51页/共66页第五十一页,共67页。【例7.11】用函数(hnsh)完成猜数游戏开始开始开始开始(kish)(kish)结束结束结束结束(jish)(jish)生成数字生成数字生成数字生成数字猜数字猜数

37、字猜数字猜数字第52页/共66页第五十二页,共67页。【例7.11】用函数完成(wnchng)猜数游戏开始开始开始开始(kish)(kish)结束结束结束结束(jish)(jish)生成数字生成数字生成数字生成数字猜数字猜数字猜数字猜数字是否继续?是否继续?是否继续?是否继续?N NY Y第53页/共66页第五十三页,共67页。【例7.11】用函数完成(wnchng)猜数游戏开始开始开始开始(kish)(kish)结束结束结束结束(jish)(jish)猜得对吗?猜得对吗?猜得对吗?猜得对吗?N NY Y提示大小提示大小提示大小提示大小次数次数次数次数10= MIN_NUMBER & numb

38、er = MAX_NUMBER); return number; 使用断言(使用断言(使用断言(使用断言(AssertAssertAssertAssert)防止某些参数获得)防止某些参数获得)防止某些参数获得)防止某些参数获得(hud)(hud)(hud)(hud)非法值,非法值,非法值,非法值,在程序调试和测试时发现错误在程序调试和测试时发现错误在程序调试和测试时发现错误在程序调试和测试时发现错误 第58页/共66页第五十八页,共67页。 #include void assert(int expression);expression为真,无声无息;为假,中断程序断言仅用于调试程序,不能作为(

39、zuwi)程序的功能 断言断言(dunyn) 用来测试某种不可能发生的状况确实不会发生用来测试某种不可能发生的状况确实不会发生用来测试某种不可能发生的状况确实不会发生用来测试某种不可能发生的状况确实不会发生 DebugDebugDebugDebug版有效版有效版有效版有效 ReleaseReleaseReleaseRelease版失效版失效版失效版失效 考虑使用断言的几种情况考虑使用断言的几种情况考虑使用断言的几种情况考虑使用断言的几种情况 检查程序中的各种检查程序中的各种检查程序中的各种检查程序中的各种( zhn)( zhn)( zhn)( zhn)假设的正确性假设的正确性假设的正确性假设的

40、正确性 证实或测试某种不可能发生的状况确实不会发生证实或测试某种不可能发生的状况确实不会发生证实或测试某种不可能发生的状况确实不会发生证实或测试某种不可能发生的状况确实不会发生 第59页/共66页第五十九页,共67页。程序(chngx)版式缩进(Indent)保证代码整洁、层次清晰的主要手段良好(lingho)风格的程序应严格采用梯形层次对应好各层次intint IsPrime( IsPrime(intint n) n) intint k, i; k, i; k = sqrt( k = sqrt(doubledouble)n);)n); forfor (i=2; i=k; i+) (i=2;

41、i=k; i+) ifif (n % i = 0) (n % i = 0) returnreturn 0; 0; returnreturn 1; 1; # #includeinclude main()main() intint i; i; forfor (i=2; i100; i+) (i=2; i100; i+) ifif (IsPrime(i) (IsPrime(i) printf(%dt,i); printf(%dt,i); 第60页/共66页第六十页,共67页。程序(chngx)版式现在的许多开发环境、编辑软件都支持自动缩进根据用户代码(di m)的输入,智能判断应该缩进还是反缩进,替

42、用户完成调整缩进的工作VC中有自动整理格式功能只要选取需要的代码(di m),按ALT+F8就能自动整理成微软的cpp文件格式第61页/共66页第六十一页,共67页。命名(mngmng)规则在Linux/UNIX平台习惯用function_name本书采用Windows风格函数(hnsh)名命名用大写字母开头、大小写混排的单词组合而成FunctionName变量名形式“名词”或者“形容词+名词”如oldValue与newValue等函数(hnsh)名形式“动词”或者“动词+名词”(动宾词组)如GetMax()等第62页/共66页第六十二页,共67页。对函数接口进行(jnxng)注释说明/* 函

43、数功能(gngnng):实现功能(gngnng) 函数参数:参数1,表示 参数2,表示 函数返回值: */返回值类型 函数名(形参表)return 表达式;第63页/共66页第六十三页,共67页。挑战性的作业挑战类型表示的极限 50位的n!计算?大数(d sh)的存储问题第64页/共66页第六十四页,共67页。Questionsandanswers第65页/共66页第六十五页,共67页。感谢您的欣赏(xnshng)!第66页/共66页第六十六页,共67页。内容(nirng)总结本章学习内容。)声明语句序列。C语言规定函数不能嵌套定义,但可以嵌套调用。使用频率(pnl)比较高的变量声明为register ,可使程序更小、执行速度更快。并行开发,缩短开发时间。模块化的优点复用。保证模块的相对独立性高聚合、低耦合。模块的实现细节对外不可见信息隐藏。在模块开头(文件的开头)进行函数声明。用来测试某种不可能发生的状况确实不会发生。证实或测试某种不可能发生的状况确实不会发生。感谢您的欣赏第六十七页,共67页。

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

最新文档


当前位置:首页 > 高等教育 > 研究生课件

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