大连理工大学c语言第8章函数.ppt_第1页
大连理工大学c语言第8章函数.ppt_第2页
大连理工大学c语言第8章函数.ppt_第3页
大连理工大学c语言第8章函数.ppt_第4页
大连理工大学c语言第8章函数.ppt_第5页
已阅读5页,还剩17页未读, 继续免费阅读

下载本文档

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

文档简介

1 1 函数的嵌套调用 C语言函数定义是互相平行的 独立的 在定义函数时 一个函数不能包含另一个函数 不能嵌套定义 C语言可以嵌套调用函数 在调用一个函数的过程中 又调用一个函数 例8 对被调用的函数作声明 includevoidmain floatadd floatx floaty floatz z x y return z floata b c scanf f f 2 2 8 6函数的递归调用 在调用一个函数的过程中又出现直接或间接地调用该函数本身 称为函数的递归调用 语言的特点之一就在于允许函数的递归调用 f函数调用f函数 f1函数f2函数调用f2函数调用f1函数 直接调用 间接调用 3 8 6函数的递归调用 例8 7有 个人坐在一起 问第 个人多少岁 他说比第 个人大 岁 问第 个人岁数 他说比第 个人大 岁 问第 个人 又说比第 个人大 岁 问第 个人 说比第 个人大 岁 最后问第 个人 他说是 岁 请问第 个人多大 分析 定义函数age n age 5 age 4 2age 4 age 3 2age 3 age 2 2age 2 age 1 2age 1 10用数学公式表述如下 10n 1age n age n 1 2n 1 回推大到小 递推小到大 4 可以用一个函数来描述上述递归过程 intage intn 求年龄的递归函数 int c用作存放函数的返回值的变量 if n 1 c 10 elsec age n 1 2 return c 运行结果如下 18 用一个主函数调用age函数 求得第5人的年龄 includevoidmain printf d age 8 6函数的递归调用 10n 1age n age n 1 2n 1 回推 递推 5 例8 用递归方法求 1 2 3 n 用循环方法 includevoidmain intn 4 a 1 i for i 1 i 4 i a a i printf d a 8 6函数的递归调用 6 例8 用递归方法求 求 也可以用递归方法 即4 等于3 4 而3 2 3 可用下面的递归公式表示 1n 0 1n n n 1 n 1 8 6函数的递归调用 1n 0 1f n n f n 1 n 1 7 includevoidmain floatfac intn intn floaty printf inputanintegernumber scanf d 1n 0 1f n n f n 1 n 1 8 Hanoi 汉诺 塔问题 汉诺塔是源自印度神话里的玩具上帝创造世界的时候做了三根金刚石柱子 在一根柱子上从下往上按大小顺序摞着64片黄金圆盘 上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上 并且规定 在小圆盘上不能放大圆盘 在三根柱子之间一次只能移动一个圆盘 有预言说 这件事完成时宇宙会在一瞬间闪电式毁灭 也有人相信婆罗门至今还在一刻不停地搬动着圆盘 9 移动1个圆盘的时候2的1次方减11次 a c 2个圆盘的时候2的2次方减13次 a ba cb c 3个圆盘的时候2的3次方减17次 a ca bc ba cb ab ca c 4个圆盘的时候2的4次方减115次5个圆盘的时候2的5次方减131次 n个圆盘的时候2的n次方减1 如果移动一个圆盘需要1秒钟的话 等到64个圆盘全部重新落在一起 也就是说 n 64的时候是 2的64次方减1 次 2的64次方减1到底有多大呢 动动计算器 答案是一个二十位的数字 18446744073709551615用一年 60秒x60分x24小时x365天来算的话 大约有5800亿年吧 据说 现在的宇宙年龄大约是150亿年 还差得远呢 10 分析问题 找出移动盘子的正确算法 首先考虑a杆下面的盘子而非杆上最上面的盘子 于是任务变成了 将上面的63个盘子移到b杆上 将a杆上剩下的盘子移到c杆上 将b杆上的全部盘子移到c杆上 将这个过程继续下去 就是要先完成移动63个盘子 62个盘子 61个盘子 的工作 11 为了更清楚地描述算法 可以定义一个函数movedisc n one two there 该函数的功能是 将N个盘子从one杆上借助two杆移动到three杆上 这样移动N个盘子的工作就可以按照以下过程进行 1 movedisc n 1 one three two 2 将一个盘子从a移动到c上 3 movedisc n 1 two one three 重复以上过程 直到将全部的盘子移动到位时为止 分析问题 找出移动盘子的正确算法 首先考虑a杆下面的盘子而非杆上最上面的盘子 于是任务变成了 将上面的63个盘子移到b杆上 将a杆上剩下的盘子移到c杆上 将b杆上的全部盘子移到c杆上 将这个过程继续下去 就是要先完成移动63个盘子 62个盘子 61个盘子 的工作 12 12 例8 9Hanoi 汉诺塔 问题 includevoidmain voidhanoi intn charone chartwo charthree intm printf inputthenumberofdiskes scanf d voidhanoi intn charone chartwo charthree voidmove charx chary if n 1 move one three else hanoi n 1 one three two move one three hanoi n 1 two one three 运行情况如下 inputthenumberofdiskes 3 Thestepstonoving3diskes Hanoi 2 A C B Hanoi 2 B A C 13 includevoidmove charx chary cout y endl voidhanoi intn charone chartwo charthree if n 1 move one three cout 00000000 else hanoi n 1 one three two cout 11111111 move one three cout 22222222 hanoi n 1 two one three cout 33333333 voidmain intm cout m hanoi m A B C 3 2 A B C A C B 2 A C B 1 A B C 1 A B C 14 14 8 7数组作为函数参数 1数组元素作函数实参 由于实参可以是表达式 而数组元素可以是表达式的组成部分 因此数组元素可以作为函数的实参 与用变量作实参一样 是单向传递 即 值传送 方式 例8 10有两个数组 和 各有 个元素 将它们对应地逐个相比 即 与 比 与 比 如果 数组中的元素大于 数组中的相应元素的数目多于b数组中元素大于a数组中相应元素的数目 例如 a i b i 6次 b i a i 3次 其中i每次为不同的值 则认为a数组大于b数组 并分别统计出两个数组相应元素大于 等于 小于的次数 15 15 例8 10 intlarge intx inty intflag if x y flag 1 elseif x y flag 1 elseflag 0 return flag 16 16 includevoidmain intlarge intx inty inta 10 b 10 i n 0 m 0 k 0 printf enterarraya n for i 0 ib i dtimes na i b i dtimes na i k printf arrayaislargerthanarrayb n elseif n k printf arrayaissmallerthanarrayb n elseprintf arrayaisequaltoarrayb n intlarge intx inty intflag if x y flag 1 elseif x y flag 1 elseflag 0 return flag 运行情况如下 enterarraya 1357986420 enterarrayb 5389 1 35604 a i b i timesa i b i timesa i b i timesarrayaissmallerthannarrayb 17 17 8 7数组作为函数参数 2数组名作函数参数 用数组名作函数参数时 此时形参应当用数组名或用指针变量 例8 11有一个一维数组score 内放10个学生成绩 求平均成绩 includevoidmain floataverage floatarray 10 floatscore 10 aver inti printf input10scores n for i 0 i 10 i scanf f floataverage floatarray 10 int floataver for return aver 运行情况如下 input10scores 100567898 57687996 57597 averagescoreis83 40 不是 score 10 18 18 例8 12形参数组不定义长度 includevoidmain floataverage floatarray intn floatscore 1 5 98 5 97 91 5 60 55 floatscore 2 10 67 5 89 5 99 69 5 77 89 5 76 5 54 60 99 5 printf theaverageofclassAis 6 2f n average score 1 5 printf theaverageofclassBis 6 2f n average score 2 10 floataverage floatarray intn inti floataver sum array 0 for i 1 i n i sum sum array i aver sum n return aver 运行结果如下 theaverageofclassAis80 40Theaverageofclass is78 20 floataverage floatarray 10 int floataver for return aver 只能求固定大小的数组平均值 数组大小可变 19 19 例8 13用选择法对数组中5个整数按由小到大排序 所谓选择法就是先将5个数中最小的数与a 0 对换 再将a 1 到a 4 中最小的数与a 1 对换 每比较一轮 找出一个未经排序的数中最小的一个 未排序时的情况 a 0 a 1 a 2 a 3 a 4 36194将5个数中最小的数1与a 0 对换 16394将余下的4个数中最小的数3与a 1 对换13694将余下的3个数中最小的数4与a 2 对换13496将余下的2个数中最小的数6与a 3 对换13469 共比较4轮 n 1第一轮比较4次 第二轮比较3次 第三轮比较2次 第四轮比较1次 第i轮比较n i次 20 20 例8 13用选择法对数组中10个整数按由小到大排序 includevoidmain voidsort intarray intn inta 10 i printf enterthearray n for i 0 i 10 i scanf d voidsort intarray intn inti j k t for i 0 i n 1 i k i k为当前最小数的下标for j i 1 j n j if array j array k k j t array k array k array i array i t 共比较4轮 n 1第一轮比较4次 第二轮比较3次 第三轮比较2次 第四轮比较1次 第i轮比较n i次 a 0 a 1 a 2 a 3 a 4 36194 21 21 8 7数组作为函数参数 3多维数组名作函数参数 用多维数组名作为函数实参和形参

温馨提示

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

评论

0/150

提交评论