谢丽聪老师C语言课件-8函数-2009

上传人:sh****na 文档编号:134608936 上传时间:2020-06-07 格式:PPT 页数:83 大小:758KB
返回 下载 相关 举报
谢丽聪老师C语言课件-8函数-2009_第1页
第1页 / 共83页
谢丽聪老师C语言课件-8函数-2009_第2页
第2页 / 共83页
谢丽聪老师C语言课件-8函数-2009_第3页
第3页 / 共83页
谢丽聪老师C语言课件-8函数-2009_第4页
第4页 / 共83页
谢丽聪老师C语言课件-8函数-2009_第5页
第5页 / 共83页
点击查看更多>>
资源描述

《谢丽聪老师C语言课件-8函数-2009》由会员分享,可在线阅读,更多相关《谢丽聪老师C语言课件-8函数-2009(83页珍藏版)》请在金锄头文库上搜索。

1、第八章函数 8 1概述8 2函数的分类8 3函数的定义8 4函数的调用8 5形式参数与实际参数8 6对被调函数的申明8 7函数的嵌套调用8 8函数的嵌套调用8 9数组作为函数参数8 10局部变量和全局变量8 11变量的存储类别8 12内部函数和外部函数 8 1概述 一个C程序由一个主函数和 0个其它函数组成函数体允许是空的或无值类型 或无返回值 void 结构化程序设计的一个重要特点 模块化设计 即用一个函数表示一个模块 例1 voidmain voidp star pv p star voidpv a n pv 3 chara intn p star inti pv 5 for i 1 i

2、n i p star printf c c n a a voidp star printf n 函数申明 执行一个程序从主函数开始 再从主函数结束 形参 供其它函数调用 实参 与形参对应 8 2函数分类 一 从函数定义的角度分为 1 库函数 P3712 用户自己定义的函数 由用户按需要写的函数 对于用户自定义函数 不仅要在程序中定义函数本身 而且在主调函数模块中还必须对该被调函数进行类型说明 然后才能使用 二 从函数的形式分为 1 有参函数 在函数定义 说明时都有参数 称为形式参数 形参 在函数调用时也必须给出参数 称为实际参数 实参 2 无参函数 函数定义 函数说明及函数调用中均不带参数 8

3、 3函数的定义 形式1 类型 函数名 形式2 类型 函数名 形参表列 定义形参类型 形式3 类型 函数名 类型1形参1 类型2形参2 intm intf m n intm charn intf intm charn 函数名前 类型 为int时可省略函数体允许是空的可以为无值类型 无返回值 void 例如 定义一个函数 用于求两个数中的大数 intmax inta intb if a b returna elsereturnb 1 函数的返回值 函数的返回值语句的一般形式为 return表达式 或return 表达式 第一行说明max函数是一个整型函数 其返回的函数值是一个整数 形参为a b 均

4、为整型量 a b的具体值是由主调函数在调用时传送过来的 在 中的函数体内 除形参外没有使用其它变量 因此只有语句而没有声明部分 在max函数体中的return语句是把a 或b 的值作为函数的值返回给主调函数 有返回值函数中至少应有一个return语句 2 函数的类型 因为函数有返回值 返回值就必须指定类型 在定义函数时指定函数值类型 如上例的定义函数 intmax inta intb if a b returna elsereturnb 再如 charletter charc1 charc2 doublemin intx inty 3 如函数值为整型 在函数定义时可以省去类型说明 4 在定义函

5、数时指定的类型说明 应与return语句表达式的类型一致 如果不一致 则以函数类型为主 自动进行类型转换 函数类型决定返回值的类型 5 不返回函数值的函数 可以明确定义为 空类型 如 voids intn 在主调函数中不能使用空类型的被调函数的函数值 8 4函数的调用 出现在另一函数的执行部分 格式 函数名 实参系表列 一 函数语句 printstar 二 函数表达式 f n f r f n r 即出现在表达式中三 函数参数 printf d n f n 调用另一函数时作实参注意 void类型函数只能使用形式一 使用函数返回值 例2 intmax inta intb if a b return

6、a elsereturnb main intmax inta intb intx y z printf inputtwonumbers n scanf d d 一个函数的定义可以放在主函数main之前 也可放在main之后 末尾无分号 调用max函数 并把x y中的值传送给max的形参a b max函数执行的结果 a或b 将返回给变量z 最后由主函数输出z的值 对max函数进行说明 末尾要加分号 输入 8061 输出 maxmum 80 例3 计算 main intn r cnr scanf d d 形参写在括号内 形参不用赋值 此函数有值 调用时得到值 调用函数 即赋值n r n r 实参

7、必须赋值 8 5形式参数与实际参数 1 定义函数中 函数名后面括号中的变量名 数组名等称为形参 2 调用函数中 函数名后面括号中的变量名 数组名等称为实参 注意 实参与形参的类型必须一致 字符与整型通用 形参为数组名时 实参也应为数组名 调用函数时把实参数组的首地址传递给形参 让形参与实参占用相同的单元 形参为变量名时 对应实参应为表达式 调用函数时把实参值单向传递给形参 表示未具体给定的量 不赋值 必须已赋值 其值用来传递给形参 单向传递 例4 voidmain intx 3 y 7 change x y printf d d n x y change inta intb intc c a

8、a b b c 第二种形式调用 结果 3 7 3 7 a b交换 没有给形参分配存储单元 x y值不变 例5 voidmain intx 2 3 7 change x 0 x 1 printf d d n x 0 x 1 change inta intb intc c a a b b c 结果 3 7 数组元素作函数实参数组元素是下标变量 它与普通变量并无区别 把作为实参的数组元素的值传送给形参 实现单向的值传送 3 7 与上例相同功能 没有给形参分配存储单元 函数调用中发生的数据传送是单向的 即只能把实参的值传送给形参 而不能把形参的值反向地传送给实参 因此在函数调用过程中 形参的值发生改变

