已阅读5页,还剩71页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十二讲 Begin 第七章函数 数组作为函数的参数函数的嵌套调用函数的递归调用函数变量的作用域 数组元素做函数实参 遵循 值传送 特性 此时形参为变量 数组名可做实参和形参 传送的是整个数组 在用数组名做函数参数时 实参和形参都应该用数组 或指针变量 数组作为函数的参数 7 1 7数组作为函数的参数 数组元素作为函数参数举例 1 7 1 7数组作为函数的参数 2 7 1 7数组作为函数的参数 数组名作函数参数时应注意 1 数组名作函数参数时 应在主调函数和被调函数中分别定义数组 2 实参数组与形参数组的类型必须相同 但大小可以不同 3 形参数组的一维下标可以省略 4 数组名表示的是数组元素的首地址 数组名作函数参数时 传递的是整个数组 实参与形参之间的数据传递是地址传递 7 1 7数组作为函数的参数 数组名作函数的参数举例 7 1 7数组作为函数的参数 例利用数组换数 voidhuanshu2 intshuzu intn main 主函数 intab 2 5 10 i for i 0 i 2 i printf 1 ab d 2d i ab i huanshu2 ab 2 printf n for i 0 i 2 i printf 4 ab d 2d i ab i 7 1 7数组作为函数的参数 voidhuanshu2 intshuzu intn intt i printf n for i 0 i n i printf 2 shuzu d 2d i shuzu i for i 0 i n 1 i t shuzu i shuzu i shuzu i 1 shuzu i 1 t printf n for i 0 i n i printf 3 shuzu d 2d i shuzu i 7 1 7数组作为函数的参数 说明 ab shuzu 2000H intab 2 5 10 huanshu2 ab 2 for i 0 i n 1 i k shuzu i shuzu i shuzu i 1 shuzu i 1 k 7 1 7数组作为函数的参数 参数传递小结 7 1 7数组作为函数的参数 嵌套调用 在一个函数调用过程中又调用另一个函数 C语言中 函数的定义是独立的 各函数均处于平行的关系 理论上 任何一个函数都可调用其他的函数 甚至调用它本身 main为例外已强调过多次 由于一个大的问题往往会被逐步分解为不同层次的许多函数 因此 对函数的嵌套调用将不可避免 并大量存在 原则上 C语言对函数的嵌套调用深度并未刻意加以限制 7 2 1函数的嵌套调用 main函数a函数b函数调用a函数调用b函数结束 7 2 1函数的嵌套调用 7 2 1函数的嵌套调用 嵌套调用 在一个函数调用过程中又调用另一个函数 例嵌套调用 qian1 intx inty intc s t s x y t x y c qian2 s t return c printf c d n c qian2 intx inty return x y main inta 1 b 2 c c 2 qian1 a b printf c d n c 例统计字符个数 include stdio h longcountch 利用函数原型声明函数 main longn n countch printf n ld n n longcountch longcn for cn 0 getchar n cn returncn 7 2 1函数的嵌套调用 例连接两个字符串 include stdio h intchdu charx 函数原型声明 voidlianjie charx chary main chara 100 b 20 inti k gets a gets b lianjie a b puts a intchdu charc 100 测试字符串长度 intk for k 0 c k 0 k returnk voidlianjie charx chary 连接字符串 intk m k chdu x for m 0 y m 0 m x k m y m x k m 0 7 2 1函数的嵌套调用 例输入两个数 求它们的和 差 积 商 main floatx y floatadd float float min float float mul float float div float float printf Pleaseinputtwonumbers scanf f f 7 2 1函数的嵌套调用 floatadd floatxx floatyy floatzz zz xx yy return zz floatmin floatxx floatyy floatzz zz xx yy return zz 7 2 1函数的嵌套调用 递归调用 在调用一个函数的过程中又出现直接或间接地调用该函数本身 这样的调用称为递归调用 递归调用必须可以满足一定条件时结束递归调用 否则无限地递归调用将导致程序无法结束 7 2 2函数的递归调用 数学函数中有一些是采用递推形式定义的例如求一个数n的阶乘1当n 1n n n 1 当n 1从以上定义看 求解n 使用了 n 1 也即要计算n 必须先计算 n 1 要计算 n 1 必须先计算 n 2 依次类推 直至1 1 再以此为基础 返回来计算2 3 4 n 7 2 2函数的递归调用 fac n fac n 1 fac 2 fac 1 fac n 1 fac n 2 fac 1 7 2 2函数的递归调用 如果求数n的阶乘的函数名为fac int 则有 例使用递归算法编写计算n 的函数 longfac intn if n 1 return1 elsereturnn fac n 1 voidmain intm scanf d 7 2 2函数的递归调用 例 求Fibonacci数列前20项 分析 该数列第一项为1 第二项为1 从第三项起为前两项的和 11235 程序如下 includevoidmain inti intf 20 1 1 for i 2 i 20 i f i f i 2 f i 1 for i 2 i 20 i if i 5 0 printf n printf 12d f i 例用递归编程 计算Fibonacci 斐波拉契 数列 longfib intn if n 2 return fib n 1 fib n 2 elsereturn 1 main printf ld n fib 6 分析 fib 5 fib 4 fib 4 fib 3 fib 3 fib 2 fib 2 fib 1 fib 3 4 fib 4 6 fib 5 10 fib 6 16 7 2 2函数的递归调用 递归函数的结构十分简练 构造递归函数的关键是找到适当的递归算法和终结条件 因为递推的过程不能无限制地进行下去 必须要有一个结束此过程的条件 在上例求n 的过程中 1 1就是这样的结束递推过程的条件 递归函数最典型的例子是Hanoi塔问题 它能较好地显示出函数递归调用的作用 7 2 2函数的递归调用 例汉诺 Hanoi 塔问题是一个古老的数学问题 在一个塔座 设为塔1 上有若干片盘片 盘片大小各不相等 按大盘在下 小盘在上的顺序叠放 现要将其移放至另一个塔座 设为塔2 上去 问 仅依靠一个附加的塔座 设为塔3 在每次仅只能搬动一片盘片 且在整个移动过程中始终保持每座塔座上的盘片均为大盘在下 小盘在上的叠放方式 能做到么 如何移法 7 2 2函数的递归调用 对此问题 一个想法是采用递归的方法 移动n个圆盘可以看成由移动n 1个圆盘来完成 这就是递归 借助塔2 将n 1个圆盘从塔1移动了塔3 将最大的一片圆盘 第n个圆盘 从塔1移动了塔2 借助塔1 将n 1个圆盘从塔3移动了塔2 重复上述步骤 直到完成最后一个操作 移动n 1个圆盘 7 2 2函数的递归调用 对于数量不等的圆盘 设为n片 只要能将除最下面最大的一片圆盘外 其余的盘片 n 1片 移至塔3座上 剩下一片就可直接移至塔2上 其余的 n 1片 盘片既能从塔1移至塔3 自然也可照理从塔3移至塔2 问题就解决了 每次使用同样的办法解决最下面最大一片圆盘的移动问题 一次次搬下去 直至剩下最后一片圆盘 直接搬到塔2上去就可以了 7 2 2函数的递归调用 这个想法是成立的 也确实是解决此问题的办法 这是典型的递归问题 递归的结束条件是只剩下一片圆盘时 可直接移至目的座 塔2 上 下面是解决汉诺塔的程序 程序能打印出盘片移动过程中的每一搬动步骤 塔座1 2 3分别用字符 1 2 3 表示 表示搬动塔座最上面的一片盘片 7 2 2函数的递归调用 voidhanoita intn charta1 charta2 charta3 函数原型 main intn printf inputthenumberofdiskes scanf d 7 2 2函数的递归调用 voidhanoita intn charta1 charta2 charta3 if n 1 printf c c n tal ta2 一片盘时 直接移动 else hanoita n 1 ta1 ta3 ta2 n 1片盘由ta1座移至ta3座 printf c c n ta1 ta2 最下面最大一片盘 直接移动 hanoita n 1 ta3 ta2 ta1 n 1片盘由ta3座移至ta2座 7 2 2函数的递归调用 例使用递归算法求m和n的最大公约数gcd 分析 求m和n的最大公约数等价于求n与 mmodn 的最大公约数 则有gcd m n 等价于gcd n mmodn 例如 求24和16的最大公约数即求与gcd 16 24mod16 的最大公约数为gcd 16 8 又等价于gcd 8 16mod8 为gcd 8 0 此时n为零 m即为最大公约数 7 2 2函数的递归调用 include includevoidmain floatgcd m n g printf nInputm n n scanf f f 程序如下 7 2 2函数的递归调用 floatgcd a b floata b if b 0 return a elsereturn gcd b fmod a b 7 2 2函数的递归调用 变量的作用范围也称变量的作用域 即变量可以存储或访问的范围 变量的作用域是指变量的 可见性 变量的作用范围 7 3 1变量的作用域 局部变量 在一个函数内部定义的变量 局部变量的作用范围仅限于本函数 即只有在本函数内才能使用它们 其他函数不能使用它们 说明 不同函数中可以使用相同名字的变量 它们代表不同的对象 互不干扰 形参也是局部变量 可以在一个复合语句中定义变量 这些变量只在本复合语句中有效 1 局部变量 7 3 1变量的作用域 局部变量举例 main intx y floatf1 f2 hanshu intx floaty inta b c 7 3 1变量的作用域 局部变量的使用 说出下列程序的运行结果 includevoidf2 intx inty x y voidf1 intx inty intn 0 f2 x y printf n d x d y d n n x y 7 3 1变量的作用域 voidmain intn 2 a 3 b 4 f1 a b printf n d a d b d n n a b n 0 x 3 y 4n 2 a 3 b 4 7 3 1变量的作用域 全局变量 在函数外定义的变量 也称外部变量 作用范围 从其定义的地方开始直至源程序文件的结束 全局变量通常放在源程序的开始处 全局变量命名时 首字母大写 其余字母小写 2 全局变量 7 3 1变量的作用域 全局变量举例 intAbc D1 main floatf1 f2 floatKa Hc hanshu intx inty doublec e 全局变量Ka Hc的作用域 7 3 1变量的作用域 例 intX 3 intfunc intc 0 c X X 10 return c main intk 2 k func printf 1 d n k k func printf 2 d n k 运行结果 1 32 13 7 3 1变量的作用域 如何得出的 1 c 0 3 3 X 3 10 132 c 0 13 13 X 13 10 23 全局变量的特点 优点 利用全局变量可以从函数中得到一个以上的返回值 利用全局变量可以减少函数中实参和形参的个数 缺点 全局变量在程序运行过程中始终都占用存储单元 而不是在函数被调用时才临时分配存储单元 函数的通用性降低 在同一个源程序中 当全局变量与局部变量同名 在局部变量的作用域内 全局变量不起作用 即全局变量被 屏蔽 7 3 1变量的作用域 例 intM 5 intfun intx inty intM 10 return x y M main inta 7 b 5 printf d n fun a b M 运行结果 5 7 3 1变量的作用域 例已知一个一维数组 用一个函数求数组最大数 最小数和平均数 includeintNum Max Min intaverage intarray inti intarray aver array 0 Max Min array 0 for i 1 iMax Max array i if array i Min Min array i 7 3 1变量的作用域 array aver array i array aver Num returnarray aver voidmain intaver n 5 23 2 4 5 6 Num 5 aver average n printf max d min d average d n Max Min aver 7 3 1变量的作用域 func inta intb intm 0 i 2 i m 1 m i a b returnm main intk 4 m 1 p p func k m printf p d n p p func k m printf p d n p 求程序运行结果 程序运行结果 p 8p 8 函数练习题 程序运行过程 func 4 1 i 3 m 3 4 1 8 1 编写一个计算字符串长度的递归函数 要求 输入一个任意长度的字符串 输出该串的长度 函数练习题 程序 includeinti 0 main intstlen charstr 100 printf Inputstring n gets str strlen str printf Thestringlength d n i intstlen s chars if s i 0 return i else i strlen s 函数练习题 有以下函数定义 voidfun intn doublex 若以下选项中的变量都已正确定义并赋值 则对函数fun的正确调用语句是 A fun intx doublen B m fun 10 12 5 C fun x n D voidfun n x 函数练习题 下面函数f doublex printf 6d n x 的类型为 A 实型B void类型C int类型D A B C均不正确 函数练习题 在函数调用过程中 如果函数A调用了函数B 函数B又调用了函数A 则 A 称为函数的直接递归调用B 称为函数的间接递归调用C 称为函数的循环调用D C语言中不允许这样的递归调用 函数练习题 有以下程序 includefloatfun intx inty return x y main inta 2 b 5 c 8 printf 3 0f n fun int fun a b b a c return 程序运行结果为 A 9 0B 21C 6D 编译出错 函数练习题 已有数组定义inta 3 4 和函数调用语句f a 则在f函数的说明中 对形参数组array的错误定义方式是 A f intarray 6 B f intarray 3 C f intarray 4 D f intarray 2 5 在一个源文件中定义的全局变量的作用域为 A 本文件的全部范围 B 本程序的全部范围 C 本函数的全部范围 D 从定义该变量的位置开始至本文件结束 函数练习题 下列说法中正确的是 A 调用函数时 实参变量与形参变量可以共用内存单元 B 调用函数时 实参的个数 类型和顺序与形参可以不一致 C 调用函数时 形参可以是表达式 D 调用函数时 将为形参分配内存单元 函数练习题 以下叙述中不正确的是 A 在不同的函数中可以使用相同名字的变量 B 函数中的形式参数是局部变量 C 在一个函数内定义的变量只在本函数范围内有效 D 在一个函数内的复合语句中定义的变量在本函数范围内有效 函数练习题 函数调用语句f x y a b c 1 2 3 4 中 所含的实参个数是 1B 2C 3D 4用数组名作为函数调用时的实参 实际上传递给形参的是 A 数组的首地址B 数组的第一个元素的值C 每一个数组元素D 数组元素的个数 函数练习题 以下程序的输出结果是 includeintpower intx inty main floata 2 6 b 3 4 intp p power int a int b printf d n p return intpower intx inty inti p 1 for i y i 0 i p p x returnp A 8B 9C 27D 81 函数练习题 程序的运行结果为 includevoidsort inta intn inti j t for i 0 i n 1 i 2 for j i 2 j n j 2 if a i a j t a i a i a j a j t main intaa 10 1 2 3 4 5 6 7 8 9 10 i sort aa 10 for i 0 i 10 i printf d aa i printf n return 函数练习题 1 写一个函数求Fibonacci 斐波拉契 数列前20项 该数列第一项为1 第二项为1 从第三项起为前两项的和 11235 上机实验内容 2 用递归算法编程计算Fibonacci数列的前20项 1 写一个函数求Fibonacci 斐波拉契 数列前20项 该数列第一项为1 第二项为1 从第三项起为前两项的和 11235 includevoidfib intf intn inti intf 20 1 1 for i 2 i n i f i f i 2 f i 1 for i 0 i n i if i 5 0 printf n printf 12d f i main fib fi 20 2 用递归算法编程计算Fibonacci数列的前20项 includeintfib intn if n 2 return fib n 1 fib n 2 elsereturn 1 main inti intf 20 1 1 for i 2 i 20 i f i fib i for i 0 i 20 i if i 5 0 printf n printf 12d f i 1 写一个程序 从键盘输入2个正整数 然后求出它们的最小公倍数 并显示输出 通过调用对两个正整数求最小公倍数的函数实现 上机实验内容 上机实验内容 main intb 5 i f 5 for i 0 i 0 i f i 1 hef f i b i 1 printf d f 0 10 1 6 结构体作为函数参数 1 结构体变量的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年秋季学期北师大版(新教材)三年级数学上册九月月考练习卷含答案
- 保险行业合规管理模拟试题
- 保险行业保险代理人资格考试备考
- 中级统计师资格考试(统计基础理论及相关知识)能力提高训练试题库及答案(昭通2026年)
- 减速机检修维护技师试题及答案
- 住房和城乡建设领域现场专业人员培训考试(设备安装施工员专业基础知识)题库(日照2025年)
- 2026年中医执业医师方剂学练习题及答案
- 2026年江苏省溧阳市高二生物上册期末考试考试卷附答案【B卷】
- 山西2026年注册国际投资分析师(CIIA)考试(试卷一)全真题库及答案
- 司磅员岗位考试题及答案
- 2026年甘肃省酒泉市金塔县招聘社区工作者考试参考题库及答案解析
- 武汉市2027届高中毕业生九月调研考试地理试卷(含答案)
- 园林植物病虫害防治技术全套课件
- 第3课 寻找可靠数据源 课件+视频 2025-2026学年四年级全一册信息技术人教版
- 项目部对分包考核制度
- AI辅助PBL教学在内科规培中的实践
- 2026年中国火锅调味料行业市场规模、市场供需现状及促进市场需求的主要因素分析
- 1.2地球的公转课件-高中地理湘教版选择性必修1
- 麻醉科重点专科建设工作汇报
- 临床护理文书书写规范(2024版)
- 广州市下沙村地块土壤污染状况初步调查报告地块五
评论
0/150
提交评论