高素质编程师湖南大学C语言课件第六章.ppt

上传人:xin****828 文档编号:6152887 上传时间:2020-02-18 格式:PPT 页数:56 大小:753.31KB
返回 下载 相关 举报
高素质编程师湖南大学C语言课件第六章.ppt_第1页
第1页 / 共56页
高素质编程师湖南大学C语言课件第六章.ppt_第2页
第2页 / 共56页
高素质编程师湖南大学C语言课件第六章.ppt_第3页
第3页 / 共56页
点击查看更多>>
资源描述
第六章函数 6 1概述模块化程序设计基本思想 将一个大的程序按功能分割成一些小模块 特点 各模块相对独立 功能单一 结构清晰 接口简单控制了程序设计的复杂性提高元件的可靠性缩短开发周期避免程序开发的重复劳动易于维护和功能扩充开发方法 自上向下 逐步分解 分而治之 C是模块化程序设计语言 C程序结构 C是函数式语言必须有且只能有一个名为main的主函数C程序的执行总是从main函数开始 在main中结束函数不能嵌套定义 可以嵌套调用 函数分类从用户角度标准函数 库函数 由系统提供用户自定义函数从函数形式无参函数有参函数 使用库函数应注意 1 函数功能2 函数参数的数目和顺序 及各参数意义和类型3 函数返回值意义和类型4 需要使用的包含文件 Ch7 201 c 6 2函数的定义一般格式 合法标识符 函数返回值类型缺省int型无返回值void 函数体 例有参函数 现代风格 intmax intx inty intz z x y x y return z 例无参函数printstar printf n 或printstar void printf n 例有参函数 传统风格 intmax x y intx y intz z x y x y return z 6 3函数的返回值返回语句形式 return 表达式 或return表达式 或return 功能 使程序控制从被调用函数返回到调用函数中 同时把返值带给调用函数说明 函数中可有多个return语句若无return语句 遇 时 自动返回调用函数若函数类型与return语句中表达式值的类型不一致 按前者为准 自动转换 函数调用转换void型函数 例无返回值函数voidswap intx inty inttemp temp x x y y temp printstar printf main inta a printstar printf d a 例函数带回不确定值 输出 10 voidprintstar printf main inta a printstar printf d a 编译错误 例函数返回值类型转换 main floata b intc scanf f f 6 4函数的调用调用形式函数名 实参表 说明 实参与形参个数相等 类型一致 按顺序一一对应实参表求值顺序 因系统而定 TurboC自右向左 main inti 2 p p f i i printf d p intf inta intb intc if a b c 1 elseif a b c 0 elsec 1 return c 例参数求值顺序 main inti 2 p p f i i printf d p intf inta intb intc if a b c 1 elseif a b c 0 elsec 1 return c 运行结果 0 运行结果 1 调用方式函数语句 例printstar printf Hello World n 函数表达式 例m max a b 2 函数参数 例printf d max a b m max a max b c 函数说明对被调用函数要求 必须是已存在的函数库函数 include用户自定义函数 函数类型说明函数说明一般形式 函数类型函数名 形参类型 形参名 或函数类型函数名 作用 告诉编译系统函数类型 参数个数及类型 以便检验函数定义与函数说明不同函数说明位置 程序的数据说明部分 函数内或外 下列情况下 可不作函数说明若函数返值是char或int型 系统自动按int型处理被调用函数定义出现在主调函数之前有些系统 如BorlandC 要求函数说明指出函数返值类型和形参类型 并且对void和int型函数也要进行函数说明 例函数说明举例 6 5函数参数及其传递方式形参与实参形式参数 定义函数时函数名后面括号中的变量名实际参数 调用函数时函数名后面括号中的表达式 例比较两个数并输出大者 main inta b c scanf d d 说明 实参必须有确定的值形参必须指定类型形参与实参类型一致 个数相同若形参与实参类型不一致 自动按形参类型转换 函数调用转换形参在函数被调用前不占内存 函数调用时为形参分配内存 调用结束 内存释放 6 5函数参数及其传递方式形参与实参形式参数 定义函数时函数名后面括号中的变量名实际参数 调用函数时函数名后面括号中的表达式 例计算x的立方 includefloatcube floatx return x x x main floata product printf Pleaseinputvalueofa scanf f x 1 2 1 2 1 728 参数传递方式值传递方式方式 函数调用时 为形参分配单元 并将实参的值复制到形参中 调用结束 形参单元被释放 实参单元仍保留并维持原值特点 形参与实参占用不同的内存单元单向传递 例交换两个数 ch7 2 c includemain intx 7 y 11 printf x d ty d n x y printf swapped n swap x y printf x d ty d n x y swap inta intb inttemp temp a a b b temp 地址传递方式 函数调用时 将数据的存储地址作为参数传递给形参特点 形参与实参占用同样的存储单元 双向 传递实参和形参必须是地址常量或变量 ch9 3 c swap p1 p2 int p1 p2 intp p p1 p1 p2 p2 p main inta b scanf d d 例交换两个数 6 6函数的嵌套与递归调用嵌套调用C规定 函数定义不可嵌套 但可以嵌套调用函数 例求三个数中最大数和最小数的差值 includeintdif intx inty intz intmax intx inty intz intmin intx inty intz voidmain inta b c d scanf d d d Ch7 202 c intdif intx inty intz returnmax x y z min x y z intmax intx inty intz intr r x y x y return r z r z intmin intx inty intz intr r x y x y return r z r z 例用弦截法求方程根 运行情况 Inputx1 x2 2 6 Arootofequationis5 0000 递归调用定义 函数直接或间接的调用自身叫函数的递归调用 说明C编译系统对递归函数的自调用次数没有限制每调用函数一次 在内存堆栈区分配空间 用于存放函数变量 返回值等信息 所以递归次数过多 可能引起堆栈溢出 intf intx inty z z f y return 2 z 例求n的阶乘 ch7 8 c includeintfac intn intf if n 0 printf n 0 dataerror elseif n 0 n 1 f 1 elsef fac n 1 n return f main intn y printf Inputaintegernumber scanf d 例Hanoi问题 voidmove chargetone charputone printf c c n getone putone voidhanoi intn charone chartwo charthree if n 1 move one three else hanoi n 1 one three two move one three hanoi n 1 two one three main intm printf Inputthenumberofdisks scanf d D fengyi bkc power power c 6 7数组作为函数参数数组元素作函数实参 值传递 例两个数组大小比较 n 0m 0k 0 a和b为有10个元素的整型数组比较两数组对应元素变量n m k记录a i b i a i b i a i k 认为数组a b若n k 认为数组a b若n k 认为数组a b 数组名作函数参数地址传递在主调函数与被调函数分别定义数组 且类型应一致形参数组大小 多维数组第一维 可不指定形参数组名是地址变量 例求学生的平均成绩 includefloataverage intstu 10 intn voidmain intscore 10 i floatav printf Input10scores n for i 0 i 10 i scanf d floataverage intstu 10 intn inti floatav total 0 for i 0 i n i total stu i av total n returnav 实参用数组名 形参用数组定义 intstu 例数组元素与数组名作函数参数比较 includevoidswap2 intx inty intz z x x y y z main inta 2 1 2 swap2 a 0 a 1 printf a 0 d na 1 d n a 0 a 1 值传递 includevoidswap2 intx intz z x 0 x 0 x 1 x 1 z main inta 2 1 2 swap2 a printf a 0 d na 1 d n a 0 a 1 地址传递 例数组元素与数组名作函数参数比较 例数组排序 简单选择排序 9 49 i 0 例数组排序 简单选择排序 13 68 i 1 i 8 例数组排序 简单选择排序 例求二维数组中最大元素值 intmax value intarray 3 4 inti j k max max array 0 0 for i 0 imax max array i j return max main inta 3 4 1 3 5 7 2 4 6 8 15 17 34 12 printf maxvalueis d n max value a 例求二维数组中各行元素之和 get sum row intx 3 intresult introw intcol inti j for i 0 i row i result i 0 for j 0 j col j result i x i j main inta 2 3 3 6 9 1 4 7 intsum row 2 row 2 col 3 i get sum row a sum row row col for i 0 i row i printf Thesumofrow d d n i 1 sum row i 18 12 6 8变量的存储属性概述变量是对程序中数据的存储空间的抽象 编译或函数调用时为其分配内存单元 10 程序中使用变量名对内存操作 变量的属性数据类型 变量所持有的数据的性质 操作属性 存储属性存储器类型 寄存器 静态存储区 动态存储区生存期 变量在某一时刻存在 静态变量与动态变量作用域 变量在某区域内有效 局部变量与全局变量变量的存储类型auto 自动型register 寄存器型static 静态型extern 外部型变量定义格式 存储类型 数据类型变量表 6 8变量的存储属性概述变量是对程序中数据的存储空间的抽象 如 intsum autointa b c registerinti staticfloatx y 局部变量与全局变量局部变量 内部变量定义 在函数内定义 只在本函数内有效说明 main中定义的变量只在main中有效不同函数中同名变量 占不同内存单元形参属于局部变量可定义在复合语句中有效的变量局部变量可用存储类型 autoregisterstatic 默认为auto 全局变量 外部变量定义 在函数外定义 可为本文件所有函数共用有效范围 从定义变量的位置开始到本源文件结束 及有extern说明的其它源文件 应尽量少使用全局变量 因为 全局变量在程序全部执行过程中占用存储单元降低了函数的通用性 可靠性 可移植性降低程序清晰性 容易出错 定义说明次数 只能1次可说明多次位置 所有函数之外函数内或函数外分配内存 分配内存 可初始化不分配内存 不可初始化 外部变量说明 extern数据类型变量表 外部变量定义与外部变量说明不同 若外部变量与局部变量同名 则外部变量被屏蔽 外部变量可用存储类型 缺省或static floatmax min floataverage floatarray intn inti floatsum array 0 max min array 0 for i 1 imax max array i elseif array i min min array i sum array i return sum n main inti floatave score 10 Input ave average score 10 printf max 6 2f nmin 6 2f naverage 6 2f n max min ave externcharc1 c2 externcharc1 c2 运行结果 max 13 externinta b intmax intz z a b a b return z main printf max d max inta 13 b 8 运行结果 max 8 inti main voidprt for i 0 i 5 i prt voidprt for i 0 i 5 i printf c printf n 例外部变量副作用 运行结果 动态变量与静态变量存储方式静态存储 程序运行期间分配固定存储空间动态存储 程序运行期间根据需要动态分配存储空间内存用户区 生存期静态变量 从程序开始执行到程序结束动态变量 从包含该变量定义的函数开始执行至函数执行结束 变量存储类型 局部变量默认为auto型register型变量个数受限 且不能为long double float型局部static变量具有全局寿命和局部可见性局部static变量具有可继承性extern不是变量定义 可扩展外部变量作用域 例文件file1 cinta main f2 f1 f1 autointb f2 f2 staticintc 例auto变量的作用域 main intx 1 voidprt void intx 3 prt printf 2ndx d n x printf 1stx d n x voidprt void intx 5 printf 3thx d n x 运行结果 3thx 52ndx 31stx 1 main voidincrement void increment increment increment voidincrement void intx 0 x printf d n x 例局部静态变量值具有可继承性 运行结果 111 main voidincrement void increment increment increment voidincrement void staticintx 0 x printf d n x 运行结果 123 例变量的寿命与可见性 includeinti 1 main staticinta registerintb 10 intc 0 printf MAIN n printf i da d b dc d n i a b c c c 8 other printf MAIN n printf i da d b dc d n i a b c i i 10 other other staticinta 2 staticintb intc 10 a a 2 i i 32 c c 5 printf OTHER n printf i da d b dc d n i a b c b a Main i 1a 0b 10c 0 Other i 33a 4b 0c 15 Main i 33a 0b 10c 8 Other i 75a 6b 4c 15 8 4 33 15 4 43 6 75 15 6 main voidgx gy externintx y printf 1 x d ty d n x y y 246 gx gy voidgx externintx y x 135 printf 2 x d ty d n x y intx y voidgy printf 3 x d ty d n x y 例用extern扩展外部变量作用域 运行结果 1 x 0y 02 x 135y 2463 x 135y 246 例引用其它文件中的外部变量 例引用其它文件中的变量 输出a b和a的m次方
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!