函数.ppt_第1页
函数.ppt_第2页
函数.ppt_第3页
函数.ppt_第4页
函数.ppt_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

1 第7章函数 贵州师范大学机电工程学院机制09级 C语言程序设计 2 第七章函数 在解决一个比较复杂的实际问题时 不可能把所有要完成的任务全都写在main函数中 这时 程序往往由一个main函数和若干个其它函数组成 每个函数各自完成相对独立的部分功能 在前面的章节中 我们编写的程序都是由一个main函数来组成 在main函数中调用过scanf printf等系统函数 模块化的程序设计方法 3 函数间相互调用的示意 main f1 f11 f1 f11 C语言是由函数组成 一个C语言程序必须包含一个且仅一个main函数 由main函数开始调用其他函数 其他函数也可相互调用 但最终返回主函数结束程序 4 函数间相互调用的示意 main f1 f11 f1 f11 f12 f2 f12 f2 f21 f21 C语言是由函数组成 一个C语言程序必须包含一个且仅一个main函数 由main函数开始调用其他函数 其他函数也可相互调用 但最终返回主函数结束程序 5 本章内容 函数定义 函数调用 函数说明 6 函数的种类 从函数定义形式分 有参函数 在主调 用 函数和被调 用 函数之间通过参数进行数据传递 如 PPT41intcube intx 无参函数 如 getchar 在调用无参函数时 主调函数不需要将数据传递给无参函数 PPT17 从使用的角度看 标准函数 库函数 库函数是由系统提供的 如 getchar sin x 等 在程序中可以直接调用它们 附录A列出了C的部分库函数 用户自定义函数 如 例7 中的try函数 7 7 1库函数 一 C语言提供了丰富的库函数预处理命令中头文件名1 数学函数math h2 字符函数和字符串函数ctype h3 输入输出函数stdio h4 动态分配函数和随机函数stdih h 库函数由系统提供 用户只要按照要求的格式正确调用即可 不同的C编译系统提供的库函数有些不同 8 使用库函数应注意的问题 1 调用库函数时要用 include命令将相关的头文件包含进来 如 调用数学函数 用 include math h 调用输入输出函数 用 include stdio h 2 库函数调用的一般形式 函数名 参数表 要注意函数的功能 参数的个数与类型 函数值的类型 P269如 求平方根的函数sqrt的形式是 doublesqrt doublex 9 3 库函数调用以两种方式出现 其一 出现在表达式中 即作为表达式的一部分参与运算 如 计算y x2 5 1 3 则通过以下语句调用来实现 y pow x 2 5 1 3 x必须是已知的 其二 独立的语句 即调用函数后加一分号 如 printf n 4 调用库函数时 要注意参数的一些特殊要求 如三角函数要求自变量参数用弧度表示 开平方函数要求自变量参数的值大于或等于0 使用库函数应注意的问题 续 10 总结库函数是系统已定义好的 我们只是需要拿出来用就可以了 用的时候要注意以下几点 在程序前 加上文件包含命令行 如 include 调用格式函数名 参数表 该参数又称为实参 必须有确定的值 要注意参数的一些特殊要求要注意函数的功能 参数的个数与类型 函数值的类型 又称函数的调用 11 7 2函数的定义和返回值 12 函数类型函数名 类型名形式参数1 说明语句执行语句 例如 试定义一个max函数 求两个整数的最大值 7 2 1函数的定义 1 任何函数 包括主函数main 都是由函数首部和函数体两部分组成 根据函数是否需要参数 可将函数分为无参函数和有参函数两种 有参函数比无参函数多了一个参数表 调用有参函数时 调用函数将赋予这些参数实际的值 为了与调用函数提供的实际参数区别开 将函数定义中的参数表称为形式参数表 简称形参表 13 函数类型函数名 类型名形式参数1 说明语句执行语句 P77 例如 求两个整数的最大值 intmax intx inty intz z x y x y return z 类型省略时默认为int类型 试 编写求两个双精度数之和的add函数P78 14 P78例 编写求两个双精度数之和的函数 doubleadd doublea doubleb doubles s a b returns main doublex y max scanf x lf y lf 如果S类型与add类型不一致将会 按add类型进行转换 关于函数名 形参名是否唯一 P77思考 定义一个cube函数 实现求一个整数的立方 kjub 15 例7 1 求一个整数的立方 intcube intx 函数定义 return x x x main intf a printf nEnteranintegernumber scanf d 程序运行情况如下 Enteranintegernumber 2 2 2 2 8 函数调用 程序的执行总是从main函数开始 16 2 无参函数的一般形式函数类型函数名 说明语句部分 可执行语句部分 主调函数不需要将数据传递给无参函数 所以无须返回值 因此用户可用 void 指定函数类型 17 例7 2 无参函数的定义与调用 voidwelcome printf n printf WelcometoChina n printf n main welcome 程序的输出结果如下 WelcometoChina void的字面意思是 无类型 void几乎只有 注释 和限制程序的作用 void真正发挥的作用在于 1 对函数返回的限定 与return0 等效 保证系统正常退出 2 voidwelcome 不接受任何参数 不返回任何信息 18 一个C源程序文件可以由一个或多个函数组成 所有函数都是独立的 主函数可以调用其它函数 其它函数可以相互调用 其它函数不能调用主函数 2 在一个C程序中 有且仅有一主函数main C程序的执行总是从main函数开始 调用其它函数后最终回到main函数 在main函数中结束整个程序的运行 说明 19 3 函数定义不允许嵌套 在 语言中 所有函数 包括主函数main 都是平行的 一个函数的定义 可以放在程序中的任意位置 主函数main 之前或之后 但在一个函数的函数体内 不能再定义另一个函数 即不能嵌套定义 PPT20 4 空函数 既无参数 函数体又为空的函数 其一般形式为 函数类型 函数名 voiddummy 5 在老版本C语言中 参数类型说明允许放在函数说明部分的第2行单独指定 20 函数与函数之间是平等的 voidmain intmax2 intx inty intz if x y z x elsez y return z inta b max scanf d d 函数的定义是平行的 不能在一个函数的内部再定义其它函数 即每个函数都是一个相对独立的模块 不能在写某一个函数时又包含了另一个函数的定义 21 intmax x y intx y intz z x y x y return z intmax x y intx y 或intmax intx y 或intmax x y intx y z z x y x y return z 花括号中也可以为空 这种函数叫空函数 不能在函数体内定义其他函数 即函数不能嵌套定义 形参也可以这样定义 22 例1有参函数 现代风格 intmax intx inty intz z x y x y return z 例3无参函数voidprintstar printf n 或voidprintstar void printf n 函数的定义示例 例4空函数voiddummy 函数体为空 留待以后补充 23 intmax2 intx inty 现代风格 intmax if x y max x elsemax y printf max max2 d n max return max main inta b max scanf d d 例函数的定义P78 形参和函数体中定义的变量只在函数被调用时才临时分配存储单元 当退出函数时 这些存储单元全部被释放 称为局部性 因而与其它函数中的变量同名不会引起混淆 注意变量在内存中存放的情况 形参与实参可以采用不同的名称 在函数定义中 定义的变量 只在该函数体内起作用 24 返回语句形式return 表达式 或return表达式 或return 功能 使程序控制从被调用函数返回到调用函数中 同时把返回值带给调用函数说明 若函数类型与return语句中表达式值的类型不一致 按前者为准 自动转换 函数调用转换PPT26函数中可以有多个return语句 但只有其中的一个return语句能够得到执行PPT27若函数中没有return语句 或者是一个不带表达式的return语句 则该函数结束时自动返回调用函数一个不确定的值PPT28void型函数 明确说明函数没有返回值PPT28 2 函数的返回值 只能用于void类函数 25 intmax floatx floaty floatz z x y x y return z main floata b scanf f f 例函数返回值类型转换 若函数类型与return语句中表达式值的类型不一致 按前者为准 自动转换 函数调用转换 26 main inta b max scanf d d 例函数可以有多个return语句 注意 在C语言中 函数名不能被赋值 只能通过return语句返回一个值 intmax2 intx inty max2 x y x y 函数中可以有多个return语句 但只有其中的一个return语句能够得到执行 27 printstar printf n main inta a printstar printf a d n a 输出 a 10 例函数带回不确定值 若函数中没有return语句 或者是一个不带表达式的return语句 则该函数结束时自动返回调用函数一个不确定的值 若定义voidprintstar 情况如何 28 include void printstar printf n main inta a printstar printf a d n a 29 voidprintstar printf n main inta a printstar printf a d a 编译错误 void型函数 明确说明函数没有返回值 VC errorC2120 void illegalwithalltypes 注意观察printstar voidprintstar 的不同 30 7 3函数的调用 在程序中 是通过对函数的调用来执行函数体的 其过程与其它语言的子程序调用相似 语言中 函数调用的一般形式为 函数名 实际参数表 切记 实参的个数 类型和顺序 应该与被调用函数所要求的参数个数 类型和顺序一致 才能正确地进行数据传递 在 语言中 可以用以下几种方式调用函数 1 函数表达式 函数作为表达式的一项 出现在表达式中 以函数返回值参与表达式的运算 这种方式要求函数是有返回值的 if iabs a max max iabs a 2 函数语句 C语言中的函数可以只进行某些操作而不返回函数值 这时的函数调用可作为一条独立的语句 PPT30welcome 3 函数必须先定义后调用 P80 只有intcharg型除外 有实实在在的值 31 includevoidwelcome printf Welcomethenewstudents n main welcome 32 intsum100 inti t 0 for i 1 i 100 i t i return t main ints s sum100 printf d n s 程序输出结果 5050 intsum intx inti t 0 for i 1 i x i t i return t main ints s sum 100 printf d n s 例7 3 求1 100的累加和 思考 两个程序有何不同 程序输出结果 5050 33 voidswap intx inty intz z x x y y z printf nx d y d x y main inta 10 b 20 swap a b printf na d b d n a b 7 2 3函数参数与函数的返回值 1 函数的形式参数与实际参数 程序输出结果 x 20 y 10a 10 b 20 形式参数 形参 实际参数 实参 例7 4 编一程序 将主函数中的两个变量的值传递给swap函数中的两个形参 交换两个形参的值 单向值传递 34 有关形参和实参的说明 当函数被调用时才给形参分配内存单元 调用结束 所占内存被释放 实参可以是常量 变量或表达式 但要求它们有确定的值 实参与形参类型要一致 字符型与整型可以兼容 实参与形参的个数必须相等 在函数调用时 实参的值赋给与之相对应的形参 单向值传递 35 36 例7 5 函数调用中实参的求值顺序 voidfun inta intb printf a d b d n a b main intm 5 fun 3 m m Printf d m 程序输出结果 a 8 b 5 为何不是9 注意 在TC中 实参的求值顺序是从右到左 37 例 main intk 8 printf d d k k printf d k 8 89 38 2 函数的类型与函数的返回值 说明 函数的类型决定了函数返回值的类型 若省略函数的类型 系统默认其为int型 无返回值的函数应将其类型定义为void 空 类型 函数的类型 例7 6 输出两个数中的大数 max intx inty intz z x y x y return z 返回z的值 main inta b c scanf d d 若为doublemax intx inty 39 函数的返回值是通过return语句带回到主调函数的 功能 终止函数的运行 返回主调函数 若有返回值 将返回值带回主调函数 说明 若函数没有返回值 return语句可以省略 return语句中的表达式类型一般应和函数的类型一致 如果不一致 系统自动将表达式类型转换为函数类型 函数的返回值 return语句格式 return 表达式 或return表达式 或return 40 例7 8 计算并输出圆的面积 s intr return3 14 r r main intr scanf d 自动转换为int型 思考 若要得到单精度实型的圆面积 程序应如何修改 程序运行情况如下 2 12 41 7 4对被调函数的说明 P80 P80变量要先定义后使用 函数也如此 即被调函数的定义要出现在主调函数的调用之前 如swap函数 凡未在调用前定义的函数 C编译系统都默认函数类型为int 允许整型函数 且参数也是整型 的定义出现在主调函数之后 如max函数 如果非整型函数在主调函数之后定义 则应在主调函数中或主调函数之前对被调函数进行声明 voidswap intx inty main swap a b main c max a b max intx inty 42 对被调函数进行声明的一般形式 函数类型函数名 参数类型1参数名1 或函数类型函数名 参数类型1 参数类型2 思考 以下哪种情况必须在主调函数中对被调函数声明被调函数定义在前 主调函数调用在后 主调函数调用在前 被调函数定义在后 且被调函数的类型不是整型的 被调函数定义在后 但被调函数的类型是整型 第二种形式省略了参数名 此种形式也称为函数的原型 43 例 写出对doubleadd doublex doubley 函数 什么情况下 必须进行说明 进行说明的两种格式 如果调用在定义之前 又没在程序中加入函数说明 系统将怎么处理这个函数 P80 2函数类型函数名 参数类型1参数名1 该参数名是虚设的 可与是任意的 不起作用 所以可省 必须与函数的类型一致 P80函数说明的作用 44 7 2 2函数说明的位置 第一种情况 写在所有函数的外部 被调用之前 在其后所有位置上都可对该函数进行调用 第二种情况 写在调用函数内 只能在该调用函数内部才能识别该函数 P83例 45 main voidcalc floatx floaty charopr floata b charopr printf nInputexpression scanf f c f 对被调函数的声明 例7 9 计算并输出两个数的和差积商 差 积 商 46 1 什么情况下 必须进行函数说明 2 怎么说明 说明的两种格式 3 函数说明放置的位置 与其含义 4 区分函数说明 函数定义 函数调用 5 函数说明的作用 47 7 5调用函数和被调用函数间的数据传递 1 调用函数和被调用函数间数据传递的方式 P812 例7 2注意 实参与形参间的数据传递 以及其存储单元的变化3 例7 3 48 例7 2 main intx 2 y 3 z 0 printf 1 x dy dz d n x y z try x y z 调用函数 printf 4 x dy dz d n x y z try intx inty intz 定义函数try printf 2 x dy dz d n x y z z x y x x x y y y printf 3 x dy dz d n x y z 49 程序的运行结果如下 1 x 2y 3z 0 2 x 2y 3z 0 3 x 4y 9z 5 4 x 2y 3z 0程序说明 当程序从main函数开始运行时 按定义在内存 50 图7 1try函数中参数的存储单元 3 51 52 如果实参表中包括多个参数 对实参的求值顺序随系统而异 有的系统按自左向右顺序求实参的值 有的系统则相反 TurboC和MSC是按自右向左的顺序进行的 7 2 4实例验证P90 7 10func inta intb 定义函数func 缺省类型为int型 intc c a b returnc main 定义主函数 intx 6 y 7 z 8 r r func x y x y z 以函数表达式形式进行函数调用 printf d n r 思考 若为r func x y x y z z 情况如何 53 程序说明 从main作为程序入口 当执行到r func x y x y z 语句时 转去进行func函数的调用 将x y x y逗号表达式的值和z 的值作为实参传递给形参a b 从而使a b的值分别为13和8 通过c a b returnc 返回值21到主函数 最后输出r的值为21 54 P83 例7 4编写函数isprime inta 用来判断自变量a是否是素数 若是素数 函数返回整数1 否则返回0 思路 自定义一个函数isprime inta 功能 判断素数并做返回 主函数 调用该函数 根据该函数返回值 并做a是不是素数的输出 55 例7 4 intisprime int main intx printf Enteraintegernumber scanf d 56 7 5 includevoideven

温馨提示

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

评论

0/150

提交评论