资源预览内容
第1页 / 共95页
第2页 / 共95页
第3页 / 共95页
第4页 / 共95页
第5页 / 共95页
第6页 / 共95页
第7页 / 共95页
第8页 / 共95页
第9页 / 共95页
第10页 / 共95页
亲,该文档总共95页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第7章 函数杨铭信息学院本章学习内容 函数定义、函数调用、函数原型、函数的参 数传递与返回值 递归函数和函数的递归调用 函数封装,函数复用,函数设计的基本原则 ,程序的健壮性 变量的作用域与存储类型,全局变量、自动 变量、静态变量、寄存器变量 “自顶向下、逐步求精”的模块化程序设计 方法 2大话三国 三国演义中有这样一段描写: 懿问曰:“孔明寝食及事之烦简若何?”使者 曰:“丞相夙兴夜寐,罚二十以上皆亲览焉。 所啖之食,日不过数升。”懿顾谓诸将曰:“ 孔明食少事烦,其能久乎?” 此话音落不久,诸葛亮果然病故于五丈原。 “事无巨细”,“事必躬亲” 管理学的观点是极其排斥这种做法的,认为工 作必须分工,各司其职 其中的思想,在程序设计里也适用 3请问: 读多少行的程序能让你不头疼? 假如系统提供的函数printf()由10行代码 替换,那么你编过的程序会成什么样子? 实际上一个printf()有上千行代码 main()中能放多少行代码? 如果所有代码都在main()中,怎么团队合 作? 如果代码都在一个文件中,怎么团队合作?4数学中的函数自变量因变量函数名程序设计中的函数程序设计中的函数 程序设计中的函数不局限于计算程序设计中的函数不局限于计算计算类,如打印阶乘表的程序计算类,如打印阶乘表的程序 判断推理类,如排序、查找判断推理类,如排序、查找 57.1 Why do we need function 分而治之( Divide and Conquer,Wirth, 1971 ) 函数把较大的任务分解成若干个较小的任务,并 提炼出公用任务 信息隐藏(Information Hiding, Parnas, 1972) 设计得当的函数可把具体操作细节对外界隐藏起 来,从而使整个程序结构清楚 使用函数时,不用知道函数内部是如何运作的, 只按照我们的需要和它的参数形式调用它即可6Function is powerful7 函数是C语言中模块化编程的最小单位 可以把每个函数看作一个模块( Module ) 如把编程比做制造一台机器,函数就好比其 零部件 可将这些“零部件”单独设计、调试、测试好, 用时拿出来装配,再总体调试。 这些“零部件”可以是自己设计制造/别人设计 制造/现成的标准产品7.2 7.2 函数(函数(FunctionFunction)的定义)的定义MoeCurlyLarry87.2 函数(Function)的定义 若干相关的函数可以合并成一个“模块 ” 一个C程序由一个或多个源程序文件组成 一个源程序文件由一个或多个函数组成9程序中各个函数的关系 函数生来都是平等的,互相独立的,没有 高低贵贱和从属之分 main()稍微特殊一点点 C程序的执行从main函数开始 调用其他函数后,流程回到main函数 在main函数中结束整个程序运行107.2.1函数的分类 标准库函数 ANSI/ISO C定义的标准库函数 符合标准的C语言编译器必须提供这些函数 函数的行为也要符合ANSI/ISO C的定义 第三方库函数 由其他厂商自行开发的C语言函数库 不在标准范围内,能扩充C语言的功能(图形、网络 、数据库等) 自定义函数 自己定义的函数 包装后,也可成为函数库,供别人使用117.2.2函数的定义 (Function Definition)类型 函数名(类型 参数1, 类型 参数2, ) 声明语句序列可执行语句序列 return 表达式; 返回值 类型函数名标识符, 说明运算规则参数表相当于 运算的操作数返回运算的结果函数出口12类型 函数名(类型 参数1, 类型 参数2, ) 声明语句序列可执行语句序列 return 表达式; 函数体的定界符参数表里的变量(叫形式参数, Formal Parameter)也是内部变量函数体7.2.27.2.2函数的定义函数的定义 (Function DefinitionFunction Definition)1314void 函数名 (void) 声明语句序列可执行语句序列 return; 函数无返回值 ,用void定义 返回值类型用void定义参数,表 示没有参数return语句后无 需任何表达式7.2.27.2.2函数的定义函数的定义 (Function DefinitionFunction Definition)1516【例7.1a】 计算整数n的阶乘n! /* 函数功能: 用迭代法计算n!函数入口参数: 整型变量n表示阶乘的阶数函数返回值: 返回n!的值 */ long Fact(int n) /* 函数定义 */ int i;long result = 1;for (i=2; i void assert(int expression); expression为真,无声无息;为假,中断程序 断言仅用于调试程序,不能作为程序的功能 【例例7.27.2】计算整数计算整数n n的阶乘的阶乘n n!39 用来测试某种不可能发生的状况确实不会发生 Debug版有效 Release版失效 考虑使用断言的几种情况 检查函数入口参数的合法性 在一段计算的结束处检验计算结果是否在合理的范围内 检查程序中的各种假设的正确性 证实或测试某种不可能发生的状况确实不会发生 断言(断言(AssertAssert)407.3.4函数设计的基本原则 指导思想:信息隐藏1函数规模 要小2函数功能要单一3函数接口 定义要清楚入口参数有效性检查敏感操作前的检查调用成功与否的检查41本章学习内容 函数定义、函数调用、函数原型、函数的参 数传递与返回值 函数封装,函数复用,函数设计的基本原则 ,程序的健壮性 递归函数和函数的递归调用 变量的作用域与存储类型,全局变量、自动 变量、静态变量、寄存器变量 “自顶向下、逐步求精”的模块化程序设计 方法 42函数的嵌套调用函数的嵌套调用 嵌套调用嵌套调用 在调用一个函数的过程中,又调用另一个函数在调用一个函数的过程中,又调用另一个函数 C C语言规定函数不能嵌套定义,但可以嵌套调用语言规定函数不能嵌套定义,但可以嵌套调用 函数之间的关系是相互平行的函数之间的关系是相互平行的 main() a();a 函数 b(); return; b函数 return; 437.4 递归函数(Recursive Function)7.4.1递归问题的提出 经典的汉诺塔(Hanoi)问题447.4 递归函数(Recursive Function)7.4.1递归问题的提出 经典的汉诺塔(Hanoi)问题 理解递归的概念 有人曾计算过,当n=64时,所需移动的次数 为18446744073709551615,即1844亿亿次 若按每次耗时1微秒计算,则完成64个圆盘的 移动将需要60万年45汉诺塔(Hanoi)问题AB,AC,BC, AB,CA,CB,ABA AB BC Cn n=3=346汉诺塔(Hanoi)问题A AB BC CABAB,ACAC,BCBC, ABAB,CACA,CBCB,ABABn n=3=347汉诺塔(Hanoi)问题A AB BC CABAB,ACAC,BCBC, ABAB,CACA,CBCB,ABABn n=3=348汉诺塔(Hanoi)问题A AB BC CABAB,ACAC,BCBC, ABAB,CACA,CBCB,ABABn n=3=349汉诺塔(Hanoi)问题A AB BC Cn更大些 怎么办?ABAB,ACAC,BCBC, ABAB,CACA,CBCB,ABABn n=3=350汉诺塔(Hanoi)问题 第1步:将问题简化 假设A杆上只有2个圆盘,即汉诺塔有2层,n2 将1号圆盘从A移到C 将2号圆盘从A移到B 将1号圆盘从C移到B A AB BC C51汉诺塔(Hanoi)问题 第2步:对于一个有 n(n1)个圆盘的汉诺塔,将n个圆盘 分为两部分:上面 n-1 个圆盘和最下面的n号圆盘。将“上 面n-1个圆盘”看成一个整体 将n-1个圆盘从A移到C 将n号圆盘从A移到B 将n-1个圆盘从C移到BAC CB52汉诺塔(Hanoi)问题 设计2个函数: 将n个圆盘借助C从A移到B 将一个圆盘从A移到B AC CB 将将n n- -1 1个圆盘从个圆盘从A A移到移到C C 将将n n号圆盘从号圆盘从A A移到移到B B 将将n n- -1 1个圆盘从个圆盘从C C移到移到B B53汉诺塔(Hanoi)问题 递归方法的基本原理递归方法的基本原理 将复杂问题逐步化简,最终转化为一个最简单将复杂问题逐步化简,最终转化为一个最简单 的问题的问题 最简单问题的解决就意味着整个问题的解决最简单问题的解决就意味着整个问题的解决 54汉诺塔(Hanoi)问题557.4.2递归函数long fact(int n) if (n 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); 90程序版式 现在的许多开发环境、编辑软件都支持自动缩进 根据用户代码的输入,智能判断应该缩进还是反缩进,替用户完成调整缩进的工作 VC中有自动整理格式功能 只要选取需要的代码,按ALT+F8就能自动整理成微软的cpp文件格式91命名规则 在Linux/UNIX平台 习惯用function_name 本书采用Windows风格函数名命名 用大写字母开头、大小写混排的单词组合而成 FunctionName 变量名形式 “名词”或者“形容词+名词” 如oldValue与newValue等 函数名形式 “动词”或者“动词+名词”(动宾词组) 如GetMax()等 92对函数接口进行注释说明 /* 函数功能:实现功能函数参数:参数1,表示参数2,表示函数返回值: */ 返回值类型 函数名(形参表) return 表达式; 93 挑战性的作业 挑战类型表示的极限 50位的n!计算? 大数的存储问题94 Questions and answers95
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号