




已阅读5页,还剩46页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章 函数 该章的学习内容 学点什么哪 掌握函数原型 prototype 及其 函数定义和函数原型说明的方法及二者的区别 掌握函数的参数传递方式与函数调用方法 理解掌握变量的作用域和存储类的概念 1 通过C语言的学习 牢固树立起函数的概念 及其使用规则 2 理解函数的作用域及其存储类及其自动变量与静态局部变量在应用中的区别 3 在实际应用中 学习和体会采用结构化设计方法 模块化 解决问题的思想 本章的学习难点 本章目录 函数1 1 函数有关概念及其分类1 2 函数的定义1 3 函数的返回值1 4 函数的调用与参数传递1 5 函数原型的说明 宏定义变量的作用域和存储类 模块化程序设计方法 应用设计实例多文件方式组织的程序 概述 一个较大的程序一般应分为若干个程序模块 每一个模块用来实现一定的功能 所有的高级语言中都有子程序这个概念 用子程序来实现模块功能 在 语言中 子程序的作用是由函数来完成的 一个 程序可由一个主函数和若干个函数构成 由主函数调用其它函数 其它函数也可以互相调用 同一个函数可以被一个或多个函数调用任意多次 程序设计中 常将一些常用的功能模块编写成函数 放在函数库中供公共选用 要善于用函数 以减少重复编程的工作量 C语言提倡把一个大问题划分成许多个小块 每一小块编制一个函数 这样C程序是由许多小函数而不是由少量大函数构成 这样作的好处 各部分充分独立 任务单一 便于书写和调试 有些小函数还可以作为构件 被别的程序利用 概述 C程序的基本结构 程序中函数调用示意图 基本思想 将一个大的程序按功能分割成一些小模块 特点 各模块相对独立 功能单一 结构清晰 接口简单控制了程序设计的复杂性提高元件的可靠性缩短开发周期避免程序开发的重复劳动易于维护和功能扩充开发方法 自上向下 逐步分解 分而治之 模块化程序设计 C是模块化程序设计语言规则 必须有且只能有一个名为main的主函数C程序的执行总是从main函数开始 在main中结束 函数不能嵌套定义 可以嵌套调用 函数的基本概念 1 project 工程 是由一个或多个C程序源文件组成 一个源程序是由一个或多个函数组成 一个源程序是一个编译单位 即以源程序为单位进行编译 而不是以函数为单位进行编译 其扩展名为 h或 c 3 C程序的执行从main 函数开始 没有main 函数的程序 不能执行 调用其他函数后流程回到main函数 在main函数结束整个程序运行 main函数是系统定义的 4 主函数可以调用任意子函数 而子函数不能调用主函数 子函数的地位是平等的 相互独立 相互无从属关系 可以相互调用 子函数可以直接或间接地自己调用自己 即递归调用 2 C语言程序源文件由函数组成函数的概念是C语言结构程序设计思想的体现 主函数 包括一个且仅有一个 main 其他函数 可以有 也可以没有 可以有一个 也可以有多个 使用库函数应注意 1 函数功能2 函数参数的数目和顺序 及各参数意义和类型3 函数返回值意义和类型4 需要使用的包含文件 标准函数 库函数 由系统提供 printf scanf getchar putchar等用户自定义函数 由用户按需要写的函数 从用户角度看 函数的分类 1 无参函数 在调用无参函数时 主调函数并不将数据送给被调函数 一般用来执行指定的一组操作 无参函数可以带回或不带回函数值 但一般以不带回函数值居多 有参函数 在调用函数时 在主调函数和被调函数之间有参数传递 也就是说主调函数可以将数据传给被调函数使用 被调用函数中的数据也可以带回来供主调函数使用 从函数的形式看 max intx inty max 有返回值函数 此类函数被调用执行完后将向调用者返回一个执行结果 称为函数返回值 必须在函数定义和函数说明中明确返回值的类型 无返回值函数 此类函数用于完成某项特定的处理任务 执行完成后不向调用者返回函数值 空类型的说明符为 void 从函数的返回值形式看 intmax return表达式 voidmax 函数的定义 1 传统风格函数定义 类型函数名 形参表列 形参说明 说明部分语句 形参表列是用逗号分隔的形参 形参又称为形式参数 哑元 虚参 虚拟参数 在形参说明中 说明形参表中每个形参的类型 类型 函数类型 用来说明本函数返回值的类型 当函数返回值是整型或不要求返回值时 可省略类型说明 无返回值可用 空类型 void 函数定义时的参数称为行参 函数调用时的参数称为实参 2 函数的现代定义方式 类型函数名 形参说明表列 说明部分语句 函数体 将形参说明包含到形参列表中 即在列出形参的同时 说明形参类型 形参列表 类型参数1 类型参数2 类型参数n 传统定义举例现代定义举例intadd x y intadd intx inty intx y 1 无参函数 类型标识符函数名 说明部分语句 类型标识符 表示返回值类型 7 2 1函数的定义 Hello printf Hello world n 例如 定义一个函数 说明 这里 只把main改为Hello作为函数名 其余不变 Hello函数是一个无参函数 当被其它函数调用时 输出Helloworld字符串 类型标识符函数名 形参表列 说明部分语句 2 有参函数 例 求二数之最大值intmax intx inty intz z x y x y return z 注意 出现return 语句 返回值一般与函数类型一致 合法标识符 函数返回值类型缺省int型无返回值void 函数体 函数类型函数名 形参类型说明表 说明部分语句部分 例有参函数 现代风格 intmax intx inty intz z x y x y return z 例无参函数printstar printf n 或printstar void printf n 3 可以有 空函数 类型说明符函数名 例如 dummy 调用此函数时 什么工作也不做 没有任何实际作用 在主调函数中写上 dummy 表明 这里要调用一个函数 而现在这个函数没有起作用 等以后扩充函数功能时补充上 函数定义说明 1 一个源程序文件由一个或多个函数组成 一个源程序文件是一个编译单位 即以源程序为单位进行编译 而不是以函数为单位进行编译 2 一个 程序由一个或多个源程序文件组成 对较大的程序 一般不希望全放在一个文件中 而将函数和其他内容 如预定义 分别放在若干个源文件中 再由若干源文件组成一个C程序 这样可以分别编写 分别编译 提高调度效率 一个源文件可以为多个C程序公用 函数定义说明 3 程序的执行从main函数开始 调用其他函数后流程回到main函数 在main函数中结束整个程序的运行 main函数是系统定义的 4 所有函数都是平行的 即在定义函数时是互相独立的 一个函数并不从属于另一函数 即函数不能嵌套定义 函数间可以互相调用 但不能调用main函数 程序举例1 定义求两个整数和的函数 intadd intx inty intz z x y return z intmax intx1 intx2 intx3 intmax if x1 x2 max x1 elsemax x2 if max x3 max x3 return max 编写函数 求三个整型参数的最大值 程序举例2 定义函数的返回值类型 函数名 形参 通过比较得到三个数的最大值放到max中 返回运算结果 函数的返回值 功能 将被调函数中的结果值返回给主调函数 语句 return 返回值表达式 或return表达式 或return 举例 intadd intx inty intz z x y return z 1 函数的返回值是通过函数中的return语句获得的 return语句将被调用函数中的一个确定值带回主调函数中去 如果需要从被调用函数带回一个函数值 供主调函数使用 被调用函数中必须包含return语句 如果不需要从被调用函数带回函数值 可以不要return语句 一个函数中可以有一个以上的return语句 执行到哪一个return语句 哪一个语句起作用 return语句后面的括弧也可以不要 如returnz 它与 return z 等价 说明 例如 max intx inty int z x y x y return 函数max可以改写如下 max intx inty return x y x y 2 return后面的值可以是一个表达式 这样的函数体更为简短 只用一个return语句就把求值和返回都解决了 3 函数值的类型 既然函数有返回值 这个值当然应属于某一个确定的类型 应当在定义函数时指定函数值的类型 语言规定 凡不加类型说明的函数 一律自动按整型处理 在定义函数时对函数值说明的类型一般应该和return语句中的表达式类型一致 例如 例2中用隐含方式指定max函数值为整型 而变量 也被指定为整型 通过return语句把 的值作为max的函数值 由max带回主调函数 的类型与max函数的类型是一致的 是正确的 4 若无return语句 遇到函数结束的 时 自动返回调用函数 5 如果函数值的类型和return语句中表达式的值不一致 则以函数类型为准 对数值型数据 可以自动进行类型转换 即函数类型决定返回值的类型 main floata b intc scanf f f z为实型变量 z x y x y return z 运行情况如下 1 5 2 5 Maxis2 printstar printf main inta a printstar printf d a 6 无返回值的函数返回后带回不确定值 输出 10 voidprintstar printf main inta a printstar printf d a 编译错误 程序举例2 下面add函数的功能是求两个参数的和 并将和值返回调用函数 函数中的错误是 voidadd floata floatb floatc c a b returnc voidadd floata floatb floatadd floata floatb 7 3函数的调用 函数调用的一般形式为函数名 实参表列 如果是调用无参函数 则 实参表列 可以没有 但括弧不能省略 如果实参表列包含多个实参 则各参数间用逗号隔开 实参与形参的个数应相等 类型应一致 实参与形参按顺序对应 一一传递数据 函数调用方式 调用方式 函数调用语句 函数表达式 函数参数 print star n voidprint star intn inti for i 1 i n i printf x max a b 5 x max max a b c 1 函数语句把函数调用作为一个语句 如hello 这时不要求函数带回值 只要求函数完成一定的操作 2 函数表达式函数出现在一个表达式中 这种表达式称为函数表达式 这时要求函数带回一个确定的值以参加表达式的运算 例如 c 2 max a b 函数max是表达式的一部分 它的值乘2再赋给c 3 函数参数函数调用作为一个函数的实参 例如 m max a max b c 其中max b c 是一次函数调用 它的值作为max另一次调用的实参 m的值是a b c三者最大的 又如 printf d max a b 也是把max a b 作为printf函数的一个参数 调用函数的过程是 为函数的所有形参分配内存单元 计算各个实参表达式的值 一一对应的赋值给相应形参 若是无参函数 上述过程不执行 进入函数体 执行函数中的语句 实现函数的功能 执行到return语句时 计算return语句中表达式的值 若是无返回值函数 本项不做 返回到主调函数 释放形参及本函数内的局部变量所占内存 继续执行主调函数中的后继语句 形式参数和实际参数 在调用函数时 大多数情况下 主调函数和被调用函数之间有数据传递关系 这就是前面提到的有参函数 前面已提到 在定义函数时函数名后面括弧中的变量名称为 形式参数 简称 形参 在主调函数中调用一个函数时 函数名后面括弧中的参数 可以是一个表达式 称为 实际参数 简称 实参 参数传递 主调函数向被调函数传值的方式 赋值调用把实参的值赋给形参 赋地址调用把实参的地址付给形参 在被调函数中 用该地址访问主调函数中的实参 实参 形参 调用 返回 单向值传递 C语言中 函数调用是值传递方式 即函数的实际参数和形式参数之间的数据传递方向是单向的 只能由实际参数传递给形式参数 而不能由形式参数传递给实际参数 是实际参数向形式参数单向赋值的关系 在内存中 形式参数与实际参数占用不同的内存单元 当调用函数时 给形式参数分配内存单元 将实际参数的值赋值给形式参数 调用后 形式参数单元释放 实际参数仍保留调用前的值 形式参数值的变化不影响实际参数 函数参数及其传递方式 例5 6交换两个数 includemain inta 3 b 5 printf a d tb d n a b printf swapped n swap a b printf a d tb d n a b swap intx inty inttemp temp x x y y temp temp 3 5 a b x 3 5 y 3 5 3 temp x x y y temp 程序举例 分析一下程序 写出运行结果 includemain inta 5 b 10 printf a d b d n a b fun a b 函数调用 printf a d b d n a b intfun intx inty 现代风格函数定义 x 3 y 3 return a 5 b 10a 5 b 10 main inta b c scanf d d a b c max a b printf Maxis d c max intx inty 定义有参函数max int z x y x y return 运行情况如下 7 8 Maxis8 形参 实参 程序举例 说明 实参必须有确定的值形参必须指定类型形参与实参类型一致 个数相同若形参与实参类型不一致 自动按形参类型转换 函数调用转换形参在函数被调用前不占内存 函数调用时为形参分配内存 调用结束 内存释放 例计算x的立方 includefloatcube floatx return x x x main floata product printf Pleaseinputvalueofa scanf f x 1 2 1 2 1 728 程序举例 在一个函数中调用另一函数 即被调用函数 需要具备哪些条件呢 1 首先被调用的函数必须是已经存在的函数 是库函数或用户自己定义的函数 2 如果使用库函数 一般还应该在本文件开头用 include命令将调用有关库函数时所需用到的信息 包含 到本文件中来 例如 include其中 stdio h 是一个 头文件 在stdio h文件中放了输入输出库函数所用到的一些宏定义信息 如果不包含 stdio h 文件中的信息 就无法使用输入输出库中的函数 3 如果使用用户自己定义的函数 而且该函数与调用它的函数 即主调函数 在同一个文件中 一般还应该在主调函数中对被调用的函数作声明 即向编译系统声明将要调用此函数 并将有关信息通知编译系统 例 对被调用的函数作声明 floatadd floatx floaty 对被调用函数的声明 main floata b c scanf f f a b c add a b printf sumis f c floatadd floatx floaty 函数首部 float 函数体 x y return 注意 对函数的 定义 和 声明 不是一回事 定义 是指对函数功能的确立 包括指定函数名 函数值类型 形参及其类型 函数体等 它是一个完整的 独立的函数单位 声明 的作用则是把函数的名字 函数类型以及形参的类型 个数和顺序通知编译系统 以便在调用该函数时系统按此进行对照检查 例如函数名是否
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025山西太原化学工业集团有限公司所属企业社会招聘100人笔试参考题库附带答案详解析
- picc人保知识考试试题及答案
- 草莓种植与农产品物流配送合作合同
- 餐饮企业并购股权转移合同
- 槽探工程风险评估与施工合同范本
- 数据库设计的原则与实践试题及答案
- 现代农业开发施工项目工程方案
- 持续集成自动化测试的应用试题及答案
- 城市排水设施建设项目投融资与财务方案
- 直播行业高质量发展风险管理评估
- 贵州省毕节市2025届高三下学期第四次适应性考试 历史 含答案
- 湖南省邵阳市2025届高三下学期第三次联考生物试题(含答案)
- 焦虑症病人的护理课件
- 卡尔曼滤波教学课件
- 2025年高考政治抢押秘籍(江苏专用)时政热点02政府工作报告(学生版+解析)
- 歌曲《wake》中英文歌词对照
- 核安全法培训课件
- (完整版)汉密尔顿焦虑量表(HAMA)
- 班主任工作范文班主任培训材料
- 售后工程师岗位职责内容及任职资格
- 旋风式除尘器使用说明书
评论
0/150
提交评论