




已阅读5页,还剩66页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 第7章函数 2 第7章函数 7 1函数的概念7 2函数的简单调用7 3数组作为函数参数的调用7 4函数的嵌套调用7 5函数的递归调用7 6变量的作用域7 7变量的存储类别 3 学习目标 函数定义和函数调用掌握数组作为参数的函数调用掌握函数的嵌套和递归调用掌握变量作用域了解变量存储类别 4 7 1函数的概念 1 C是模块化程序设计语言C是函数式语言必须有且只有一个名为main的主函数C程序的执行总是从main函数开始 在main中结束所有函数是平行的 函数不能嵌套定义 可以嵌套调用 include stdio h voidmain void floatx y z floataverage floata floatb printf 输入2个数值 scanf f f 5 5 例7 1 计算两个数的平均值 主函数 子函数 函数声明 函数调用 函数定义 函数返回值 6 简单的函数举例 main printf n printf Howdoyoudo n printf n 要求在屏幕上输出下列的图形 Howdoyoudo 7 简单的函数举例 includevoidprintstar intnum main printstar 10 printf Howdoyoudo n printstar 10 函数声明 函数调用 voidprintstar intnum inti for i 0 i num i printf printf n 函数定义 无返回值 8 intmax intx inty intz z x y x y returnz main inta 5 b 9 c c max a b printf Max d c 例 求两个数中的最大值 函数定义 函数调用 函数返回值 9 2 函数分类从用户角度标准函数 库函数 由系统提供用户自定义函数printstar intnum 从函数形式无参函数有参函数 strlen 字符数组名 10 使用库函数应注意的问题 1 函数功能2 函数参数的数目和顺序 及各参数意义和类型3 函数返回值的意义和类型4 需要使用的包含头文件 strlen str 11 例有参函数intmax intx inty intz z x y x y return z 例无参函数printstar printf n 或voidprintstar void printf n 7 2函数的定义 1 函数定义的一般格式 存储类别 函数类型函数名 形参列表 说明部分语句部分 例有参函数intmax intx y intz z x y x y return z 函数带回来的值的类型若缺省为 int整型函数没有返回值定义为void 12 2 函数的返回值返回语句的形式 功能 使程序控制从被调用函数返回到调用函数中 同时把返回值带给调用函数说明 只能返回一个值 而不能返回多个值 return x y return 表达式 return表达式 return 13 函数语句printstar 10 表达式方式函数调用出现在表达式中 函数的返回值参加表达式的运算 c 5 max a b 作为函数的参数printf max d max a b c max k max i j 函数的调用方式 intmax intx inty intz z x y x y return z 14 例7 3 输出数字金字塔 includevoidmain void intnum voidpyramid intn printf 请输入金字塔的层数 scanf d 请输入金字塔的层数 5122333444455555Pressanykeytocontinue 15 voidpyramid intn inti j for i 1 i n i for j 1 j n i j 输出左侧空格 printf for j 1 j i j 输出数字 printf d i printf n 换行 请输入金字塔的层数 5122333444455555Pressanykeytocontinue 16 例7 4 判断素数 include stdio h include math h intprime intn intk i result k sqrt n for i 2 ik result 1 elseresult 0 returnresult 例4 16 判断n是否为素数P75for i 2 isqrt n printf disaprimenumber n n elseprintf disnotaprimenumber n n 17 voidmain void inta 1777 b 1991 if prime a printf d是素数 n a elseprintf d不是素数 n a if prime b printf d是素数 n b elseprintf d不是素数 n b 1777是素数1991不是素数 18 说明 函数中可有多个return语句 但是 当程序执行到第一个return语句时 函数执行完毕 后面的程序不再执行 返回到函数调用处若无return语句 遇 时自动返回调用函数void型函数 没有返回值的函数若return返回值的类型和函数类型不一致 系统自动转换成函数类型后返回 voidprintstar intn for i 0 i n i printf printf n intmax intx inty if x y returnx elsereturny intfun return10 inta 5 returna include stdio h intaverage floata floatb floatc c a b 2 returnc intmain void floatx y z x 10 0 y 5 0 z average x y printf 2f n z 7 00Pressanykeytocontinue 19 例7 5 编写函数 交换两个变量的数值 include stdio h voidswap intx inty voidmain void inta b printf 请输入交换的数值 scanf d d 请输入交换的数值 711交换前a 7 b 11交换后a 7 b 11 20 为什么没有实现数值的交换 函数间的参数传递 形式参数和实际参数 形参 定义函数时 函数名后括号内的变量 形式参数只有在函数被调用时才分配变量空间 产生 并在函数调用结束后 释放变量空间 消失 实参 调用函数时 函数名后括号内的表达式 形式参数与实际参数的关系 形参与实参类型一致 个数相同 若类型不一致 自动按形参类型转换 main inta b c scanf d d 21 例7 5 编写程序 交换两个变量的数值 include stdio h voidswap intx inty voidmain void inta b printf 请输入交换的数值 scanf d d 7 11 调用前 调用时 调用结束 22 结论 参数 值 传递方式方式 函数调用时 为形参分配单元 并将实参的值复制到形参中调用结束 形参单元被释放 实参单元仍保留并维持原值特点 形参与实参占用不同的内存单元单向值传递 形参的改变并不影响实参 23 函数的声明 对被调用函数要求 必须是已存在的函数1 库函数 include2 用户自定义函数 进行函数声明函数声明一般形式 函数类型函数名 形参类型 形参名 函数类型函数名 24 例如 intmax intx inty intmax int int intmax intx inty intz z x y x y return z 可以省略形参的名称 函数的声明 25 函数声明的位置函数的数据说明部分在预编译命令之后 建议使用 26 函数的声明举例 voidmain void inta b printf 请输入交换的数值 scanf d d voidswap intx inty voidswap intx inty voidswap intx inty inttemp temp x x y y temp voidmain void inta b printf 请输入交换的数值 scanf d d 27 7 3数组作为参数的函数调用 当形式参数是一维数组时 可以说明数组长度或不说明数组的长度形参数组与实参数组公用一块内存空间 main intb 6 c c fun b intfun inta 6 inta b a 调用前 调用时 调用后 28 参数的 地址 传递方式方式 函数调用时 将数据的存储地址作为参数传递给形参函数调用后 形式参数数组a并没有像实际参数数组b一样再次申请一块连续的空间 而是使得数组a与数组b首地址相同 这样 在函数中访问数组a中的元素实际上等同于访问数组b中的元素 从而实现数组参数传递 29 特点 本质上仍然是 值 传递 只是传递的值是 地址 形参与实参指向同样的存储单元实参和形参必须是地址常量或地址变量 双向 传递 形参的改变影响实参 30 函数中如何知道数组的长度呢 C语言没有为函数提供任何简便的方法来确定传递给它的数组的长度 但是 处理数组 长度是必须的 所以通常要把数组长度也作为形式参数 例如 intfun inta intn 31 例7 6 求数组中元素的最大值 include stdio h defineN10floatmax array floata intn voidmain void floatarray N max inti printf 请输入 d个实数 n N for i 0 i N i scanf f 请输入10个实数 1 22 33 44 55 66 77 88 99 02 1最大的数组元素值是 9 00Pressanykeytocontinue 32 例7 6 求数组中元素的最大值 floatmax array floata intn inti floatmax max a 0 for i 1 imax max a i returnmax 可以说明数组长度或不说明数组的长度 33 例7 7 比较两个数组a和b的大小 比较规则为 用m n和k分别记录两个数组对应元素的比较结果 如果a i 大于b i m 否则如果a i 等于b i k 否则n 如果m n 数组a大于b 否则如果m n 数组a小于b 否则数组a等于b 34 include stdio h defineN5intcmp array inta intb intlength voidmain void inta N b N cmp i printf 请输入数组1 d个整数 n N for i 0 i N i scanf d 35 cmp cmp array a b N if cmp 0 printf 数组1大于数组2 n elseif cmp 0 printf 数组1小于数组2 n elseprintf 数组1等于数组2 n 请输入数组1 5个整数 12345请输入数组2 5个整数 34512数组1小于数组2Pressanykeytocontinue 36 intcmp array inta intb intlength inti result m n k m n k 0 for i 0 ib i m elseif a i n result 1 elseif m n result 1 elseresult 0 returnresult 37 例7 8 编写函数实现字符串的复制 include stdio h include string h defineN80voidcopy string charfrom charto voidmain void chara N b N printf 请输入一串字符串 n gets a copy string a b puts b 字符串是以一维字符数组形式存放的 所以字符串的传递与一维数组的传递方式相同 38 voidcopy string charfrom charto inti for i 0 from i 0 i to i from i to i 0 请输入一串字符串 ILoveChina ILoveChina 由于字符串具有结束标识 0 所以函数定义中不需要数组长度参数 39 例7 9 编写函数实现学生成绩按平均分排名 学生成绩存储在一个二维数组中 include stdio h defineM5 学生人数 defineN5 成绩科数 voidsort score floatscore N floatave voidmain void floatscore M N 80 0 85 0 78 0 97 0 68 0 90 0 97 0 89 0 88 0 92 0 60 0 75 0 79 0 95 0 56 0 98 0 61 0 78 0 99 0 68 0 80 0 89 0 98 0 97 0 88 0 floatave M inti j 40 例7 9 编写函数实现学生成绩按平均分排名 学生成绩存储在一个二维数组中 sort score score ave for i 0 i M i 按排名输出学生成绩 printf 第 d名学生平均成绩 2f n i 1 ave i for j 0 j N j printf 10 2f score i j printf n 第1名学生的平均成绩为 91 2090 0097 0089 0088 0092 00第2名学生的平均成绩为 90 4080 0089 0098 0097 0088 00第3名学生的平均成绩为 81 6080 0085 0078 0097 0068 00第4名学生的平均成绩为 80 8098 0061 0078 0099 0068 00第5名学生的平均成绩为 73 0060 0075 0079 0095 0056 00 41 voidsort score floatscore N floatave floatsum temp inti j k for i 0 i M i 计算平均成绩 sum 0 for j 0 j N j sum sum score i j ave i sum N 在C语言中 当形式参数是多维数组时 可以忽略第一维的长度 后面的维数必须书写 计算平均成绩并排序的函数 42 for i 0 i M 1 i 成绩排序 for j i 1 j M j if ave i ave j temp ave i ave i ave j ave j temp for k 0 k N k temp score i k score i k score j k score j k temp 43 地址传递在主调函数与被调函数要分别定义数组 并且数组类型应一致 如不一致将出错形参数组是一维数组 大小可不指定 是多维数组第一维可不指定形参数组名是地址变量 数组做函数参数的说明 44 7 4函数的嵌套调用 说明 函数定义时不可嵌套调用时可以嵌套其它函数 main intm n printf d max m n intmax intx inty return x y x y 45 7 4函数的嵌套调用 说明 函数定义时不可嵌套调用时可以嵌套其它函数 main 调用函数a 结束 a函数 b函数 调用函数b main a inta a定义 b intb b定义 46 例7 10 编写函数计算最大公约数和最小公倍数 include stdio h intgys inta intb intgbs inta intb voidmain void intx y printf 输入两个整数 n scanf d d 47 例7 10 编写函数计算最大公约数和最小公倍数 intgys inta intb inti for i a 1 i if a i 0 48 例7 10 编写函数计算最大公约数和最小公倍数 intgbs inta intb intt a b gys a b returnt 49 例7 11 编写函数计算数组元素的均方差 方差等于数组中所有元素与其平均值的平方和 它描述的是数据波动的情况 均方差等于方差的平方根 include stdio h include math h defineN10floataverage floata intn floatvariance floata intn floatave floatrms floata intn 50 voidmain void floatx N var inti printf 输入 d个数值 n N for i 0 i N i scanf f 51 例7 11 编写函数计算数组元素的均方差 方差等于数组中所有元素与其平均值的平方和 它描述的是数据波动的情况 均方差等于方差的平方根 floataverage floata intn inti floatsum 0 0 for i 0 i n i sum sum a i returnsum n 52 例7 11 编写函数计算数组元素的均方差 方差等于数组中所有元素与其平均值的平方和 它描述的是数据波动的情况 均方差等于方差的平方根 floatvariance floata intn floatave inti floatvar var 0 0 for i 0 i n i var var pow a i ave 2 returnvar 53 例7 11 编写函数计算数组元素的均方差 方差等于数组中所有元素与其平均值的平方和 它描述的是数据波动的情况 均方差等于方差的平方根 floatrms floata intn inti floatave var ave average a n var variance a n ave var sqrt var returnvar 输入10个数值 1 02 03 04 05 06 07 08 09 010 0这些数值的均方差为 9 0830 54 intf intx inty z z f y return 2 z 7 5函数的递归调用 定义 函数直接或间接的调用自身叫函数的递归调用 intf1 intx inty z z f2 y return 2 z intf2 intt inta c c f1 a return 3 c 55 说明C编译系统对递归函数的自调用次数没有限制每调用函数一次 在内存堆栈区分配空间 用于存放函数变量 返回值等信息 所以递归次数过多 可能引起堆栈溢出 56 例7 12 编写函数计算整数的阶乘 doublefact intn main intn scanf d 57 fac intn doublef if n 1 n 0 fac n 1 return 24 1 fac intn doublef if n 1 n 0 fac n 1 return 6 2 fac intn doublef if n 1 n 0 fac n 1 return 2 3 fac intn doublef if n 1 n 0 f 1 return 1 4 58 7 6变量的作用域 变量定义的3个基本位置 函数内部 函数参数 函数外部 内部变量 外部变量 局部变量 全局变量 59 局部变量 定义 在函数内定义 只在本函数内有效说明main中定义的变量只在main中有效形参属于局部变量 即只在函数中有效不同函数中同名变量 占不同内存单元复合语句中定义的变量 只在复合语句中有效 60 main inta 3 b 4 printf main a d b d n a b sub printf main a d b d n a b sub inta b a 6 b 7 printf sub a d b d n a b main a 3 b 4sub a 6 b 7main a 3 b 4 说明不同函数中同名变量 占不同的存储单元 3 4 6 7 61 defineN5main inti inta N 1 2 3 4 5 for i 0 i N 2 i inttemp temp a i a i a N i 1 a N i 1 temp printf d temp for i 0 i N i printf d a i 说明复合语句中定义的变量 只在复合语句中有效 62 全局变量 定义 在函数外定义 可为本文件所有函数共用有效范围 从定义变量的位置开始到本文件结束 应尽少使用全局变量 因为 全局变量在程序全部执行过程中占用存储单元降低了函数的通用性 可靠性 可移植性降低程序清晰性 容易出错局部变量与全局变量重名时 局部优先 63 例全局变量说明 在同一文件中 intp 1 q 5 floatf1 inta intb c intf3 charc1 c2 charf2 intx inty inti j main intm n p q的作用范围 c1 c2的作用范围 64 inta 3 b 5 max inta intb intc c a b a b return c main inta 8 printf max d max a b 运行结果 max 8 例全局变量与同名 起作用 局部变量 局部变量 65 7 7变量的存
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年特岗教师招聘考试初中生物备考资料
- 甲状腺功能低下课件
- 江苏南京2022-2024年中考满分作文31篇
- 云南省楚雄彝族自治州联考2024-2025学年高二下学期7月期末化学试题(含答案)
- 辽宁省辽阳市2024-2025学年高一下学期期末考试物理试卷(含答案)
- 2025年福建省福州市一中中考数学适应性试卷(4月份)(含答案)
- 新解读《GB-T 36136-2018结核分枝杆菌耐药基因芯片检测基本要求》
- 新解读《GB-T 15054.2-2018小螺纹 第2部分:公差和极限尺寸》
- 生物实验安全知识培训课件
- 2025年考研英语(一)阅读理解细节理解 提升查找与识别细节能力试卷
- 大学英语四级考试高频词汇1500
- 白细胞减少护理及饮食原则
- 水果店员工规章制度范文
- 《国防教育》课件
- 数学教育技术与信息化的融合
- 如何提升小学生的汉字书写能力
- 慢性乙型肝炎防治指南(2022年版)
- 城市更新示范区规划设计建议报告
- JGT161-2016 无粘结预应力钢绞线
- 236种食物的血糖生成指数
- 初中物理2022版新课程标准测试卷及答案
评论
0/150
提交评论