




已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计 第3版 张磊编著清华大学出版社 C语言程序设计第6章函数程序设计 C语言程序设计 第3版 张磊编著21世纪高等学校规划教材清华大学出版社 C语言程序设计 第3版 张磊编著清华大学出版社 第6章数组程序设计 6 1函数概述6 2自定义函数示例6 3函数定义及调用6 4函数嵌套和递归函数6 5数组作为函数的参数6 6函数应用举例 C语言程序设计 第3版 张磊编著清华大学出版社 6 1函数概述 C语言程序的特点 函数化结构函数分类 系统函数 用户函数系统函数 printf scanf sqrt 等用户函数 在程序中编写的函数 又称自定义函数 用户函数的特例 main 函数如果在程序中经常需要某种处理 就可以编写一个函数 在需要这种处理时 就调用该函数 示例计算a b c C语言程序设计 第3版 张磊编著清华大学出版社 6 2自定义函数示例 例6 1编程计算表达式a b c 的值 程序结构只有main 函数的阶乘程序 includevoidmain inta b c i longt sum printf Inputa b c scanf d d d 使用自定义函数的阶乘程序 includevoidmain longf intn inta b c i printf Inputa b c scanf d d d 求n 函数 调用函数f 求c C语言程序设计 第3版 张磊编著清华大学出版社 6 3函数的定义及调用 6 3 1函数的定义6 3 2函数值和return命令6 3 3函数调用 C语言程序设计 第3版 张磊编著清华大学出版社 6 3 1函数定义 函数定义的一般格式函数类型函数名 形式参数表 函数体 形式参数表的格式数据类型变量1 数据类型变量2 数据类型变量n 函数的值的类型 C语言程序设计 第3版 张磊编著清华大学出版社 例6 2定义连续输出50个 字符的函数 voidp star50 void inti for i 1 i 50 i putchar 6 3 1函数定义 无形参 有形参 例6 3定义连续输出n个 字符的函数 voidp star intn inti for i 1 i n i putchar C语言程序设计 第3版 张磊编著清华大学出版社 6 3 2函数值和return命令 函数值是函数执行后带回的一个结果函数值通过函数体中return命令获得 return一般格式return 表达式 或 return表达式 C语言程序设计 第3版 张磊编著清华大学出版社 6 3 2函数值和return命令 例6 4定义求两个实数的最大数函数max C语言程序设计 第3版 张磊编著清华大学出版社 6 3 2函数值和return命令 例6 5 intsum intn ints i for s 0 i 1 i n i s i return s C语言程序设计 第3版 张磊编著清华大学出版社 6 3 3函数调用 1 函数原型和函数声明 函数原型函数原型是是定义函数时函数体以外的那些内容 一般形式 函数类型函数名 数据类型1形参1 类型2形参2 类型n形参n 简化形式 函数类型函数名 数据类型1 数据类型2 数据类型n 函数声明函数声明是在主调函数的函数体说明部分描述被调函数原型 函数调用函数调用是对已定义函数的具体应用 一般形式 函数名 实参表 C语言程序设计 第3版 张磊编著清华大学出版社 6 3 3函数调用 programe6 6 c includevoidmain voidp star50 void intk for k 1 k 20 k p star50 putchar n 例6 6调用p star50 函数 连续输出20行 字符串 每行50个 字符 voidp star50 void inti for i 1 i 50 i putchar return 函数原型及函数声明 函数调用 C语言程序设计 第3版 张磊编著清华大学出版社 6 3 3函数调用 programe6 7 c includevoidmain voidp star intn intk for k 1 k 5 k p star k putchar n 例6 7调用p star 函数 输出 字符图案 voidp star intn inti for i 1 i n i putchar return 函数原型及函数声明 函数调用 函数定义 函数实参 函数形参 C语言程序设计 第3版 张磊编著清华大学出版社 6 3 3函数调用 例6 8调用求和函数sum 计算表达式 programe6 8 c includevoidmain intsum int printf d n sum 20 sum 50 intsum intn ints i for s 0 i 1 i n i s i return s C语言程序设计 第3版 张磊编著清华大学出版社 6 3 3函数调用 函数调用的三种形式 当被调用函数为void类型时 函数无返回值 函数调用是一个独立的语句 当被调用函数有返回值时 函数调用出现在表达式中 是表达式的一部分 函数调用也可以作为一个函数的实参 例6 9利用求两个数的最大数函数max 求得三个数的最大数 includevoidmain floatmax float float floata b c printf a b c scanf f f f 函数调用作为函数的实参 C语言程序设计 第3版 张磊编著清华大学出版社 6 3 3函数调用 注意函数调用时 实参和形参按照在参数表中的位置对应传值 例6 10编写输出n个连续的任意字符的函数p string 并调用该函数输出一个5行的 三角形图案 includevoidmain voidp string int char intk for k 1 k 5 k p string k putchar n voidp string intn charch inti for i 1 i n i putchar ch return 按位置对应传送 C语言程序设计 第3版 张磊编著清华大学出版社 6 4函数嵌套和递归函数 6 4 1函数嵌套6 4 2递归函数 C语言程序设计 第3版 张磊编著清华大学出版社 6 4 1函数嵌套 函数嵌套是指在一个用户函数的函数体中 又出现了另外用户函数的调用 如函数a调用函数b 函数b又调用函数c等 includevoidmain longfac int longcmn int int intm n printf m n scanf d d C语言程序设计 第3版 张磊编著清华大学出版社 6 4 1函数嵌套 C语言程序设计 第3版 张磊编著清华大学出版社 6 4 2递归函数 C语言程序设计 第3版 张磊编著清华大学出版社 6 4 2递归函数 例6 12用递归函数计算累加和 用递归公式描述问题设累加和用函数sum n 表示 将递归公式函数化直观而言 上述递归公式给出了sum n 的两种取值 即 n为1时 其值为1 n 1时 其值为sum n 1 n 由此 定义递归函数 longsum intn if n 1 return 1 elsereturn sum n 1 n C语言程序设计 第3版 张磊编著清华大学出版社 6 4 2递归函数 计算sum 3 的处理过程 高到低进行递推描述 调用sum 3 将其描述为sum 2 3 调用sum 2 将其描述为sum 1 2 调用sum 1 问题已到最低层 有确定值 sum 1 1 由低到高逐级求得上层结果 由sum 1 2求得sum 2 由sum 2 3求得sum 3 完整程序代码 includevoidmain longsum int intn printf n scanf d C语言程序设计 第3版 张磊编著清华大学出版社 6 4 2递归函数 2 非公式递归问题有的问题不能直接用一个递归公式进行描述 但可以用递归方法进行描述 我们将其归类为非公式递归问题 例6 14汉诺塔问题 有三个柱和n个大小各不相同的盘子 开始时 所有盘子以塔状叠放在柱A上 要求按一定规则 将柱A上的所有盘子移动到柱B上 柱C为移动缓冲住 移动规则 一次只能移动一个盘子 任何时候不能把盘子放在比它小的盘子的上面 C语言程序设计 第3版 张磊编著清华大学出版社 6 4 2递归函数 汉诺塔问题递归实现过程若只有一个盘子 则直接从A移到B 问题结束 若有n n 1 个盘子 则须经过如下三个步骤 第一步 按照移动规则 把A上面的n 1个盘子 移到C 第二步 将A上仅有的一只盘子 也就是最大的一只 直接移到柱B上 第三步 用第一步所述方法 将C柱上的n 1个盘子移到B柱上 与第一步一样 这一步实际上是由一系列更小的一次仅移一个盘子的操作组成 汉诺塔问题的递归算法 hanoi n个盘 A B 缓柱C if n 1 直接从A移到Belse hanoi n 1个盘 A C 缓柱B 移动n号盘子 A Bhanoi n 1个盘 C B 缓柱A includevoidmain intdisks voidhanoi int char char char printf Numberofdisks scanf d C语言程序设计 第3版 张磊编著清华大学出版社 6 5数组作为函数的参数 6 5 1数组元素作为函数参数6 5 2一维数组名作为函数参数6 5 3用一维数组求解二维数组问题 数组作为函数参数的目的 是为了实现数组数据在函数间的传送 C语言程序设计 第3版 张磊编著清华大学出版社 6 5 1数组元素作为函数参数 数组元素作为函数的参数时 只传送作为实参的数组元素 此时按使用其他简单变量的方法使用数组元素 例6 15把一个整型数组的所有素数找出来 求解问题的思路 设计判断素数的函数prime 函数原型 intprime intk 当k为素数时 函数值为1 否则 函数值为0 在主函数main 中建立一个自然数数组natural 然后用它的每一个数组元素调用prime 函数求素数 intprime intk intsk i intflag 1 sk sqrt k for i 2 i sk i if k i 0 flag 0 break return flag defineN10 include includevoidmain intprime int inti natural N printf Data for i 0 i N i scanf d 数组元素作函数参数 C语言程序设计 第3版 张磊编著清华大学出版社 6 5 2一维数组名作为函数参数 数组名的实质就是数组的首地址 数组名作为函数参数时传送的是数组的开始地址 是一种传址调用 形参数组和实参数组要在各自的函数中进行等同的定义 例6 16定义求一维数组最大元素值的函数v max 并在主函数中调用它求数组元素的最大值 C语言程序设计 第3版 张磊编著清华大学出版社 6 5 2一维数组名作为函数参数 programe6 16 c include defineN10voidmain intv max inta N intdata N i printf Data for i 0 i N i scanf d intv max inta N inti intmax a 0 for i 1 i N i if max a i max a i return max v max 函数调用开始时的数组状态 C语言程序设计 第3版 张磊编著清华大学出版社 6 5 2一维数组名作为函数参数 programe6 16 1 c include defineN10voidmain voidinput int int intv max int int intdata 50 printf Data input N data printf Max d n v max N data intv max intn inta inti intmax a 0 for i 1 i n i if max a i max a i return max voidinput intn inta inti for i 0 i n i scanf d 程序改进 注意数组参数的变化 C语言程序设计 第3版 张磊编著清华大学出版社 6 5 3用一维数组求解二维数组问题 二维数组在内存中按行逐列存储 各个数组元素依次占用连续的存储单元 存储后的状态与一维数组是没有区别的 因此 可以用一个对应的一维数组来处理二维数组 以2 2数组example为例说明二维数组与一维数组的关系 二维数组example可视为由example 0 和example 1 两个元素构成的一维数组 example 0 是example第0行的一维数组 example 1 是example第1行的一维数组 数组example的首地址可用example 0 表示 若把一维数组p映射到m n的二维数组example的存储空间 则二维数组元素和一维数组元素有如下对应关系 example i j 对应于p i n j C语言程序设计 第3版 张磊编著清华大学出版社 6 5 3用一维数组求解二维数组问题 例6 17求下列3 4矩阵的所有元素的和 programe6 17 c includevoidmain intsum array int int int intarr 3 4 16 27 8 6 17 21 5 19 66 9 58 86 printf Sum d n sum array 3 4 arr 0 intsum array intm intn inta inti s 0 for i 0 i m n i s a i return s C语言程序设计 第3版 张磊编著清华大学出版社 6 6函数应用举例 6 6 1计算长方体的面积6 6 2利用递归函数计算Fibonacci数列6 6 3排序函数的设计与应用 C语言程序设计 第3版 张磊编著清华大学出版社 6 6 1计算长方体的面积 例6 18设计一个计算矩形面积的函数 并调用该函数计算长方体的面积 问题分析 设矩形面积函数为area 原型 floatarea foat float 设长方体的长 宽 高分别为a b c 面积为s s 2 area a b area b c area a c 设计主函数main 在其中输入a b c 然后调用area 计算长方体面积 并输出结果 includevoidmain floatarea float float floata b c s printf a b c scanf f f f C语言程序设计 第3版 张磊编著清华大学出版社 6 6 2利用递归函数计算Fibonacci数列 例6 19计算Fibonacci数列的第n个数 问题分析与算法设计 描述计算Fibonacci数的递归公式 根据fib n 的递归公式 设计递归函数longfib intn 在主函数main 中输入数据n 然后调用fib 函数求得第n个Fibonacci数 并输出结果 programe6 19 c includevoidmain longfib int intn printf n scanf d C语言程序设计 第3版 张磊编著清华大学出版社 6 6 3排序函数的设计与应用 例6 20设计一个对一维数组排序的sort 函数 并调用它实现数组排序 问题分析与算法设计 设计排序函数sort 排序算法使用冒泡排序法 sort 函数原型voidsort int int 设计input 实现数组输入 设计output 实现数组输出 函数原型 voidinput int int voidoutput int int 设计主函数mian 在其中定义数组data 调用input 函数建立data数组 调用output 函数输出data数组 调用sort 函数对data数组排序 调用output 函数输出排序后的结果 实现程序 programe6 20 c include defineN10voidmain voidsort int int voidinput int int voidoutput int int inti data N input N data output N data sort N data output N data voidinput intn inta inti for i 0 ia j 1 temp a j a j a j 1 a j 1 temp C语言程序设计 第3版 张磊编著清华大学出版社 6 7变量的作用域和存储类型 6 7 1变量的作用域6 7 2变量的存储类型 C语言程序设计 第3版 张磊编著清华大学出版社 6 7 1变量的作用域 1 局部变量在函数体内定义的变量称为局部变量 也称为内部变量 局部变量只能在定义它的函数中使用 例6 21局部变量举例 includevoidmain voidp star50 void inti for i 1 i 20 i p star50 putchar n voidp star50 void inti for i 1 i 50 i putchar return C语言程序设计 第3版 张磊编著清华大学出版社 6 7 1变量的作用域 2 全局变量全局变量是在函数之外定义的变量 在任何一个函数之外的位置 都可以定义全局变量 在一个程序中 凡是在全局变量之后定义的函数 都可以使用在其之前定义的全局变量 因此 一个全局变量 可以被多个函数使用 但并不一定能被所在程序中的每一个函数使用 全局变量也有一定的作用范围 C语言程序设计 第3版 张磊编著清华大学出版社 6 7 1变量的作用域 例6 22局部变量和全局变量示例 programe6 22 c includeinta 3 b 5 voidmain intmax int int inta 8 printf MAX d n max a b intmax intm intn return m n m n 定义全局变量 定义局部变量 局部变量 全局变量 C语言程序设计 第3版 张磊编著清华大学出版社 6 4 2变量的存储类型 1 auto型变量auto型变量通常称为自动变量 只有函数的局部变量才能定义为auto型 auto型变量在函数被调用时为其分配存储空间 存储于内存的动态存储区 函数执行结束时存储空间自动释放 auto型变量在赋值以前 具有不确定的值 auto型变量的定义形式auto数据类型变量名 在定义局部变量时 如果缺省存储类型项 则系统默认为存储类型是auto型 2 static型变量定义的形式static数据类型变量名 在函数内定义的静态变
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025国考保定市林业草原岗位申论题库含答案
- 2025国考临汾市外交业务岗位申论必刷题及答案
- 2025年德州市中考英语试卷真题(含答案)
- 2025国考南京市资产管理岗位申论预测卷及答案
- 2025国考阳泉市证券监管岗位行测高频考点及答案
- 2025国考安徽金融监管局申论综合分析题库含答案
- 2025国考乌兰察布市证券监管岗位行测高频考点及答案
- 2025国考通辽市林业草原岗位行测必刷题及答案
- 2025国考福建移民管理局申论模拟题及答案
- 2025国考陕西金管法律专业科目题库含答案
- 垃圾分类科普课件
- 热机的效率计算题1
- DB32T 3794-2020 工业园区突发环境事件风险评估指南
- 高中历史:两宋文化课件
- 汽轮机焊接技术手册
- 审计工作底稿(会计师事务所)
- 新北师大单元分析五上第四单元《多边形面积》单元教材解读
- 高质量SCI论文入门必备从选题到发表全套课件
- 大学生毕业怀旧同学聚会致青春留念电子相册ppt课件
- 初中化学说课汇编
- 企业废品回收招标书1
评论
0/150
提交评论