9、 而实参中的值不会变化 实参 形参 x x 5y y 5 voidmain intn printf inputnumber n scanf d 输入 6 输出 n 21n 6 n 6 必须赋值 例6 例7 voidmain intx 2 3 7 change1 x printf d d n x 0 x 1 change1 inta 2 intc c a 0 a 0 a 1 a 1 a 2 结果 7 3 形参数组名取得该首地址之后 等于有了实在的数组 形参数组和实参数组为同一数组 共同拥有一段内存空间 传递地址 数组名 数组名作为函数参数1 用数组元素作实参时 不要求函数的形参也是下标变量 数组

10、元素与普通变量一样 2 用数组名作函数参数 形参 时 则要求对应的实参必须是类型相同的数组或地址 3 在用数组名作函数参数时 不是进行值的传送 数组名作函数参数时所进行的传送只是地址的传送 把实参数组的首地址赋予形参数组名 形参数组和实参数组共同拥有一段内存空间 8 6对被调用函数的声明 三种声明形式 1 函数类型函数名 2 函数类型函数名 形参1名 形参2名 3 函数类型函数名 形参1类型形参1名 形参2类型形参2名 若某函数中要调用在其后面定义的非int类型函数 则需在本函数说明部分或文件开头对要调用的函数进行声明 includevoidmain floatadd floatx float

11、y floata b c scand f f 对被调函数add的申明 被调函数add 例8 1 如果被调函数的返回值是整型 可以不对被调函数作说明 而直接调用 如以下例子 includevoidmain inta b c scand d d 不必对被调函数作申明 2 当被调函数的函数定义出现在主调函数之前时 在主调函数中也可以不对被调函数再作说明 includefloatadd floatx floaty floatz z x y returnz voidmain floata b c scand f f 不必对被调函数作申明 3 如在所有函数定义之前 在函数外预先说明了各个函数的类型 则在以

12、后的各主调函数中 可不再对被调函数作说明 例如 charstr inta floatf floatb main charstr inta floatf floatb 4 对库函数的调用不需要再作说明 但必须把该函数的头文件用include命令包含在源文件前部 对str函数和f函数预先作了说明 8 7函数的嵌套调用 函数的嵌套调用指 调用一个函数过程中又调用另一个函数 即 被调用的函数中包含调用另一个函数的语句 定义函数间的关系是并列的 一个函数内不能包含另一个函数 1 2 3 4 5 6 7 8 9 例9 main p1 printf m n printf p1 n p3 p2 printf

13、m n printf p1 n p2 printf m n p2 p3 printf p2 n printf p3 n p2 printf p3 n p1 printf p3 n 1 2 3 4 5 6 7 8 9 10 11 main p3 p2 P3 p2 p1 P2 P2 P2 P1 P2 1C11CC121CCC1331CCCC14641 15101051 00 01 11 12 22 02 13 23 33 03 例10 打印杨辉三角形 8行 intcnr n r intn r intc c f n f r f n r return c intf intm voidmain inti

14、 fac intj k fac 1 for j 0 j 8 j for i 1 i m i for k 0 k j k fac i printf 8d cnr j k returnfac printf n 计算n 控制每行后回车 另一个方法 用数组做如打印4行 a 1 1 1a 2 1 1 a 2 2 1a 3 1 1 a 3 2 2 a 3 3 1a 4 1 1 a 4 2 3 a 4 3 3 a 4 4 1 要定义为a 5 5 a 0 0 不用 习题6 13用二分法求下面方程在 10 10 之间的根2x3 4x2 3x 6 0 中点1 此两点一定为异号才有解 与a异号 中点2在左边 中点2

15、 b 与b异号 中点3在左边 中点3 例11 include math h floatf x floatx return 2 x 4 x 3 x 6 floatroot x1 x2 floatx1 x2 floatx y y1 do x x1 x2 2 y f x y1 f x1 if y y1 0 x1 x elsex2 x while fabs y 1e 6 returnx main floatx1 x2 do printf inputx1 x2 scanf f f 计算2x3 4x2 3x 6的值 中点函数值 左边函数值 以上两函数值同号 中点为x1 否则中点为x2 做到y值逼近0为止

16、两边界点函数值为异号才有解 直接调用函数 8 8函数的递归调用 一个函数 除主函数 直接或间接调用自己称为递归函数 在递归调用中 主调函数又是被调函数 例如有函数f如下 intf intx inty z f y returnz f是一个递归函数 但是运行该函数将无休止地调用其自身 这当然是不正确的 为了防止递归调用无终止地进行 必须加条件判断 满足某种条件后就不再作递归调用 然后逐层返回 例如 1 intf intx k f 5 2 intf1 intx j g 3 intg intx n f1 10 直接调用自己 间接调用自己 例12 5个人坐在一起报岁数 问第5个人几岁 他说比第4个人大两岁 问第4个人几岁 他说比第3个人大两岁 问第3个人几岁 他说比第2个人大两岁 问第2个人几岁 他说比第1个人大两岁 最后问第1个人几岁 他说10岁 这是一个递归问题 要求第5个人的年龄 要先知道第4个人的年龄 要求第4个人的年龄 要先知道第3个人的年龄 要求第3个人的年龄 要先知道第2个人的年龄 得出 age 5 age 4 2age 4 age 3 2age 3 age 2 2age 2 ag

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

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