资源预览内容
第1页 / 共145页
第2页 / 共145页
第3页 / 共145页
第4页 / 共145页
第5页 / 共145页
第6页 / 共145页
第7页 / 共145页
第8页 / 共145页
第9页 / 共145页
第10页 / 共145页
亲,该文档总共145页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第7章用函数实现模块化程序设计 7 1为什么要用函数7 2怎样定义函数7 3调用函数7 4对被调用函数的声明和函数原型7 5函数的嵌套调用7 6函数的递归调用7 7数组作为函数参数7 8局部变量和全局变量 7 9变量的存储方式和生存期 7 10关于变量的声明和定义 7 11内部函数和外部函数 7 1为什么要用函数 问题 如果程序的功能比较多 规模比较大 把所有代码都写在main函数中 就会使主函数变得庞杂 头绪不清 阅读和维护变得困难有时程序中要多次实现某一功能 就需要多次重复编写实现此功能的程序代码 这使程序冗长 不精炼多人如何分工合作 7 1为什么要用函数 解决的方法 用模块化程序设计的思路事先编好一批实现各种不同功能的函数把它们保存在函数库中 需要时直接用采用 组装 的办法简化程序设计的过程 7 1为什么要用函数 解决的方法 用模块化程序设计的思路函数就是功能每一个函数用来实现一个特定的功能函数的名字应反映其代表的功能 7 1为什么要用函数 在设计一个较大的程序时 往往把它分为若干个程序模块 每一个模块包括一个或多个函数 每个函数实现一个特定的功能 程序可由一个主函数和若干个其他函数构成主函数调用其他函数 其他函数也可以互相调用同一个函数可以被一个或多个函数调用任意多次 7 1为什么要用函数 main a b c f g h d e i e 7 1为什么要用函数 可以使用库函数可以使用自己编写的函数在程序设计中要善于利用函数 可以减少重复编写程序段的工作量 同时可以方便地实现模块化的程序设计 函数有关的主要问题 函数定义 调用函数传递参数的特点及影响递归调用数组名作函数参数 函数的关键问题 与函数有关的三个方面 函数说明 函数定义 函数调用定义函数要考虑的问题 输入参数有几个 表示什么含义 什么数据类型 返回值什么类型 什么含义调用函数时 如何设置输入参数 如何使用返回值 举例及其作用 函数的基本使用 计算最大值函数max计算加法add函数参数传递特点 传值整数交换swap 不会成功返回值的作用 判断质数fn 举例及其作用 数组名做函数参数 能访问多个元素求数组元素和 平均值递归函数 终止条件和递归调用求年龄 求阶乘汉诺塔 思考并理解 先编写max函数 intmax intx inty intz z x y x y return z 在max函数上面 再编写主函数 includeintmax intx inty intmain inta b c printf twointegernumbers scanf d d 实参可以是常量 变量或表达式 c max a b main函数 intmax intx inty max函数 intz z x y x y return z 在定义函数中指定的形参 在未出现函数调用时 它们并不占内存中的存储单元 在发生函数调用时 函数max的形参被临时分配内存单元 2 a 3 b x y 2 3 实参 形参 调用结束 形参单元被释放实参单元仍保留并维持原值 没有改变如果在执行一个被调用函数时 形参的值发生改变 不会改变主调函数的实参的值 2 a 3 b x y 2 3 实参 形参 函数使用注意的问题 子函数输入参数个数最少为0个 最多不限 返回值最多为1个 最少为0个 即没有返回值返回值的作用 结果 如求和函数 标志 如0 1 判断质数的结果只能返回数值或者字符 不能返回字符串不要在子函数中输入输出数据 函数使用注意的问题 子函数最多能返回一个值 不能企图返回两个及以上的值 C语言本身不支持数组名做函数参数 在子函数中可以读取主函数中的数组元素 并能够修改主函数中数组元素的值 说明 1 一个 程序由一个或多个程序模块组成 每一个程序模块作为一个源程序文件 对较大的程序 一般不希望把所有内容全放在一个文件中 而是将它们分别放在若干个源文件中 由若干个源程序文件组成一个C程序 这样便于分别编写 分别编译 提高调试效率 一个源程序文件可以为多个C程序共用 说明 2 一个源程序文件由一个或多个函数以及其他有关内容 如预处理指令 数据声明与定义等 组成 说明 3 程序的执行是从main函数开始的 如果在main函数中调用其他函数 在调用后流程返回到main函数 在main函数中结束整个程序的运行 说明 4 所有函数都是平行的 即在定义函数时是分别进行的 是互相独立的 说明 5 从用户使用的角度看 函数有两种 库函数 它是由系统提供的 用户不必自己定义而直接使用它们 应该说明 不同的C语言编译系统提供的库函数的数量和功能会有一些不同 当然许多基本的函数是共同的 用户自己定义的函数 它是用以解决用户专门需要的函数 说明 6 从函数的形式看 函数分两类 无参函数 无参函数一般用来执行指定的一组操作 无参函数可以带回或不带回函数值 但一般以不带回函数值的居多 有参函数 在调用函数时 主调函数在调用被调用函数时 通过参数向被调用函数传递数据 一般情况下 执行被调用函数时会得到一个函数值 供主调函数使用 7 2怎样定义函数 7 2 1为什么要定义函数7 2 2定义函数的方法 7 2 1为什么要定义函数 C语言要求 在程序中用到的所有函数 必须 先定义 后使用 指定函数名字 函数返回值类型 函数实现的功能以及参数的个数与类型 将这些信息通知编译系统 7 2 1为什么要定义函数 指定函数的名字 以便以后按名调用指定函数类型 即函数返回值的类型指定函数参数的名字和类型 以便在调用函数时向它们传递数据指定函数的功能 这是最重要的 这是在函数体中解决的 7 2 1为什么要定义函数 对于库函数 程序设计者只需用 include指令把有关的头文件包含到本文件模块中即可程序设计者需要在程序中自己定义想用的而库函数并没有提供的函数 7 2 2定义函数的方法 1 定义无参函数定义无参函数的一般形式为 类型名函数名 void 函数体 类型名函数名 函数体 包括声明部分和语句部分 包括声明部分和语句部分 7 2 2定义函数的方法 1 定义无参函数定义无参函数的一般形式为 类型名函数名 void 函数体 类型名函数名 函数体 指定函数值的类型 指定函数值的类型 7 2 2定义函数的方法 2 定义有参函数定义有参函数的一般形式为 类型名函数名 形式参数表列 函数体 7 2 2定义函数的方法 3 定义空函数定义空函数的一般形式为 类型名函数名 先用空函数占一个位置 以后逐步扩充好处 程序结构清楚 可读性好 以后扩充新功能方便 对程序结构影响不大 7 3调用函数 7 3 1函数调用的形式7 3 2函数调用时的数据传递7 3 3函数调用的过程7 3 4函数的返回值 7 3 1函数调用的形式 函数调用的一般形式为 函数名 实参表列 如果是调用无参函数 则 实参表列 可以没有 但括号不能省略如果实参表列包含多个实参 则各参数间用逗号隔开 7 3 1函数调用的形式 按函数调用在程序中出现的形式和位置来分 可以有以下3种函数调用方式 函数调用语句把函数调用单独作为一个语句如printf star 这时不要求函数带回值 只要求函数完成一定的操作 7 3 1函数调用的形式 按函数调用在程序中出现的形式和位置来分 可以有以下3种函数调用方式 函数表达式函数调用出现在另一个表达式中如c max a b 这时要求函数带回一个确定的值以参加表达式的运算 7 3 1函数调用的形式 按函数调用在程序中出现的形式和位置来分 可以有以下3种函数调用方式 函数参数函数调用作为另一函数调用时的实参如m max a max b c 其中max b c 是一次函数调用 它的值作为max另一次调用的实参 7 3 2函数调用时的数据传递 1 形式参数和实际参数在调用有参函数时 主调函数和被调用函数之间有数据传递关系定义函数时函数名后面的变量名称为 形式参数 简称 形参 主调函数中调用一个函数时 函数名后面参数称为 实际参数 简称 实参 实际参数可以是常量 变量或表达式 7 3 2函数调用时的数据传递 2 实参和形参间的数据传递在调用函数过程中 系统会把实参的值传递给被调用函数的形参或者说 形参从实参拷贝一个值 一般情况下改变形参 而实参的值不变该值在函数调用期间有效 可以参加被调函数中的运算 7 3 2函数调用时的数据传递 例7 2输入两个整数 要求输出其中值较大者 要求用函数来找到大数 解题思路 1 函数名应是见名知意 今定名为max 2 由于给定的两个数是整数 返回主调函数的值 即较大数 应该是整型 3 max函数应当有两个参数 以便从主函数接收两个整数 因此参数的类型应当是整型 7 3 4 函数的返回值 通常 希望通过函数调用使主调函数能得到一个确定的值 这就是函数值 函数的返回值 函数的返回值是通过函数中的return语句获得的 一个函数中可以有一个以上的return语句 执行到哪一个return语句 哪一个就起作用return语句后面的括号可以不要 7 3 4 函数的返回值 通常 希望通过函数调用使主调函数能得到一个确定的值 这就是函数值 函数的返回值 2 函数值的类型 应当在定义函数时指定函数值的类型 7 3 4 函数的返回值 通常 希望通过函数调用使主调函数能得到一个确定的值 这就是函数值 函数的返回值 3 在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致如果函数值的类型和return语句中表达式的值不一致 则以函数类型为准 7 3 4 函数的返回值 例7 3将例7 2稍作改动 将在max函数中定义的变量z改为float型 函数返回值的类型与指定的函数类型不同 分析其处理方法 解题思路 如果函数返回值的类型与指定的函数类型不同 按照赋值规则处理 includeintmain intmax floatx floaty floata b intc scanf f f 1 5 2 6 2 6 2 变为2 7 4对被调用函数的声明和函数原型 在一个函数中调用另一个函数需要具备如下条件 1 被调用函数必须是已经定义的函数 是库函数或用户自己定义的函数 2 如果使用库函数 应该在本文件开头加相应的 include指令 3 如果使用自己定义的函数 而该函数的位置在调用它的函数后面 应该声明 7 4对被调用函数的声明和函数原型 例7 4输入两个实数 用一个函数求出它们之和 解题思路 用add函数实现 首先要定义add函数 它为float型 它应有两个参数 也应为float型 特别要注意的是 要对add函数进行声明 7 4对被调用函数的声明和函数原型 分别编写add函数和main函数 它们组成一个源程序文件main函数的位置在add函数之前在main函数中对add函数进行声明 includeintmain floatadd floatx floaty floata b c printf Pleaseenteraandb scanf f f floatadd floatx floaty floatz z x y return z 求两个实数之和 函数值也是实型 对add函数声明 includeintmain floatadd floatx floaty floata b c printf Pleaseenteraandb scanf f f floatadd floatx floaty floatz z x y return z 只差一个分号 includeintmain floatadd floatx floaty floata b c printf Pleaseenteraandb scanf f f floatadd floatx floaty floatz z x y return z 定义add函数 调用add函数 函数原型的一般形式有两种 如floatadd floatx floaty floatadd float float 原型说明可以放在文件的开头 这时所有函数都可以使用此函数 7 5函数的嵌套调用 语言的函数定义是互相平行 独立的即函
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号