C语言第部分.ppt_第1页
C语言第部分.ppt_第2页
C语言第部分.ppt_第3页
C语言第部分.ppt_第4页
C语言第部分.ppt_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章函数 C语言程序设计 2 学习目标与要求 1 掌握C语言函数的定义2 掌握C程序调用函数的方法3 了解递归函数的用法4 掌握宏定义和文件包含的使用方法 C语言程序设计 3 本章要点 函数概要函数的定义函数的参数和函数的值函数的调用函数的嵌套调用函数的递归调用数组作为函数参数局部变量和全局变量变量的存储类别预处理命令 C语言程序设计 4 5 1函数概要 一个C程序可由一个主函数和若干个函数构成 由主函数调用其他函数 其他函数也可以互相调用 同一个函数可以被一个或多个函数调用任意多次 一个C程序只能有一个也必须有一个main函数 而子函数的数目实际上是不限的 C语言程序设计 5 示意图 C语言程序设计 6 函数的分类 按用户使用分类 1 标准 2 自定义函数按函数形式分类 1 无参函数 2 有参函数 5 1函数概要 C语言程序设计 7 5 2函数的定义 无参函数的定义形式类型标识符函数名 声明部分语句 有参函数定义的形式类型标识符函数名 形式参数表列 声明部分语句 空函数dummy intmax intx inty intz z x y x y return z C语言程序设计 8 5 3函数参数和函数的值 形式参数和实际参数形参 在定义函数时 函数名后面括号中的变量称为形式参数实参 在调用函数时 函数名后面括号中的参数 可以是表达式 称为 实际参数 说明 例5 1 C语言程序设计 9 函数的返回值返回值的方式 通过return语句返回 可以有一条返回语句 也可以有多条返回语句 也可以没有返回语句 return语句的一般形式为 return 表达式 返回值的类型一般应和函数类型一致 如不一致 则以函数型为准 即函数类型决定返回值的类型 为了明确表示 不带回值 可以用 void 定义 无类型 5 3函数参数和函数的值 例5 2 C语言程序设计 10 main inta b c scanf d d 程序运行情况输入 7 8结果 Maxis12 例5 1调用函数时的数据传递 调用结束后 调用时 C语言程序设计 11 intmax floatx floaty floatz z为实型变量 z x y x y return z main floata b intc scanf f f 程序运行情况 1 5 2 5Maxis2 例5 2返回值类型与函数类型不同 C语言程序设计 12 5 4函数的调用 函数调用的一般形式函数名 实参表列 函数调用的方式1 函数语句如 printstar 2 函数表达式如 c 2 max a b 3 函数参数如 m max a max b c 例5 3 例5 4 C语言程序设计 13 对被调用函数的声明和函数原型函数声明是对所用到的函数的特征进行必要的声明 编译系统以函数声明中给出的信息为依据 对调用实际参数进行控制 以保证调用表达式与函数之间的参数正确传递 函数声明的格式 类型标识符函数名 类型标识符形参 类型标识符形参 在下列情况下可以缺省函数声明 1 被调函数出现在主调函数之前 2 函数返回值为int类型 3 在所有函数定义之前 在函数的外部已做了函数声明 5 4函数的调用 C语言程序设计 14 intf inta intb 函数定义 intc if a b c 1 elseif a b c 0 elsec 1 return c main inti 3 p j 2 p f i j 函数调用 printf d n p 程序运行结果 0 例5 3函数调用和函数定义 C语言程序设计 15 main floatadd floatx floaty floata b c scanf f f 程序运行情况 输入3 6 6 5结果 sumis10 100000 例5 4对被调用的函数作声明 C语言程序设计 16 5 5函数的嵌套调用 C语言不能嵌套定义 即在定义一个函数时 其函数体内不能包含另一个函数的定义 但可以嵌套调用函数 在调用一个函数的过程中又调用另一个函数 例5 5 C语言程序设计 17 例5 5函数的嵌套调用 main intn 3 printf d n sub1 n intsub1 intn inti a 0 for i n i 0 i a sub2 i returna intsub2 intn returnn 1 程序输出结果 9 C语言程序设计 18 5 6函数的递归调用 递归的基本概念递归调用 在调用一个函数的过程中又出现直接或间接地调用该函数本身 称为函数的递归调用 递归函数 在函数体内调用该函数本身 例如 直接调用sub函数本身 intsub intx inty z if z sub y else return C语言程序设计 19 数值型问题递归函数的编程方法对于数值型问题 首先要找出解题的数学公式 这个公式必须是递归定义的 且所处理的对象要有规律地递增或递减 然后确定递归结束条件 例5 6 5 6函数的递归调用 C语言程序设计 20 例5 6编一递归函数求n 思路 以求4的阶乘为例 4 4 3 3 3 2 2 2 1 1 1 0 1 递归公式 递归结束条件 当n 1或n 0时 n 1 动画演示 C语言程序设计 21 f 4 的执行过程 程序示例 C语言程序设计 22 有些问题不能直接用数学公式求解 非数值问题比数值问题更难找出递归算法 它不能用一个递归公式表示 首先要把问题由繁化简 由大化小 而某个小问题的解法与原问题解法相同 并且越来越简单直到有确定的解 例5 7 5 6函数的递归调用 非数值型问题递归函数的编程方法 C语言程序设计 23 例5 7编制一递归函数 将一个十进制正整数 如 15613 转换成八进制数形式输出 思路 十进制整数转换成八进制整数的方法是除8逆向取余 余数 商 15613 8 515613 8 19511951 8 71951 8 243243 8 3243 8 3030 8 630 8 33 8 33 8 0结果 36375 该题实际上是要把一个十进制数除以8得到的余数逆向输出 就是先得到的余数后输出 最后得到的余数最先输出 我们先由大化小 求八进制数变成求一系列余数的问题 求第一个余数是将15613除以8取余 因为先得到的余数后输出 所以把这个余数存在一个变量m中 接下去求下一个余数 和求第一个余数的方法相同 只是被除数变成了15613除以8的整数商1951 因此 这是一个递归调用的问题 定义变量m存放余数 x存放被除数 C语言程序设计 24 先求出余数m m x 8 求x除以8取余后的整数商 x x 8 如果x不等于0 递归调用该函数 否则执行 输出余数m 返回调用点 递归算法描述如下 例5 7编制一递归函数 将一个十进制正整数 如 15613 转换成八进制数形式输出 C语言程序设计 25 include stdio h voiddtoo intx intm m x 8 x x 8 if x 0 dtoo x printf d m 例5 7编制一递归函数 将一个十进制正整数 如 15613 转换成八进制数形式输出 main intn scanf d 程序运行情况 15613 15613 36375 8 C语言程序设计 26 5 7数组作为函数参数 数组元素作函数实参数组名作函数参数用多维数组名作函数参数 例5 8 例5 9 说明 例5 11 例5 10 C语言程序设计 27 有两个数组a b 各有10个元素 将它们对应地逐个相比 即a 0 与b 0 比 如果a数组中的元素大于b数组中的相应元素的数目多于b数组中元素大于a数组中相应元素的数目 如a i b i 6次 b i a i 3次 其中i每次为不同的值 则认为a数组大于b数组 并分别统计出两个数组相应元素大于 等于 小于的次数 例5 8数组元素作为函数实参举例说明 C语言程序设计 28 程序运行情况 enterarraya 1357986420enterarrayb 5389 1 35604a i b i 4timesa i b i 1timesa i b i 5timesarrayaissmallerthanarrayb 例5 8数组元素作为函数实参举例说明 程序示例 C语言程序设计 29 数组名作为参数的说明 在普通变量或下标变量作函数参数时 形参变量和实参变量是由编译系统分配的两个不同的内存单元 在函数调用时发生的值传送是把实参变量的值赋予形参变量 在用数组名作函数参数时 不是进行值的传送 即不是把实参数组的每一个元素的值都赋予形参数组的各个元素 因为实际上形参数组并不存在 编译系统不为形参数组分配内存 前面曾介绍过 数组名就是数组的首地址 因此在数组名作函数参数时 实际是把实参数组的首地址赋予形参数组名 形参数组名取得该首地址之后 也就等于有了实在的数组 实际上是形参数组和实参数组为同一数组 共同拥有一段内存空间 C语言程序设计 30 数组名作为参数的说明 上图说明了这种情形 图中设a为实参数组 类型为整型 a占有以2000为首地址的一块内存区 b为形参数组名 当发生函数调用时 进行地址传送 把实参数组a的首地址传送给形参数组名b 于是b也取得该地址2000 于是a b两数组共同占有以2000为首地址的一段连续内存单元 从图中还可以看出a和b下标相同的元素实际上也占相同的两个内存单元 整型数组每个元素占二字节 例如a 0 和b 0 都占用2000和2001单元 当然a 0 等于b 0 类推则有a i 等于b i C语言程序设计 31 例5 9编程序 实现字符串连接 算法思想 将s2字符串连接到s1字符串后 s1 0 s1 1 s1 i 1 s1 i s1字符串 while s1 i 0 i S2字符串 k 0 while s2 k 0 s1 i s2 k i k s2 0 s2 1 C语言程序设计 32 例5 9编程序 实现字符串连接 scat函数还可简化为 voidscat charstr1 charstr2 inti 0 k 0 while str1 i i while str1 i str2 k 程序运行情况 Inputs1 IamInputs2 teacher Outputs1 Iamteacher Outputs2 teacher 程序示例 C语言程序设计 33 用选择法对数组中十个整数进行由小到大排序 排序的算法如下 1 先从b 0 b 9 的十个整数中找出最小的数 与元素b 0 交换 2 接下来在从b 1 b 9 的九个整数中找出最小的数 与元素b 1 交换 依次类推 每一次比较 减少比较一个数 共比较九次 剩下最大的数留在b 9 例5 10数组名作函数参数举例说明3 C语言程序设计 34 以5个整数的排序为例 说明选择法的比较过程 例5 10数组名作函数参数举例说明3 C语言程序设计 35 voidsort intb intn inti j k t for i 0 i n 1 i k i for j i 1 j n j if b j b k k j t b k b k b i b i t 例5 10数组名作函数参数举例说明3 main inta 10 i printf enterthearray n for i 0 i 10 i scanf d C语言程序设计 36 图7 3调用sort函数 2000 b 形参b实际是一个可以存放地址的变量 a 2000 实参赋给形参 例5 10数组名作函数参数举例说明3 C语言程序设计 37 用多维数组名作函数参数的说明 多维数组元素与一维数组元素一样 可以看作一个变量 所以在调用函数时可以作为实参 进行值的传递 用多维数组名作为函数参数传递的是数组首元素的地址 要求形参是相同类型的同维数组 这里 形参是二维数组时 第二维的大小 长度 必须指明 而第一维的大小长度 可以指明 也可以不指明 如 intarray 3 10 或intarray 10 以下表示是错误的 intarray 或intarray 3 C语言程序设计 38 例5 11编程序 将矩阵转置 思路 将a 0 0 b 0 0 a 0 1 b 1 0 a 0 2 b 2 0 a 1 0 b 0 1 a i j b j i 设转置前为a矩阵 转置后为b矩阵 如下所示 程序示例 C语言程序设计 39 5 8局部变量和全局变量 局部变量在一个函数内部定义的变量 它只在本函数范围内有效 也就是说只有本函数才能调用它 说明 在主函数中定义的变量也只在主函数中有效 不同函数可以使用相同名字的变量 形式参数也是局部变量 在一个函数内部的复合语句中定义的变量只在本复合语句中有效 全局变量在函数之外定义的变量称为外部变量 它可以为本文件中其他函数所共用 它的有效范围从定义变量的位置开始到本源文件结束 说明 在同一个源文件中 外部变量与局部变量同名 则在局部变量的作用范围内 外部变量被 屏蔽 图示说明 例5 12 C语言程序设计 40 全局变量的图示说明 C语言程序设计 41 局部变量a作用范围全局变量b作用范围 程序运行情况 8 例5 12外部变量与内部变量同名举例 C语言程序设计 42 5 9变量的存储类别 动态存储方式和静态存储方式静态存储方式 全局变量 静态局部变量static动态存储方式 函数形参 自动变量 函数调用时的现场保护和返回地址 自动变量 auto变量函数中的局部变量没有用static声明 都是自动变量 调用该函数时系统给他们分配存储空间 函数调用结束时这些存储空间被自动释放 静态局部变量 static变量函数中的局部变量的值在函数调用结束后不消失而保留原值 即起占用的存储单元不释放 在下一次调用该函数时 该变量已有值 就是上一次函数调用结束时的值 例5 13 C语言程序设计 43 f inta autob 0 staticc 3 函数f中静态局部变量c static b b 1 c c 1 returna b c main inta 2 for i 0 i 3 i printf d f a 程序运行结果 789 例5 13静态局部变量的值 C语言程序设计 44 函数调用过程中 各变量值的变化图示 例5 13静态局部变量的值 C语言程序设计 45 5 10预处理命令 宏定义文件包含条件编译 C语言中的编译预处理命令有 所有的预处理命令以符号 开头 并且每个预处理命令必须单独占一行 不使用分号作为结束符 C语言程序设计 46 宏定义 无参宏定义定义的一般形式为 define标识符字符串例如 definePI3 1415926带参宏定义带参宏定义的一般形式为 define宏名 形参表 字符串在字符串中含有各个形参 带参宏调用的一般形式为 宏名 实参表 如 defineS a b a barea S 3 2 5 例5 14 例5 15 C语言程序设计 47 defineR3 0 definePI3 1415926 defineL2 PI R defineSPI R Rmain printf L f nS f n L S 程序运行情况 L 18 849556S 28 274333 例5 14无参宏定义 说明 宏定义必须写在函数之外 其作用域为宏定义命令起到源程序结束 如要终止其作用域可使用 undef命令 在进行宏定义时 可以引用已定义的宏名 可以层层置换 C语言程序设计 48 definePI3 1415926 defineCIRCLE R L S V L 2 PI R S PI R R V 4 0 3 0 PI R R Rmain floatr l s v scanf f 程序运行情况 输入 3 5输出 r 3 50 l 21 99 s 38 48 v 179 59 例5 15带参宏定义 C语言程序设计 49 文件包含 文件包含

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论