C语言7ppt课件.ppt_第1页
C语言7ppt课件.ppt_第2页
C语言7ppt课件.ppt_第3页
C语言7ppt课件.ppt_第4页
C语言7ppt课件.ppt_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

计算机程序设计 C语言 第7章函数 1 函数定义 2 函数的调用 3 函数的参数传递方式 4 递归函数 7 1函数的概念 函数的作用 把一段计算抽象出来 封装 包装 成独立实体 这种封装程序段称为函数定义 定义后通过函数名就可以用简便方式要求执行该函数所封装的计算 这种描述片段称为函数调用 例 对6 200的各偶数验证哥德巴赫猜想 for n 6 n 200 n 2 for m 3 m n 2 m 2 if 若m为素数 7 1函数的概念 7 1函数的概念 intisprime intn n是否素数 intm 2 for m m n m if n m 0 return0 return1 没有因子 是素数 判断是否为素数的函数 函数返回值类型 函数名 函数形式参数 函数体 函数返回值 7 1函数的概念 说明 C语言源程序包含一个主函数和若干个其他函数 程序的执行均从主函数开始 函数可写在程序的任意位置 但是在函数使用前 函数必须已经定义或声明 从用户角度看 函数可分为 系统函数用户自定义函数从函数的定义又可分为 无参函数有参函数 7 2函数的定义 函数的定义 返回值数据类型函数名 形式参数列表 函数体 intmax inta intb intc c a b a b returnc 函数的功能 函数定义说明 函数体是一个复合语句 可包含多条语句 不能省略 形式参数列表各个形参包括类型和参数名 用 号分隔 形参省略表示无参函数 函数的返回值通过return语句返回给主调函数值 return返回值 或return 返回值 函数定义的数据类型必须与返回值类型一致 若函数无返回值 则函数定义类型为void 7 2函数的定义 例7 1 由键盘输入2个整数 输出其中的大者 includeintmax inta intb intc c a b a b return c intmain intx y scanf d d return0 7 2函数的定义 7 2函数的定义 例 求1 3 5 99 分析 用函数实现求n longfact intn longt 1 inti for i 1 i n i t i returnt 类型必须一致 7 2函数的定义 includelongfact intn longt 1 inti for i 1 i n i t i returnt intmain inti longsum 0 for i 1 i 100 i 2 sum fact i printf sum ld sum return0 函数的调用 函数的定义 7 3函数的调用 1函数的调用 调用函数时必须提供数目正确 类型合适的实参 调用无参函数时也需要写圆括号 函数调用的三种形式 表达式方式 if isprime n 参数方式 printf d max a max b c 语句方式 scanf d 函数名 实参列表 7 3函数的调用 2函数的调用时形参和实参的关系 形参是函数定义括号内的变量 属于函数内部的局部变量 在函数被执行时才存在 实参是函数调用时 用来给形参传递的值 值传递 7 3函数的调用 3函数调用的说明 1 主函数和自定义函数在源程序文件中的位置可以任意 但必须保证每个函数都是独立的一个部分 不运行在一个函数体内定义另一个函数 includeintmain intf1 intn voidf2 charxh includeintf1 intn voidf2 charxh intmain includeintf1 intn voidf2 charxh intmain 7 3函数的调用 2 若被调用函数定义放在调用函数前 可直接调用 若被调用函数定义放在调用函数后 需在调用函数中对被调用函数声明 includeintf1 intn voidf2 charxh intmain intk 3 k f1 k f2 A 调用函数 被调用函数 被调用函数的定义在调用函数之前 使用时直接调用函数 7 3函数的调用 includeintmain intk 3 intf1 intn voidf2 charxh k f1 k f2 A intf1 intn voidf2 charxh 调用函数 被调用函数 函数声明 函数原型 被调用函数的定义在调用函数之后 调用前需对函数进行声明 函数原型的一般形式 函数类型函数名 参数类型1 参数类型2 函数类型函数名 参数类型1参数名1 函数的声明可以放在调用函数中 也可以放在函数外部 只要函数调用前 该函数已经定义或声明过 函数的调用就合法 7 3函数的调用 任何可以写定义的地方都可以写原型声明 提倡把原型声明都放在程序文件最前面 1 使文件里所有调用能看到同一个原型声明 2 使函数的定义点也能看到同一个原型声明 原型声明是保证函数定义 使用间一致性的媒介 includeintmain intk 3 intf1 intn voidf2 charxh k f1 k f2 A intf1 intn voidf2 charxh includeintf1 intn voidf2 charxh intmain intk 3 k f1 k f2 A intf1 intn voidf2 charxh 7 3函数的调用 声明在函数外部 includeintmain intk 3 intf1 int voidf2 char k f1 k f2 A intf1 intn voidf2 charxh includeintf1 int voidf2 char intmain intk 3 k f1 k f2 A intf1 intn voidf2 charxh 7 3函数的调用 声明在函数外部 7 3函数的调用 voidfun inta intb intc c a b intmain intc 1 fun 2 3 c printf d c 单向值传递 输出结果 1 7 3函数的调用 includeintf int intmain intx 26 printf d f x intf intnum intk 1 do k num 10 num 10 while num returnk 执行结果 12 7 4函数的嵌套调用 1函数的嵌套调用 includevoidf1 int voidf2 int intmain f1 5 voidf1 intn f2 6 7 voidf2 inta intb 函数的定义不允许嵌套 函数调用允许嵌套 7 4函数的嵌套调用 例 求1 2 3 4 n 要求 1 n由键盘输入 2 编写一个求 的函数fact 3 编写一个阶乘累加的函数fsum 调用fact 4 主函数完成n的输入和求和函数fsum的调用 7 4函数的嵌套调用 例 计算f k n 1k 2k nk includelongsum int int longpower int int intmain intk n scanf d d 7 4函数的嵌套调用 longpower intm intn inti longt 1 for i 1 i n i t m returnt longsum intk intn inti longs 0 for i 1 i n i s power i k returns power m n 求mn sum k n 求累加和 7 5函数参数的传递方式 1普通变量作为函数的形式参数实参将值传递给形参 单向值传递 voidsx inty inttemp temp x x y y temp intmain inta b a 5 b 15 s printf a d b d a b return0 5 15 a b x y 5 15 temp 15 5 a 5 b 15 7 5函数参数的传递方式 形参是普通变量 则实参必须是同类型的数据 可以为 常量值普通变量数组元素其他可以表示同类型值的数据 7 5函数参数的传递方式 2指针变量作为函数的形式参数实参将值传递给形参 单向值传递 指针变量的值表示一个地址 因此 实参也必须是一个地址 表示实参传递给形参的是一个地址 voids x int y inttemp temp x x y y temp voids x int y inttemp temp x x y y temp intmain inta b a 5 b 15 s printf a d b d a b return0 5 15 a b x y temp a 15 b 5 15 5 7 5函数参数的传递方式 7 5函数参数的传递方式 voidsub1 chara charb charc c a a b b a voidsub2 char a charb charc c a a b b c voidsub3 char a char b charc c a a b b c intmain chara b a A b B sub1 a b putchar a putchar b a A b B sub2 ABBBBA 注意 指针变量作为形参 实参必须是表示地址的值 形参是指针变量 实参必须是同类型的数据地址 可以为 变量的地址指针变量数组名其他可以表示为地址的值 7 5函数参数的传递方式 voids x int y inttemp temp x x y y temp intmain inta b p q a 5 b 15 p 7 5函数参数的传递方式 实参也是指针变量 7 5函数参数的传递方式 voids x int y inttemp temp x x y y temp intmain inta 5 1 2 3 4 5 i for i 0 i 5 2 i s i 实参是数组元素的地址 7 5函数参数的传递方式 不论是普通变量还是指针变量作为函数的参数 其实质都是实参向形参的单向值传递 但是效果是有所区别的 原因在于指针变量的特点 地址 指针变量指向了实参的地址单元 因此在函数体内改变了指针变量所指单元的值 相当于改变了实参的值 由于函数只能返回一个值 因此当函数需要返回多个值给主调函数时 可以考虑利用指针来实现 7 5函数参数的传递方式 例 编写一个函数 将一个long的整数 逆序后仍旧以long返回 如 905 509 longrevert longn longsum 0 k do k n 10 sum sum 10 k n n 10 while n 0 returnsum 7 5函数参数的传递方式 3数组作为函数的形式参数实参将值传递给形参 单向值传递 实参可以是 1 数组名 2 表示地址的值 如指针变量 7 5函数参数的传递方式 voidinvert intx intn intt i for i 0 i n 2 i t x i x i x n i 1 x n i 1 t 数组作为形式参数 数组长度省略 数组的实际长度由实参决定 intmain inti a 5 1 2 3 4 5 invert a 5 for i 0 i 5 i printf 4d a i return0 函数调用时 对应实参用实际数组名 表示形参数组和实参数组为同一数组 数组长度必不可少 7 5函数参数的传递方式 voidinvert intx intn intt i j for i 0 i n 2 i t x i x i x n i 1 x n i 1 t intmain inti a 5 1 2 3 4 5 p p a invert p 5 for i 0 i 5 i printf 4d a i return0 函数调用时 对应实参用指向数组的指针变量 效果也是传递实参数组地址给形参 7 5函数参数的传递方式 voidinvert int p intn intt i j for i 0 i n 2 i t p i p i p n i 1 p n i 1 t intmain inti a 5 1 2 3 4 5 invert a 5 for i 0 i 5 i printf 4d a i return0 指针作为形式参数 通过指针访问函数内的数组元素 7 5函数参数的传递方式 总结 C的函数传递方式 单向值传递1 普通变量作为形参 实参是将值传递给函数内部的形参 形参的改变不会影响实参的值 2 若指针变量或数组作为形参 由于实参传递给形参的是表示地址的值 意味着形参和实参表示同一地址单元 因此形参变化会影响实参的值 7 5函数参数的传递方式 例 用函数实现冒泡排序方法冒泡排序的基本思想 从头开始两两比较每趟比较均将最大值 最小值 排到序列的末尾 include stdio h voidbubble inta intfirst intend for intflag first flagflag i if a i a i 1 intt a i a i a i 1 a i 1 t intmain inti x 34 12 3 78 13 5 7 bubble x 0 6 for i 0 i 6 i printf d x i return0 递归函数的基本概念递归 允许以递归的方式来定义函数 即允许被定义的函数调用函数自身 7 6递归函数 例 求n longfact longn inti longt 1 for i 1 i n i t i returnt longfact longn longp if n 0 p 1 elsep n fact n 1 returnp 已知解 说明了递归的终止条件 递推的过程 用递归求解问题的过程分为递推和回归两个阶段 1 递推 逐步分解 直至到达已知解 2 回归 递推的逆过程 从已知解出发 逐一求值回归 直到获得问题的解 7 6递归函数 longfact longn longp if n 0 p 1 elsep n fact n 1 returnp 递归的函数定义需要条件表达式或if 必须有以下二个部份 已知解的情况 是递归的基础需要递归处理的情况 递推过程 把对较复杂情况的计算归结为对更简单情况的计算 7 6递归函数 7 6递归函数 例 设计一个函数对给定的整数逆序 voidrevert longn if n 0 return else printf d n 10 revert n 10 return 例 Hanoi塔问题 古代有一个梵塔 塔内有三个座A B C 开始时A座上有64个盘子 盘子大小不等 大的在下 小的在上 有一个老和尚想把64个盘子从A座移动到B座 但每次只允许移动一个盘子 且

温馨提示

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

最新文档

评论

0/150

提交评论