




已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章模块化程序设计 函数 1 1 2 6 1函数的概念 C程序结构 C程序结构如图所示1 一个C程序可以分为若干个函数2 每个程序有且只有一个主函数 main 其他都是子函数3 子函数可以相互调用 但主函数不能被调用4 一个C源程序由一个或多个文件构成 每个文件就是一个编译单位 3 说明 1 一个C程序的执行从主函数 main 开始 调用其他函数后仍回到main主函数结束 2 每个子函数都是平行的 任何子函数都不从属于其他函数3 从用户角度 函数可以分为 标准函数 即库函数 用户自定义函数4 从函数形式可以分为 无参函数 printstar 有参函数 printf hello includevoidprintStar printf n voidprintMessage printf Hello world n printStar voidmain printStar printMessage 4 函数定义的一般形式 函数定义的一般形式 类型说明函数名 形式参数说明 函数体 形式参数说明方法 数据类型变量名 类型变量名 无参数函数定义形式 类型说明函数名 函数体 voidprintHello printf hello n 有参数函数定义形式 类型说明函数名 形式参数说明 函数体 intsum intx inty intz z x y return z 5 函数体一般情况下 函数体有两部分组成 局部变量说明 语句 局部变量说明 函数体内的变量 其有效范围仅在本函数体内起作用 离开本函数无意义 intsum intx inty intz 局部变量定义z x y return z 6 函数的参数和函数的值 一个程序由若干个函数组成 各函数调用时经常要传递一些数据 即调用函数把数据传递给被调用函数 经过被调用函数处理后 得到一个确定的结果 在返回调用函数时 将结果带回调用函数 includeintmax intx inty intz z x y x y return z voidmain inta b c scanf d d 主函数 子函数 c max a b intmax intx inty return z 各函数之间数据往来通过参数传递和返回语句实现 7 函数参数 用于函数间数据的传递形式参数 定义函数时给出的参数实际参数 调用函数时给出的参数 includeintmax intx inty intz z x y x y return z voidmain inta b c scanf d d 对于函数max有两个形式参数x y形式参数x和y只在max函数中使用 a b是主函数中定义的变量 当main函数调用max函数时 a b成为max的实际参数调用时 实际参数的值赋给形参进行处理 例 max接受到两个值 89max返回89 一 形式参数和实际参数 8 includeintmax intx inty intz z x y x y return z voidmain inta b c scanf d d 说明 1 定义函数时 必须说明形参的类型 形参只能是变量 包括数组 不能是常量或表达式 2 函数被调用之前 形参和子函数中的变量不占内存 调用结束返回 形参所占的内存被收回 3 实参可以是常量 变量或表达式 因为传递过来的是具体数值 4 实参和形参类型必须一致 或可以安全转换 5 C语言中 实参和形参传递的是 按值传递 即单向传递 只与参数相对位置有关 而与变量名无关 intb inta intc c a b a b return c 13 20 main a main b max a max b 13 20 9 includeintsum inta intb a a b b a b return a voidmain inta 1 b 3 c c sum a b printf sumof d dis d n a b c 阅读下面程序 写出运行结果 函数被调用之前 形参和子函数中的变量不占内存 调用结束返回 形参所占的内存被收回 实参和形参传递的是 值传递 即单向传递 只与参数相对位置有关 而与变量名无关 sumof1 3is4 10 二 函数返回值 includeintmax intx inty intz z x y x y return z voidmain inta b c scanf d d 函数值也就是函数的返回值 是一个具体确定的值 函数使用return语句返回值 一个函数内可以有多个return语句 执行到任何return语句 函数都将立即返回到调用函数 if x y return x elsereturn y return后面的 可以省略 可以返回一个表达式 先求解表达式的值 再返回 intmax intx inty returnx y x y 1 返回函数值的方法 11 includeintmax intx inty intz z x y x y return z voidmain inta b c scanf d d 2 函数值的类型 函数的类型即函数值的类型 例如 函数max是int型 函数的返回值也是int型 省略了类型说明的函数就是int型 return中表达式的值一般和函数类型相同 如果不一致 则需要进行类型转换 以函数类型为准 12 3 不需要返回的函数 如果函数中没有return 认为是一个过程 可以使用类型void 如果一个函数被声明void类型 就不允许再引用它的返回值 只能单纯调用它 includevoidprintStar printf n voidprintMessage printf Hello world n printStar voidmain printStar printMessage 13 函数的调用 一 函数调用一般形式 一般形式 函数名 实参列表 说明 如果调用无参函数 实参表列可以忽略 但括号不能省 实参个数和形参个数相同 实参和形参类型一一对应 必要时会进行类型转换 注意 不同系统中 实参的计算顺序不同 一般认为从右到左计算和赋值 一般在调用函数前计算出实参的值 例1读程序 写出结果 includeintf inta intb intc if a b c 1 elseif a b c 0 elsec 1 returnc voidmain inti 2 p p f i i printf d p 14 二 函数调用方式 1 函数语句形式为 函数 实参表列 例如 printMessage printf d p 说明 这种方式不要求函数带返回值 函数只执行一定操作 2 函数表达式函数的返回值参与运算 例如 m max a b m 3 max a b printf d max a b 说明 这种方式的函数不能用于void类型 15 三 函数调用的执行过程 从右到左的顺序 计算实参中各表达式值 按照位置 将实参的值一一传递给形参 执行被调用函数 当遇到return 表达式 语句时 计算表达式的值并返回主调函数 X 0 600000 iabs x 1 000000 16 四 函数的原形 在程序中调用函数需满足以下条件 被调用函数必须存在 且必须遵循 先定义后使用 的原则 如果被调用函数的定义在主调函数之后 可以在调用之前给出原形说明 原形说明 类型说明函数名 参数类型 参数类型 17 函数的嵌套调用 嵌套调用是指在一个函数的函数体中又调用了其他函数 程序执行过程 第一层第二层第三层main printStar printStar printfMessage printMessage printStar printStar 结束 includevoidprintStar printf n voidprintMessage printf Hello world n printStar voidmain printStar printMessage 18 例3编程求 分析 重复三次不同的阶乘运算 只是每次的值不同 将求阶乘的过程编程一个函数fac 以不同的参数值来调用fac include includefloatfac intk floatt 1 0 inti for i 2 i k i t i returnt voidmain floatc intm n printf inputm n scanf d d 19 许多数学函数都是使用递归调用形式定义的 函数的递归调用 当n 1时 当n 1时 当n 0时 当n 1时 20 函数的递归调用是指在调用一个函数时又直接或间接调用函数本身 直接调用 间接调用 递归调用必须引入一个循环条件控制递归结束 否则进入死循环 21 例4有5个人坐在一起 问第5个人多少岁 答 比第4个人大2岁 第4个人说他比第三个人大2岁 第3个人比第2个人大2岁 第2个人比第1个人大2岁 而第1个人有10岁 问第5个人多少岁 22 函数调用过程 includeintage intn intc if n 1 c 10 elsec age n 1 2 returnc voidmain printf d age 5 23 例5用递归调用求n 阶乘 n 0 使用循环做 floatfac intn floatf 1 if n 0 for i 2 i n i f i elsef 1 returnf includefloatfac intn floatf if n 1 f fac n 1 n elseif n 0 n 1 f 1 elsef 1 returnf voidmain intn floaty printf inputaintegernumber scanf d 24 根据变量的作用域不同 可分为局部变量和全局变量两种 1 变量的作用域变量的作用域 变量起作用的范围 局部变量 在函数内部或某个控制块的内部定义的变量 局部变量的作用域 函数内部 作用 增强了函数模块的独立性 全局变量 在函数外面定义的变量称为全局变量 全局变量的作用域 从该变量定义的位置开始 直到源文件结束 作用 在同一文件中 所有函数都可以引用全局变量 增强了各函数间数据的联系 6 2变量的作用域 25 局部变量和全局变量的作用域如图所示 26 阅读程序 例6 4 的程序 了解变量作用域 请注意区分局部变量和全局变量的作用域 程序 example6 4 c 27 变量的存储类别 一 变量的动态存储和静态存储 全局变量和局部变量变量的作用域 静态存储和动态存储变量的存储类别 生存期 内存中供用户使用的空间有 代码区 静态存储区 编译时分配空间 动态存储区 执行时分配空间 变量或函数的属性 28 二 局部变量的存储类别 1 自动类别存储在动态存储区 用auto说明 如 intfunc1 inta autointb c 3 形参a 变量b c都是自动变量 调用函数时 系统给它们分配存储空间 函数调用结束时 自动释放空间 通常auto可以省略 29 2 局部静态变量占用静态存储 用static说明 说明 局部静态变量 属于静态存储类别 在程序执行的整个过程中 都不释放存储空间 局部静态变量在编译时赋值 仅赋值一次 如果定义局部静态变量没有赋初值 系统会自动赋初值 局部静态变量 只有在定义它的函数内被引用 它存在 但不被其他函数引用 如果f不定义成static是什么结果 f 1 j 1 fac 1 f f n 1 1 1 输出1 1 j 2 fac 2 f f n 1 2 2 输出2 2 j 3 fac 3 f f n 2 3 6 输出3 6 j 4 fac 4 f f n 6 4 24 输出4 24 30 3 寄存器变量存储在寄存器中 用register说明 说明 计算机的寄存器个数有限 寄存器变量对寄存器占有是动态的 有的系统对寄存器变量转化为自动变量处理 而有的系统会自动设置寄存器变量 31 三 全局变量的存储类别 全局变量都存放在静态的存储区 用static关键字声明的全局变量 只能在本文件内使用 没有用static关键字的全局变量可以在别的文件中使用extern关键字声明为外部变量 并在该文件中作为全局变量使用 尽量少使用全局变量 a c intmax voidcalcMax inta intn main c externintmax voidmain printf d max a c staticintmax voidcalcMax inta intn main c externintmax voidmain printf d max 错 max未定义 错 不能引用max 32 四 存储类别小结 1 变量的定义方法 存储类别 数据类型变量名 2 变量的划分 按作用域划分 按生存期 按变量的存放位置 33 自定义的函数有两种 内部函数和外部函数 1 内部函数若函数的存储类型为static型 则称其为内部函数 内部函数又称为静态函数 它表示在由多个源文件组成的同一个程序中 该函数只能在其所在的文件中使用 在其他文件中不可使用 内部函数的声明形式 static 例如 staticintStatistic 2 外部函数若函数的存储类型定义为extern型 则称其为外部函数 它表示该函数能被其他源文件调用 函数的默认存储类型为extern型 6 3内部函数与外部函数 34 外部函数的应用示例 下面的程序由3个文件组成 file1 c file2 c example6 6 c 在file1 c file2 c中分别定义了两个外部函数 在example6 6 c中可以分别调用这两个函数 1 file1 c file1 c外部函数定义 externintadd intm intn return m n 2 file2 c file2 c外部函数定义 externintmod inta intb return a b 35 3 example6 6 c includeexternintmod inta intb 外部函数声明 externintadd intm intn 外部函数声明 main intx y result1 result2 result printf Pleaseenterxandy n scanf d d 36 关于程序的几点说明 1 在程序file1 c file2 c中的函数定义可以不需要extern加以说明 默认为外部函数 2 在example6 6 c中对外部函数的声明也可以不用extern加以说明 默认为外部函数 3 由多个源文件组成一个程序时 main 函数只能出现在一个源文件中 4 由多个源文件组成一个程序时 有3种连接方式 将各源文件分别编译成目标文件 得到多个目标文件 obj后缀 然后用连接命令把多个 obj文件连接起来 37 建立项目文件 prj后缀或 dsw后缀 具体操作可参阅各种C语言集成开发环境说明 使用文件包含命令 请参阅本章6 6节 5 如果将file1 c或file2 c中的extern改成static 则主程序在编译时无法通过 6 在程序file1 c或file2 c中 也可以互相调用其外部函数 Turboc的连接接命令为tlink例如 tlinkexample6 6 obj file1 obj file2 obj结果 生成一个example6 6 exe文件 38 6 4编译预处理 作用 在对源程序编译之前做一些处理 生成扩展C源程序种类宏定义 define文件包含 include条件编译 if else endif等格式 开头占单独书写行语句尾不加分号 39 如 defineYES1 defineNO0if x YES printf correct n elseif x NO printf error n 展开后 if x 1 printf correct n elseif x 0 printf error n 1宏定义不带参数宏定义一般形式 define宏名 标识符 宏体 字符串 功能 用指定标识符 宏名 代替字符序列 宏体 宏展开 预编译时 用宏体来替换宏名 不作语法检查 如 defineYES1 defineNO0 definePI3 1415926 defineOUTprintf Hello World 说明 1 定义位置 任意 一般在函数外面 2 作用域 从定义命令到文件结束3 undef可终止宏名作用域格式 undef宏名 5 宏定义可嵌套 不能递归 例 defineMAXMAX 10 4 引号中的内容与宏名相同也不置换 例 definePI3 14159printf 2 PI f n PI 2 宏展开 printf 2 PI f n 3 14159 2 6 宏定义中使用必要的括号 例 defineWIDTH80 defineLENGTHWIDTH 40var LENGTH 2 宏展开 var WIDTH 40 2var 80 40 2 7 只是简单替代 标识符不占内存空间 8 一般宏名使用大写字母形式 40 带参数宏定义一般形式 define宏名 参数表 宏体 例 defineS r PI r r相当于定义了不带参宏S 代表字符串 r PI r r 说明 1 宏展开 不仅宏体替换 还要进行形参替换2 宏体及各形参外一般应加括号 3 宏名与参数之间不能有空格 例 defineS a b a b area S 3 2 宏展开 area 3 2 不能加空格 例 definePOWER x x xx 4 y 6 z POWER x y 宏展开 z x y x y 一般写成 definePOWER x x x 宏展开 z x y x y 41 42 5 带参的宏与函数区别 43 2文件包含功能 一个源文件可将另一个源文件的内容全部包含进来一般形式 include 文件名 或 include 处理过程 预编译时 用被包含文件的内容取代该预处理命令 再对 包含 后的文件作一个源文件编译 直接按标准目录搜索 存放C的库函数头文件 先在当前目录搜索 再搜索标准目录可指定路径 44 被包含文件内容源文件 c 头文件 h 宏定义数据结构定义函数说明等 文件包含可嵌套 45 例文件包含举例 46 3条件编译概念 在某个条件成立的情况下才对某一部分进行编译 三种格式 格式二形式 作用 如果标识符没有被 define命令定义过 则对程序段1进行编译 否则对程序段2进行编译 格式三形式 作用 如果指定的常量表达式1值为真 非零 则对程序段1进行编译 否则如果指定的常量表达式2值为真 非零 则对程序段2进行编译
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年人居环境行业智能家居技术应用与市场前景研究报告
- 2025年文化创意行业数字文创产品市场前景分析研究报告
- 2025年工业制造行业工业0技术应用前景研究报告
- 2025年电子产品行业消费电子产品市场前景分析报告
- 国家事业单位招聘2025商务部国际经济合作事务局招聘应届毕业生2人笔试历年参考题库附带答案详解
- 嘉峪关市2025年甘肃嘉峪关市事业单位招聘人员(116人)笔试历年参考题库附带答案详解
- 古县2025山西临汾古县事业单位招聘31人笔试历年参考题库附带答案详解
- 南京市2025上半年江苏无锡市梁溪区机关事业单位招聘编外工作人员20人笔试历年参考题库附带答案详解
- 云浮市2025广东云浮市罗定市市场监督管理局招用青年见习人员2人笔试历年参考题库附带答案详解
- 东城区2025北京东城区教育委员会所属事业单位第二批招聘378人笔试历年参考题库附带答案详解
- 网络交友新时代课件
- 电商直播行业合规性风险管控与流程优化报告
- 第08讲+建议信(复习课件)(全国适用)2026年高考英语一轮复习讲练测
- 基本生活能力评估表BADL使用指南
- 政务大模型安全治理框架
- 生态视角下陕南乡村人居环境适老化设计初步研究
- “研一教”双驱:名师工作室促进区域青年教师专业发展的实践探索
- 手卫生及消毒隔离基本知识
- 2025四川能投合江电力有限公司员工招聘11人笔试备考题库及答案解析
- 江苏省徐州市2025年中考英语真题(含答案)
- 包钢招聘考试试题及答案
评论
0/150
提交评论