132-5-1计算机程序计-第5章 函数(zpyang).ppt_第1页
132-5-1计算机程序计-第5章 函数(zpyang).ppt_第2页
132-5-1计算机程序计-第5章 函数(zpyang).ppt_第3页
132-5-1计算机程序计-第5章 函数(zpyang).ppt_第4页
132-5-1计算机程序计-第5章 函数(zpyang).ppt_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

计算机程序设计 第5章函数主讲 杨振平E mail zpyang 2011 2012第2学期 1 主要内容 函数定义与调用参数传递形式 值 引用和指针 数组作函数参数递归函数重载函数局部变量和全局变量 2 5 1函数定义与调用 C 语言程序的结构特点 程序整体由一个或多个称为函数的程序块组成每个函数都具有各自独立的功能和明显的界面 3 一 函数定义格式 1 函数定义的一般格式 doublegrav doublem1 doublem2 doubledistance 例 4 函数定义 续 1 返回数值类型名 int long float double char等简单类型 2 返回引用 指针值引用型 如 int 指针型 如 int 3 使用void 表示函数没有返回值 2 函数值类型 即函数返回值类型 函数中使用return语句一次只能返回一个值 5 函数定义 续 函数中的形参与调用函数时实参相对应 实现不同函数之间数据的传递 参数个数根据需要设定 形参属于函数的局部变量 仅在该函数体中起作用 形参是在函数被调用时分配存储空间 同时接收调用函数传递的实参值 当函数执行结束后 形参分配的空间立刻释放 1 形参 3 形式参数 6 函数定义 续 例 函数grav从主调函数中接收三个double数据 且返回计算结果double型 说明如下 doublegrav doublem1 doublem2 doubledistance 错误的定义形式 doublegrav doublem1 m2 distance 2 形参声明格式 7 函数定义 续 由 括起来 是函数的主体与主函数一样 可以定义自己的变量 数组等可以使用三种控制结构 可以调用其它函数可以使用return语句 返回函数值并结束函数的执行 4 函数体 8 例5 1判断整数n是否为 素数 算法思路 除1和其本身外 如果在2到n 1之间 又能找到一个约数 则说明n不是素数 如果找不到任何一个约数 则说明n是素数 cin n for i 2 i n 1 i if n i 0 break break终止for语句的执行if i n cout n 是素数 endl elsecout n 不是素数 endl 素数 只有1和其本身两个约数 判断 素数n 的函数 isPrime intisPrime intn inti for i 2 i n 1 i if n i 0 return0 return1 intisPrime intn inti m m int sqrt n for i 2 i m i if n i 0 return0 return1 效率更高 函数框架 10 例 调用判 素数n 的函数 输出2 100之间的所有素数 关键算法 for inti 2 i 100 i if isPrime i 1 cout i t isPrime i 11 二 函数调用 2 调用方式无返回值调用 函数名 实参表 独立的一个语句有返回值调用 有返回值的函数调用通常作为表达式的一个运算成分 1 函数调用 控制执行某个函数 C 中 除了main函数外 其他任何函数都是通过主函数直接或间接进行调用 3 实参调用函数时 提供给各个形参的数据 其中实参可以是常量 具有值的变量或表达式 一般情况 实参与形参的个数相等 类型一致 12 函数调用执行过程示意 13 5 2参数传递形式 值 引用和指针 C 有三种参数传递方式 值传递引用传递指针传递 14 一 值传递 编程时 如果仅需将实参的值传递给形参 而对形参值的任何修改都不会影响实参的值 形参特点 形参为某个基本数据类型的简单变量 而实参允许同类型的常数 变量以及表达式 好处 减少函数之间的数据依赖 增强了函数自身的独立性 例如 voidswap intx inty 形参x和y均为值传递参数 Example5 3 交换两个变量的值voidswap intx inty inttmp tmp x x y y tmp 例5 3分析交换两个变量值的函数 intmain inta 1 b 2 cout Beforeexchange a a b b endl swap a b cout Afterexchange a a b b endl return0 16 结果显示如下 结果中a b值没有改变 调用语句 swap a b 中的实参变量 函数swap intx inty 中的形参变量 1 2 1 2 a b x y 2 1 交换 18 二 引用传递 1 引用的概念引用是一种特殊的变量 它被认为是另一变量的别名 在C 中 使用运算符 说明一个引用 变量 使用引用与使用被引用的变量效果相同 引用作为函数形参 不仅可访问实参变量值 也可以改变实参变量的值 例如 inti 2 refi refi 6 cout i i endl 结果 i 8 irefi 2 8 例5 4利用引用编写交换函数swap 参数x y设为引用 实参a 实参b 1 2 形参x引用a 形参y引用b 2 1 20 5 3数组作函数参数 1 数组元素作为函数的实参形参只能为简单变量名 不能为数组 采用值传递方式 2 数组名作为函数的实参形参为类型相同的数组 采用指针传递 即函数中对形参数组的操作就是对主调函数中实参数组的操作 21 例5 5编写对多个字符串排序的函数 使用string类型数组 Example5 5 交换排序voidbubble up stringstr intcount inti j stringtmp for i 0 ii j j 1 找第i轮的最小值if str j 1 str j tmp str j 1 str j 1 str j str j tmp str 测试排序的主程序 intmain inti stringnames 5 Wang Li Zhao Chen Yang cout 原数组是 endl for i 0 i 5 i cout names i cout endl bubble up names 5 函数调用cout 对整个数组排序后的结果是 endl for i 0 i 5 i cout names i cout endl return0 Wang Li Zhao Chen Yang 实参 names 0 1 2 3 4 形参 str 形参数组与实参数组共用存储单元 形参数组实际访问实参数组的值 Wang Li Zhao Chen Yang 实参 names 0 1 2 3 4 形参 str 排序后 25 例5 5编写对多个字符串排序的函数 使用字符数组 Example5 5 交换排序voidbubble up charstr 21 intcount inti j chartmp 21 for inti 0 ii j j 1 if strcmp str j 1 str j 0 strcpy tmp str j 1 strcpy str j 1 str j strcpy str j tmp str 21 测试排序的主程序 intmain inti charnames 5 21 cout names i bubble up names 5 函数调用cout 从小到大排序后的结果是 endl for i 0 i 5 i cout names i endl cout endl return0 递归函数是直接或间接地调用了自身的函数 f f f g g f 直接递归调用 间接递归调用 5 4递归函数 间接递归调用 直接递归调用 数学中的递归函数 即用函数自身的简单情况定义自己 1n 0fac n n fac n 1 n 0 例 阶乘函数 递归定义中包含 递归形式的描述 递归结束的条件 fac n 1 mn 0gcd m n gcd n m n n 0求斐波那契数列的第n项值0n 1fib n 1n 2fib n 1 fib n 2 n 2 计算两个正整数的最大公因数 例5 6采用递归算法求n 算法 1n 0n fac n n fac n 1 n 0函数代码如下 intfac intn if n 0 不能求负数的阶乘return 1 elseif n 0 0的阶乘为1return1 elsereturnn fac n 1 n 为n乘以 n 1 测试主函数 intmain intm 5 cout m fac m endl 计算5 return0 intfac intn if n 0 return 1 elseif n 0 return1 elsereturnn fac n 1 fac 5 5 fac 4 4 fac 3 3 fac 2 2 fac 1 1 fac 0 递推 回归 1 2 6 24 120 1n 10f n 2 f n 1 1 1 n 10 猴子在第一天摘下若干个桃子 当即就吃了一半 又感觉不过瘾 于是就多吃了一个 以后每天如此 到第10天时 就只剩下了一个桃子 请编程计算第一天猴子摘的桃子个数 例5 7 求解猴子吃桃问题 函数代码 intf intn if n 10 return1 if n 1 5 5函数重载 在一个程序中允许定义多个 同名函数 实现同一类操作 重载函数的特征 函数名相同参数的个数或参数的类型有区别 当某个函数中调用到重载函数时 编译器会根据实参的类型去对应地调用相应的函数 匹配过程如下 1 如果有严格匹配的函数 就调用该函数 2 参数内部转换后如果匹配 调用该函数 3 通过用户定义的转换寻求匹配 例5 8重载找两个数中大数的函数 整数intmax intx inty returnx y x y 双精度型doublemax doublex doubley returnx y x y 长整型longmax longx longy returnx y x y intmain intai bi doublead bd longal bl cin ai bi cout ad bd cout al bl cout max al bl endl return0 37 5 6局部变量和全局变量 1 局部变量在函数内或块内定义的变量称为局部变量 局部变量在其定义块外是不能访问的 局部变量在程序运行到它所在的块时建立 该块执行完毕后局部变量占有的空间将被释放 如自动变量 2 全局变量全局变量说明于所有函数之外 可以为本源程序文件中的所有函数共同使用 全局变量可以在各个函数之间建立数据传输通道 38 5 7函数声明 1 函数和变量一样 在使用之前要先声明 声明使用函数原型2 函数原型的一般形式 3 省略函数原型的情况先定义 后使用 39 程序举例 例5 10打印1000 10000之间的回文数 回文数 各位数字左右对称的整数 例如 12321 789987 1等都是回文数 算法 for i 1000 i 10000 i if i是回文数 输出i 判断回文数的方法 先求出i的反序值k 如果i与k相等 则说明i是回文数 求整数n反序值的算法 依次取出n的个位数m m n 10 并作为k的个位数 k k 10 m 直到n变为0 do m n 10 k k 10 m n n 10 while n 0 利用函数 实现判断回文数的功能 k 0 注意k的初值 判断回文数的函数 intIspalindrome intn intm n k 0 do k k 10 m 10 m m 10 while m 0 if k n return1 elsereturn0 intmain for inti 1000 i 10000 i if Ispalindrome i cout i t cout endl return0 42 函数调用在前 定义在后 必须对被调用函数进行原形声明 否则 编译出错 43 intispalindrome intn 44 例5 12 编写矩阵乘法函数matrix multi 计算CL N AL M BM N 算法 for i 0 i L i i 1 for j 0 j N j j 1 计算 ij Cij的计算方法 ij 0 for k 0 k M k k 1 ij ij ik kj 45 intmain constintL 4 constintM 5 constintN 3 doublea L M 1 0 3 0 2 0 0 0 4 0 2 0 1 0 5 0 7 0 2 0 0 0 8 0 4 0 1 0 5 0 3 0 3 0 2 0 4 0 1 0 doubleb M N 4 0 5 0 1 0 2 0 2 0 6 0 7 0 8 0 1 0 0 0 3 0 5 0 9 0 8 0 6 0 doublec L N inti j k 在一个主函数中完成 46 for i 0 i L i i 1 for j 0 j N j j 1 c i j 0 for k 0 k M k k 1 c i j c i j a i k b k j cout Theresultisc endl for i 0 i L i i 1 for j 0 j N j j 1 cout c i j t cout endl return0 47 48 编写 矩阵乘法 的通用函数 voidmatrix multi doublea doubleb doublec intl intm intn inti j k for i 0 i l i for j 0 j n j c i n j 0 访问c i j for k 0 k m k c i n j a i m k b k n j c i j a i k b k j 函数中使用一维数组模拟二维数组 49 调用matrix multi函数 调用语句 matrix multi a 0 b 0 c 0 L M N 其中 a 0 b 0 c 0 分别代表3个二维数组的首地址 50 在main 函数中定义二维数组 intmain doublea L M 1 0 3 0 2 0 0 0 4 0 2 0 1 0 5 0 7 0 2 0 0 0 8 0 4 0 1 0 5 0 3 0 3 0 2 0 4 0 1 0 doubleb M N 4 0 5 0 1 0 2 0 2 0 6 0 7 0 8 0 1 0 0 0 3 0 5 0 9 0 8 0 6 0 doublec L N matrix multi a 0 b 0 c 0 L M N cout Theresultisc endl for inti 0 i L i for intj 0 j N j cout c i j cout endl return0 51 在main 函数中使用一维数组模拟二维数组 intmain doublea L M 1 0

温馨提示

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

评论

0/150

提交评论