




已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 引入 若程序有上百行 那么怎么调试最方便 如果我们设计一个程序完成下面的计算 其中 m n为正整数且m n该如何设计程序最有效 自顶向下逐步细化模块化设计结构化编程 2 如要设计并开发一个 财政信息系统 如何着手 需求分析系统设计程序编写 进一步展开 自顶向下逐步细化模块化设计结构化编程 3 如要设计并开发一个 财政信息系统 如何着手 4 5 第八章函数 第09讲 主讲 刘怀亮经济管理学院信息管理系 7 第八章函数 内容提要 8 1概述 8 2函数定义的一般形式 8 3函数参数和函数的值 8 4函数的调用 8 5函数的嵌套调用 8 6函数的递归调用 8 7数组作为函数参数 8 8局部变量全局变量 8 9变量的存储类别 8 10内部函数和外部函数 8 8 1概述 一个C程序可以分为若干个函数 每个程序有且仅有一个主函数 main 其他函数都是 子函数 子函数可以相互调用 但主函数不能被调用一个C源程序由一个或多个文件构成 一个源程序文件是一个编译单位 9 includevoidprintstar printf n voidprintmessage printf Hello world n printstar voidmain printstar printmessage 8 1概述 1 C程序的执行从main函数开始 调用其他函数后仍回到main函数 程序在main函数结束时结束 2 所有子函数都是平行的 任何子函数都不属于其他函数3 从用户的角度看 函数可分为 标准函数 即库函数 自定义函数4 从函数形式看 可分为 无参数函数 如printmessage 有参数函数 如printstar intn 说明 includevoidprintstar intn inti for i 0 i n i printf printf n voidprintmessage printf Hello world n printstar 15 voidmain printstar 15 printmessage Hello world 程序8 001 10 includevoidprintstar printf n voidprintmessage printf Hello world n printstar voidmain printstar printmessage includevoidprintstar intn inti for i 0 i n i printf printf n voidprintmessage printf Hello world n printstar 15 voidmain printstar 15 printmessage includevoidprintstar intn inti for i 0 i n i printf printf n voidprintname chara printf hello s n a printstar 15 voidmain charch a flower printstar 15 printname ch a 程序8 002 includevoidprintstar intn inti for i 0 i n i printf printf n voidprintname chara printf hello s n a printstar 15 voidmain charch a 80 printf pleaseinputyourname n gets ch a printstar 15 printname ch a 程序8 003 形式参数 实际参数 函数类型说明 11 8 2函数定义的一般形式 函数定义的一般形式 类型说明函数名 形式参数说明 函数体 1 无参函数的定义形式类型说明函数名 函数体 2 有参函数的定义形式类型说明函数名 形式参数说明 函数体 3 空函数的定义形式类型说明函数名 形式参数说明 includeintmax intx inty intz z x y x y return z voidmain inta b c scanf d d 形式参数说明方法 类型说明变量名 类型说明变量名 若定义成max intx y 错误 因为形参要单个定义 多个形参需单独说明 如 voidprinthello printf Hello world n 如 intmax intx inty intz z x y x y return z 又如 voidprinthello charname printf Hello s n name 12 8 2函数定义的一般形式 函数定义的一般形式 类型说明函数名 形式参数说明 函数体 一般情况下 函数由两部分组成 局部变量 函数体内定义的变量 其有效范围仅限于所在的函数内部 离开函数体则无意义 局部变量说明 语句 includeintmax intx inty intz z x y x y return z voidmain inta b c scanf d d 说明 13 8 3函数参数和函数的值 一个C程序由若干个函数组成 各函数调用时经常需要传递一些数据 即调用函数把数据传递给被调用函数 经被调用函数处理后 得到一个确定的结果 在返回调用函数时 把这结果返回调用函数 includevoidmain inta b c intmax intx inty scanf d d 例比较两个数并输出大者 程序8 004 函数声明 14 8 3函数参数和函数的值 一 形参与实参形式参数 定义函数时函数名后括号中的参数实际参数 调用函数时函数名后括号中的参数说明 max有个形式参数x和y形参x和y只在函数max中使用a和b是主函数中定义的变量main函数调用函数maxa和b为函数max的实参 includevoidmain inta b c scanf d d 用于函数间数据的传递 2389Maxis89 15 8 3函数参数和函数的值 1 定义函数时 必须说明形参的类型 形参只能是变量或数组 2 函数被调用前 形参不占用内存 函数调用结束后 形参所占用的内存也将被回收 3 实参可以是常量 变量或表达式 4 实参与形参的类型必须一致 个数相同 5 C中实参对形参的数据传递是 值传递 即单向传递 它仅由参数的对应位置确定 与名字无关 6 若形参与实参类型不一致 自动按形参类型转换 函数调用转换7 形参在函数被调用前不占内存 函数调用时为形参分配内存 调用结束 内存释放 includevoidmain inta b c scanf d d 说明 16 8 3函数参数和函数的值 二 函数的返回值1 返回函数值的方法函数的返回值也就是函数值 是一个确定的值 如果一个函数有返回值 就必须使用return语句 一个函数中可以有一个以上的return语句 但不论执行到哪个return都将结束函数的调用返回主调函数 return语句中的括号可以省略 renturn后面的值可以是一个表达式 includevoidmain inta b c scanf d d 17 8 3函数参数和函数的值 二 函数的返回值2 函数值的类型函数的类型即函数值的类型 如 函数max是int型的也就是函数值是int型省略了类型说明的函数是int型的return语句中表达式的值一般应与函数类型一致 如果不一致 则需要进行类型转换 只有函数型数据可以进行自动类型转换 以函数类型为准 includevoidmain inta b c scanf d d 18 8 3函数参数和函数的值 二 函数的返回值3 不需要返回值的函数如果函数中没有使用return语句 函数返回的是一个不确定的数值 如果一个函数不需要返回值 表示一个过程 可以用void做类型说明 如果一个函数被声明为void类型 就不允许再引用它的返回值 即只能用函数语句形式调用 includevoidprintstar printf n voidprintmessage printf Hello world n printstar voidmain printstar printmessage 19 8 4函数的调用 一 函数调用的一般形式 函数名 实参表列 说明 如果调用无参函数 实参列表可以忽略 但括号不能省略 实参的个数和形参一般相等 实参与形参的类型应一一对应 必要时使用类型转换 注意 不同系统中 实参的计算顺序不同 计算机上一般是从右到左 为避免由此引起的混乱 一般应在调用函数前计算出实参的值 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 n p printf d i 03 程序8 005 intj j i j p f i j 思考 程序运行结果是什么 includeintf inta intb intc if a b c 1 elseif a b c 0 elsec 1 returnc voidmain inti 2 p intj j i j p f i j printf p d n p printf i d n i printf j d n j 程序8 006 p 1i 2j 3 20 8 4函数的调用 二 函数调用的方式1 函数语句形式为 函数名 实参表列 如 printfmessage printf d p 说明 这种方式不要求函数带返回值 函数仅完成一定的操作 2 函数表达式函数的返回值参与运算如 m max a b m 3 max a b printf Maxis d max a b 说明 这种调用方式不能用于void型函数 21 8 4函数的调用 3 函数调用执行过程 按从右向左的顺序 计算实参中各表达式的值 按照位置 将实参的值一一对应地传送给形参 执行被调用函数 当遇到return 表达式 语句时 计算表达式的值 并返回主函数 includeintiabs floatx return x 0 x x voidmain floatx 1 8 y y iabs 2 x printf x f niabs x f n2x f x y 2 x 程序8 007 22 8 4函数的调用 四 函数的原形说明在程序中调用函数需满足以下条件 1 被调函数必须存在 且遵循 先定义后使用 的原则2 如果被调函数的定义在主调函数之后 位置 可以先给出原形说明 原形说明的形式为 includefloatf floata return2 x x 3 x 1 voidmain floatx scanf f 类型说明函数名 参数类型 参数类型 编译出错 includevoidmain inta b c intmax intx inty scanf d d 程序8 004 函数声明 23 8 5函数的嵌套调用 嵌套调用是指在一个函数的函数体中又调用了其他函数 程序的执行过程如下 includevoidprintstar printf n voidprintmessage printf Hello world n printstar voidmain printstar printmessage main printstar printmessage printmessage printstar printstar printstar 第一层 第二层 第三层 24 8 6函数的递归调用 引入 许多数学函数都是用递归调用形式定义的 如 1当n 0 1n n n 1 当n 11当n 0 xn x xn 1当n 0 longdg intn longf if n 0 printf n 0 inputerror elseif n 0 n 1 f 1 elsef dg n 1 n return f main intn longy printf n请输一整数 n scanf d 程序8 009 25 8 6函数的递归调用 程序举例 有5个人坐在一起 问第5个人多少岁 答 比第4个人大2岁 第4个人说他比第3个人大2岁 第2个人比第1个人大2岁 问第1个人时回答是10岁 第5个人到底是多大 回推阶段 递推阶段 26 8 6函数的递归调用 程序举例 有5个人坐在一起 问第5个人多少岁 答 比第4个人大2岁 第4个人说他比第3个人大2岁 第2个人比第1个人大2岁 问第1个人时回答是10岁 第5个人到底是多大 includeintage intn intc if n 1 c 10 elsec age n 1 2 returnc 递归结束条件 age 5 age 4 age 3 age 2 age 1 10 12 14 16 18 函数调用过程 栈 用栈来暂存数据 voidmain printf d age 5 27 Hanoi塔问题一块板上有三根针 A B C A针上套有64个大小不等的圆盘 大的在下 小的在上 要把这64个圆盘从A针移动C针上 每次只能移动一个圆盘 移动可以借助B针进行 但在任何时候 任何针上的圆盘都必须保持大盘在下 小盘在上 8 6函数的递归调用 Hanoi塔程序 move intn intx inty intz if n 1 printf c c n x y else move n 1 x z y printf c c n x y move n 1 z y x main inth printf ninputnumber n scanf d 程序8 010 28 8 6函数的递归调用 递归调用是指在调用一个函数时又直接或间接地调用了函数本身 直接递归调用间接递归调用 注意 这两个递归都无法结束 因此应含有某条件控制递归调用结束 29 8 7数组作为函数的参数 一 数组元素做函数实参与变量做实参一样 数组元素做实参是 值传递 值传递方式方式 函数调用时 为形参分配单元 并将实参的值复制到形参中 调用结束 形参单元被释放 实参单元仍保留并维持原值特点 形参与实参占用不同的内存单元单向传递 includeintmax intx inty return x y x y voidmain inta 10 i m printf Enter10integer n for i 0 i 10 i scanf d Enter10integer 2354105679432Maxis56 30 8 7数组作为函数的参数 二 一维数组与函数参数若函数的形参是数组 对应的实参必须是数组名 1 实参数组与形参数组的类型必须一致 2 用数组名做参数时 传递的是数组的首地址 因此形参数组也可以不指定大小 但需另设一个参数 传递数组元素的个数 说明 includeintmax intx intn inti m m x 0 for i 1 i n i if m x i m x i returnm main inta 10 i printf Enter10integer n for i 0 i 10 i scanf d 31 8 7数组作为函数的参数 二 一维数组与函数参数3 数组做函数参数时 形参数组和实参数组共享同一内存单元如果形参数组的元素的值被修改 实参数组的值也就被改变了 说明 起始地址1000 a 0 a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 x 0 x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 例数组排序 简单选择排序 includevoidsort intx intn inti j k t for i 0 i n 1 i k i for j i 1 j n j if x j x k k j if k i t x i x i x k x k t voidmain inta 10 i for i 0 i 10 i scanf d 9 49 i 0 32 8 7数组作为函数的参数 voidsort intx intn inti j k t for i 0 i n 1 i k i for j i 1 j n j if x j x k k j if k i t x i x i x k x k t voidmain inta 10 i for i 0 i 10 i scanf d 13 68 i 1 例数组排序 简单选择排序 33 8 7数组作为函数的参数 voidsort intx intn inti j k t for i 0 i n 1 i k i for j i 1 j n j if x j x k k j if k i t x i x i x k x k t voidmain inta 10 i for i 0 i 10 i scanf d 例数组排序 简单选择排序 i 8 34 8 7数组作为函数的参数 三 多维数组与函数参数1 多维数组可以作为函数的参数2 如果形参是多维数组 可以省略第一维的大小 但不能省略其他维的大小 实参与形参 35 8 8局部变量与全局变量 一 局部变量下列变量是局部变量 1 在一个函数内部定义的变量2 函数的形式参数3 在某复合语句中定义的变量 floatf1 inta intb c charf2 intx inty inti j main intm n a b c有效 x y i j有效 m n有效 d有效 说明 1 局部变量只在自己的范围内有效2 如果局部变量的有效范围有重叠 则有效范围小的优先 voidmain inta b c intd d a b voidmain inta b c intc d a b 局部优先 c有效 36 8 8局部变量与全局变量 二 全局变量说明 1 利用全局变量可以在函数间传递数据 2 应尽量少使用全局变量 3 如果全局变量与局部变量同名 则局部变量优先 例 全局变量与局部变量inta 3 b 5 intmax inta intb intc c a b a b returnc voidmain inta 8 printf d n max a b 37 8 9变量的存储类别 一 变量的动态存储和静态存储全局变量与局部变量 变量的作用域静态存储变量和动态存储变量 变量的存储类别 即生存期内存中供用户使用的存储空间包括 程序区 静态存储区 编译时分配空间动态存储区 执行时分配空间 变量或函数的属性 数据类型存储类别 自动型auto 静态型static 寄存器型register 外部型extern 38 8 9变量的存储类别 二 局部变量的存储类别1 自动变量存储在动态存储区 用auto说明如 intfunc1 inta autointb c 3 通常 将auto省略如 形参a 变量b c都是自动变量调用该
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智算中心算力资源分配管理方案
- 建筑钢结构安装技术方案
- 钢结构厂房抗风设计方案
- 建设工程成本预算编制方案
- 储能系统维护保养周期规划方案
- 校园消防安全教育调查
- 建筑垃圾分类运输与资源回收方案
- 工业园区绿色供电项目验收标准实施案
- 政工类培训考试题库及答案
- 城乡供水水资源循环利用方案
- 2025年福建省榕圣建设发展有限公司项目招聘12人笔试参考题库附带答案详解
- 一年级上册语文晨读课件
- 高职院校教师职业发展规划指南
- 2025重庆市专业应急救援总队应急救援人员招聘28人考试参考题库及答案解析
- 黑龙江省龙东地区2025届中考数学试卷(含解析)
- 2025-2026学年人教版(2024)小学美术二年级上册(全册)教学设计(附目录P144)
- 2025高考地理试题分类汇编:地球上的水含解析
- 2026届高考作文写作素材:《感动中国》2024年度十大人物素材及其运用
- 2025年重庆八中宏帆中学小升初自主招生数学试题(含答案详解)
- 苹果栽培学完整版课件
- 湿性愈合和新型敷料选择课件
评论
0/150
提交评论