第5章 函数.ppt_第1页
第5章 函数.ppt_第2页
第5章 函数.ppt_第3页
第5章 函数.ppt_第4页
第5章 函数.ppt_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计 中国地质大学 北京 信息工程学院 第5章函数 5 1函数的基本概念 5 2函数的定义 5 3函数的调用 5 4函数的嵌套调用 5 5函数的递归调用 5 6局部变量和全局变量 5 7应用举例 5 8多文件程序的运行 5 1函数的基本概念 结构化程序设计基本思想 将一个大的程序按功能分割成一些功能相对单一 独立的小模块 基本方法 自上而下 逐步分解 分而治之 优点 降低程序设计的复杂性避免程序开发的重复劳动缩短程序的开发周期便于程序的维护和功能扩充 5 1函数的基本概念 函数 是一系列独立的程序步骤 将这些程序步骤集合在一起 并赋予一个名字 就形成了函数 通常将一些程序中常用的功能模块中的语句组组合成函数 作用 实现各个功能子模块 5 1函数的基本概念 函数举例 定义函数star voidstar printf n 定义函数message voidmessage printf Howareyou n includevoidmain 调用函数star star 调用函数message message 调用函数star star 程序运行结果 Howareyou 5 1函数的基本概念 说明 函数是平行的 地位相等 可以嵌套调用 不可以嵌套定义 即函数中不可以包含其他函数的定义 C程序从main 函数开始执行 main 函数执行完毕 C程序运行结束 main 函数被系统调用 其他函数的执行靠main 函数或其他函数的彼此调用才得以执行 5 1函数的基本概念 说明 当某个函数被另一个函数 称主调函数 调用后 程序转而去执行该函数 程序的控制权落到了该函数手中 函数执行完毕 返回被调用处 本次函数调用结束 控制权返还给主调函数 程序继续执行主调函数中未执行完的语句 函数组成了C源程序文件 C文件 C程序可以由多个源程序文件 C文件 组成 注意 函数与程序在概念上存在根本不同 程序的使用者是外部用户 而函数的调用完全是程序内部的事 5 1函数的基本概念 函数的分类 从用户使用的角度 分为 库函数 又称标准函数 是系统定义提供给用户使用的 使用前要先用 include命令包含相应的头文件 用户自定义函数 是用户根据需要 为完成特定的功能自己编写的函数 从函数结构形式 分为 无参函数 当一个函数被调用时 主调函数不向它传递数据 该函数便是无参函数 有参函数 当一个函数被调用时 主调函数要向它传递数据 该函数便是有参函数 第5章函数 5 1函数的基本概念 5 2函数的定义 5 3函数的调用 5 4函数的嵌套调用 5 5函数的递归调用 5 6局部变量和全局变量 5 7应用举例 5 8多文件程序的运行 5 2函数的声明和定义 函数定义的一般形式 1 函数的参数 2 函数的返回值与函数类型 3 循环结构 函数定义的一般形式 函数定义的一般形式 函数类型函数名 形参类型说明表 说明部分语句部分 说明 函数类型 为函数返回值的类型 缺省为int型 若无返回值 可以将函数声明为void型 函数名 必须符合标识符的命名规则 形参类型说明表 说明函数的形参及类型 函数可以没有参数 但函数名后的 不能省略 函数体 函数定义的一般形式 intmax intx inty intz intr r x y x y return r z r z includevoidmain inta b c d intmax int int int scanf d d d 程序运行输入 5108输出 10 思考题 设计一个求三个整数最大值的函数 5 2函数的声明和定义 函数定义的一般形式 1 函数的参数 2 函数的返回值与函数类型 3 函数的参数 形参和实参的概念 形式参数 定义函数时函数名后面括号中的变量名实际参数 调用函数时函数名后面括号中的表达式 例 求两数中的最大值 intmax intx inty intz z x y x y return z voidmain inta a max 10 20 printf d n a 形参 实参 函数的参数 形参和实参的说明 函数若有形参 在定义时必须指定形参的类型 实参可以是常量 变量或表达式 但是必须有确定的值 在发生函数调用时 先求解实参表达式的值 再将实参的值传递给对应的形参 实参与形参要个数相同 类型一致或赋值兼容 若实参与形参类型不同 赋值兼容 则实参值在传递给形参之前 要先自动转换为形参类型 函数的参数 10 20 函数的参数 形参和实参的说明 形参在未发生函数调用时并不被分配内存单元 只有当函数调用发生时 形参才被分配内存单元 并将实参的值复制到形参中 函数调用结束时 形参占用的内存单元又会被释放掉 参数传递方式 当实参 形参传递数据时 遵从的原则是 单向值传递 即数据只能由实参传递给形参 形参中的数据是实参数据的复本 形参值的变化不会影响到实参 因为 形参和实参被存放在不同的内存单元中 形参的变化实参怎么会知道哪 函数的参数 例 阅读下列程序 说明程序的运行结果 includevoidswap inta intb intt t a a b b t printf a d b d n a b voidmain inta 3 b 6 swap a b printf a d b d n a b 程序运行结果为 a 6 b 3a 3 b 6 函数的参数 swap函数 main函数 voidmain inta 3 b 6 swap a b printf a d b d n a b voidswap inta intb intt t a a b b t printf a d b d n a b a b 3 6 3 6 a b t 3 6 3 输出 a 6 b 3 a 3 b 6 5 2函数的声明和定义 函数定义的一般形式 1 函数的参数 2 函数的返回值与函数类型 3 函数的返回值与函数类型 函数返回值 调用函数进行数据处理时 往往希望将处理的结果带回给主调函数 这个值就是函数返回值 函数返回值的获得方法 使用return语句 函数的返回值与函数类型 return语句形式 return 表达式 或return表达式 或return 功能 终止执行函数 使程序控制从被调函数返回到主调函数的下一句 把返回值带给主调函数 函数的返回值与函数类型 说明 每个函数只有一个返回值 但函数中可有多个return语句 执行到那个return语句 那个return语句起作用 注意 程序执行到return语句 就认为函数执行完毕 从被调函数返回主调函数 若被调函数中没有return语句 则程序执行时遇最外层 时 自动返回主调函数 void型函数 没有返回値 在该类函数中若使用return语句返回 只能使用不带参数的return语句 函数的返回值与函数类型 例 阅读下列程序 说明程序的运行结果 并说明哪个return语句起了作用 includeintmax intx inty if x y returnx elsereturny voidmain intn n max 10 6 printf d n 程序运行结果为 10returnx 起作用 函数的返回值与函数类型 函数类型 是指函数定义时声明的类型 说明 return语句中表达式的类型应与该函数的函数类型一致 如果return语句中表达式的类型与函数类型不一致 则以函数类型为准 即函数类型决定函数返回值的类型 例如 intfun return3 5 函数的返回值为 整数3 函数的返回值与函数类型 注意 如果函数在定义时未指明函数类型 系统默认为int型 若要明确表示函数不带回任何返回值 可用void关键字作为函数类型 空类型 若函数在定义时 没有用void关键字作为函数类型 且函数中无return语句 并不代表函数无返回值 而是带回一个不确定的值 函数的返回值与函数类型 例 函数带回不确定值 printstar printf voidmain inta a printstar printf d a 输出 10 voidprintstar printf voidmain inta a printstar printf d a 编译错误 第5章函数 5 1函数的基本概念 5 2函数的定义 5 3函数的调用 5 4函数的嵌套调用 5 5函数的递归调用 5 6局部变量和全局变量 5 7应用举例 5 8多文件程序的运行 5 3函数的调用 函数调用的书写方法 有参函数 函数名 实参表 无参函数 函数名 说明 实参表 是用逗号隔开的常量 变量或表达式 实参与形参 应个数相等 类型一致 执行函数调用时 实参被一一赋值给形参 若调用的是无参函数 则函数名后一对空括号不能省略 实参表求值顺序 因系统而定 TurboC自右向左 5 3函数的调用 includeintf inta intb intc if a b c 1 elseif a b c 0 elsec 1 return c voidmain inti 2 p p f i i printf d p includeintf inta intb intc if a b c 1 elseif a b c 0 elsec 1 return c voidmain inti 2 p p f i i printf d p 运行结果 0 运行结果 1 思考 阅读下列程序 写出程序的运行结果 5 3函数的调用 函数调用方式 按函数在程序中出现的位置分为函数语句 把函数调用作为一个语句 例 printstar printf Hello World n 函数表达式 函数调用出现在表达式中 例 m max a b 2 函数参数 函数调用作为一个函数的实参 例 printf d max a b m max a max b c 5 3函数的调用 对被调用函数的要求 函数必须存在 使用库函数 应在源文件的开头用 include命令包含与所用库函数相关的头文件 使用自定义函数 若函数的定义出现在函数调用前 可直接调用 若函数的定义出现在函数调用后 应在主调函数中或在文件的开头对该函数进行类型声明 若函数已在外部 在所有函数定义前进行了类型声明 则在各主调函数中不必进行类型声明 5 3函数的调用 对被调用函数的声明 又称函数原型 一般形式 函数类型函数名 形参类型 形参名 或函数类型函数名 作用 告诉编译系统被调函数的函数类型 参数个数及各个参数的类型 以便系统检验 函数说明位置 程序的数据说明部分 函数内或函数外 5 3函数的调用 函数声明举例 includevoidmain floatadd float float 在函数内部进行函数声明 floata b c scanf f f 5 3函数的调用 函数声明举例 includefloatadd float float 在函数外部进行函数声明 voidmain floata b c scanf f f 5 3函数的调用 函数声明举例 includefloatadd floatx floaty floatz z x y return z voidmain floata b c scanf f f 被调函数出现在主调函数之前 不必进行函数说明 5 3函数的调用 函数调用过程总结 当函数被调用时执行下列步骤计算每个实参的值 将每个实参的值依次复制到对应的形参变量中 实参与形参类型应一致或兼容 若是兼容类型 则实参要做自动类型转换 如 将double型的实参传给int的形参时 在复制之前要先将其转换为int类型 执行函数体中的语句 直到遇到return语句 计算return语句中的表达式 如果需要 将表达式的值转换为指定函数的类型 在函数调用的地方用被调用函数的返回值替代 继续执行调用程序 第5章函数 5 1函数的基本概念 5 2函数的定义 5 3函数的调用 5 4函数的嵌套调用 5 5函数的递归调用 5 6局部变量和全局变量 5 7应用举例 5 8多文件程序的运行 5 4函数的嵌套调用 函数的嵌套调用 即调用一个函数的过程中可以调用另一个函数 函数嵌套调用的示意图 5 4函数的嵌套调用 例 编程计算三个数中最大数和最小数的差值 includeintdif intx inty intz intmax intx inty intz intmin intx inty intz voidmain inta b c d scanf d d d intdif intx inty intz returnmax x y z min x y z intmax intx inty intz intr r x y x y return r z r z intmin intx inty intz intr r x y x y return r z r z 5 4函数的嵌套调用 上例中函数嵌套调用关系如下 5 4函数的嵌套调用 思考题 用弦切法求方程x3 5x2 16x 80 0的根 弦切法求根示意图 5 4函数的嵌套调用 弦切法求根原理解释 令f x x3 5x2 16x 80给定曲线上两点的横坐标x1 x2 则对应的纵坐标为f x1 f x2 如果f x1 与f x2 同符号 要改变x1 x2 直到f x1 与f x2 异号 以保证 x1 f x1 与 x2 f x2 两点的连线与X轴有交点 x1 x2的值差不要太大 以保证两点间只有一个根 5 4函数的嵌套调用 弦切法求根原理解释 令连接 x1 f x1 与 x2 f x2 两点的弦交X轴于x点 x点横坐标求值公式为 如果f x 与f x1 同符号 根必在 x x2 区间 将x作为新的x1点 连新的弦 求与X轴的下一个交点 逐渐逼近曲线与X轴的交点 否则 应将x作为新的x2点 重复 步 直到当 f x 很小 比如 10 4时 就可认为f x 0 x就近似等于方程的根 5 4函数的嵌套调用 根据上述思路 设计如下函数来实现程序 f x 函数 求曲线上横坐标为x的点对应的纵坐标值 xpoint x1 x2 函数 计算连接两点 x1 f x1 与 x2 f x2 的弦与X轴交点的横坐标 这个计算中要调用f 函数 root x1 x2 函数 计算给定的两个值之间的实根 root 函数中要调用xpoint 函数 5 4函数的嵌套调用 f x 函数 求给定点对应的纵坐标 includefloatf floatx floaty y x x x 5 x x 16 x 80 returny xpoint x1 x2 函数 求两点与x轴交点floatxpoint floatx1 floatx2 floatx x x1 f x2 x2 f x1 f x2 f x1 returnx 5 4函数的嵌套调用 root x1 x2 函数 求根函数floatroot floatx1 floatx2 floatx y y1 do x xpoint x1 x2 y f x y1 f x1 if y y1 0 x1 x elsex2 x while fabs y 1e 4 return x 5 4函数的嵌套调用 主函数设计 includevoidmain floatx1 x2 y1 y2 x do printf inputx1 x2 n scanf f f 5 4函数的嵌套调用 思考题 请写出上例中函数嵌套调用的关系 第5章函数 5 1函数的基本概念 5 2函数的定义 5 3函数的调用 5 4函数的嵌套调用 5 5函数的递归调用 5 6局部变量和全局变量 5 7应用举例 5 8多文件程序的运行 5 5函数的递归调用 函数的递归调用 函数直接或间接的调用自身叫函数的递归调用 1 函数直接调用自身构成的递归 5 5函数的递归调用 函数的递归调用 函数直接或间接的调用自身叫函数的递归调用 2 函数间接调用自身构成的递归 5 5函数的递归调用 说明 由上面的图示可以看出递归都是无终止的自身调用 程序中是绝对不应该出现这种情况的 为了防止无休止的递归 程序中应控制递归的次数 使得在某条件成立时进行递归 条件不成立不进行递归调用 因此 在递归的调用过程中 应不断改变递归的条件 以使递归条件不再成立 5 5函数的递归调用 思考题1 5个坐在一起论年龄 问第五个人多少岁 他说比第四个人大两岁 问第四个人多少岁 他说比第三个人大两岁 问第三个人多少岁 他说比第二个人大两岁 问第二个人多少岁 他说比第一个人大两岁 问第一个人多少岁 他说10岁 请问第五个人多少岁 上述题意可用下面公式表示 5 5函数的递归调用 第五个人的年龄的求解过程如下图所示 5 5函数的递归调用 上述递归过程可以下面函数描述 intage intn intc if n 1 c 10 elsec age n 1 2 returnc 主函数 includevoidmain printf d age 5 5 5函数的递归调用 程序执行过程示意图如下 5 5函数的递归调用 思考题2 采用递归调用的方法计算n floatfac intn floatf if n 0 printf n 0 dataerror elseif n 0 n 1 f 1 elsef fac n 1 n return f 1 1 1 0 1 n n n n n includevoidmain intn floaty printf 输入一整数 scanf d 5 5函数的递归调用 使用递归的优缺点 优点 为某些编程问题提供了最简单的解决方法 有一些问题只有用递归方法才能解决的 递归方法使程序的结构简洁优美 但其执行效率不如循环 缺点 首先 递归的每次调用都有自己的变量集合 需要占用较多的内存 其次 由于进行每次函数调用都要花费一些时间 故递归的执行速度要慢一些 5 5函数的递归调用 思考题3 Hanoi 汉诺 塔问题 古代有一座梵塔 塔内有三个座A B C 开始时A座上有64个盘子 盘子大小不等 大的在下 小的在上 如下图 有一个老和尚想把这64个盘子从A座移到C座 每次只允许移动一个盘子 且在移动过程中在三个座上始终保持大盘在下 小盘在上 要求编程序打印出移动的步骤 这是一个古典的数学问题 是一个只有用递归方法解决的问题 5 5函数的递归调用 解题思路如下 若N 1 将第1个盘子从A座直接移到C座 若N 1 移动N个盘子需经三步 第一步 将N 1个盘子从A座经C座移动到B座第二步 将第N个盘子从A座移到C座第三步 将N 1个盘子从B座经A座移动到C座 说明 至于如何将N 1个盘子从B座经A座移动到C座 方法同上 只是移动座和目标座不一样而已 5 5函数的递归调用 移动N个盘子方法示意图如下 5 5函数的递归调用 下面的hanoi函数描述了上面的操作 voidhanoi intn charone chartwo charthree if n 1 printf c c one three else hanoi n 1 one three two printf c c one three hanoi n 1 two one three 5 5函数的递归调用 主函数代码如下 includevoidmain intm printf inputthememberofdiskes n scanf d 5 5函数的递归调用 移动3个盘子的函数调用示意图如下 5 5函数的递归调用 思考题 分析下列程序的运行结果 includelongfib intg switch g case1 case2 return1 return fib g 1 fib g 2 voidmain longk k fib 7 printf k d n k 5 5函数的递归调用 思考题 分析下列程序的运行结果 includevoidto binary unsignedlongn unsignedlongr r n 2 if n 2 to binary n 2 putchar r 1 0 return voidmain void to binary 20 第5章函数 5 1函数的基本概念 5 2函数的定义 5 3函数的调用 5 4函数的嵌套调用 5 5函数的递归调用 5 6局部变量和全局变量 5 7应用举例 5 8多文件程序的运行 5 6局部变量和全局变量 局部变量 在一个函数内部定义的变量 它只在本函数范围内有效 这种变量称为局部变量 作用 不同函数中可用相同的变量名 互不影响 说明 不同函数中的同名变量占用不同的内存单元 主函数中的定义的变量也只在主函数中有效 复合语句中定义的变量只在该复合语句中有效 形参是局部变量 只在它所在的函数中有效 5 6局部变量和全局变量 局部变量举例 5 6局部变量和全局变量 思考题 分析下列程序的运行结果 includevoidsub inta 6 b 7 printf sub a d b d n a b voidmain inta 3 b 3 printf main a d b d n a b sub printf main a d b d n a b 运行结果 main a 3 b 3sub a 6 b 7main a 3 b 3 5 6局部变量和全局变量 思考题 分析下列程序的运行结果 includevoidmain inti 10 inti 5 printf a d n i 运行结果 a 10 5 6局部变量和全局变量 全局变量 在函数外部定义的变量 称为全局变量 也叫外部变量 有效范围 从定义变量的位置开始到本源文件结束 作用 供本源文件各个函数使用 可以在函数之间传递信息 5 6局部变量和全局变量 利用全局变量在函数间传递信息 每个函数只有一个返回值 可是有时需要函数处理后得到多个处理结果 这时可利用全局变量在函数间传递信息 示例 编写一函数 输入10个学生的成绩 求平均分 最高分和最低分 程序分析 可以设计avg 函数 函数返回平均分 而最高分 最低分可通过两个全局变量max min获得 5 6局部变量和全局变量 includefloatmax 1 min 101 floatavg inti floatscore aver sum 0 for i 0 imax max score if score min min score sum sum score aver sum 10 return aver voidmain floata a avg printf max f min f average f n max min a 5 6局部变量和全局变量 思考题 分析下列程序的运行结果 includeinta 3 b 5 intmax inta intb intc c a b a b returnc voidmain inta 8 printf d max a b 运行结果 8 注意 当全局变量与局部变量同名时 在局部变量作用范围内 全局变量不起作用 即局部优先 5 6局部变量和全局变量 思考题 请说出下面程序的运行结果 intm 10 n 8 includevoidmain intn 3 m m 10 printf m d n d n m n intm 5 printf m d n d n m n printf m d n d n m n 运行结果 m 20 n 3m 5 n 3m 20 n 3 第5章函数 5 1函数的基本概念 5 2函数的定义 5 3函数的调用 5 4函数的嵌套调用 5 5函数的递归调用 5 6局部变量和全局变量 5 7应用举例 5 8多文件程序的运行 5 7应用举例 编写一个应用程序 用来给小学生进行二位数的加

温馨提示

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

评论

0/150

提交评论