函数与程序结构.ppt_第1页
函数与程序结构.ppt_第2页
函数与程序结构.ppt_第3页
函数与程序结构.ppt_第4页
函数与程序结构.ppt_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

第九章函数 函数的基本使用函数的嵌套调用函数的递归调用变量存储特征宏及条件编译 函数的概念 k n m f 1 for i 1 i n i f f i scanf d d d includevoidmain inti k m n floatfk fm fn scanf d d d includevoidmain intk m n floatfk fm fn floatfact intn scanf d d d floatfact intn inti floatf 1 for i 1 i n i f f i returnf 结构化程序设计 为了解决复杂问题的编程 将分析复杂问题 分解为若干个子问题 每个子问题各自实现 用函数实现整合成解决整个问题的大程序 将函数组织起来优点程序结构清晰 逻辑性强小程序规模小 容易编写和调试 保证程序设计的正确性 可读性 可维护性 结构化程序的构成 模块化编程学生成绩档案管理软件 成绩输入成绩修改成绩统计成绩打印 includevoidmain intin printf 1 INPUT2 EDIT3 PROCESS4 PRINT5 EXIT n while 1 printf pleaseinput1 5 scanf d voidinput 成绩输入 voidedit 成绩修改 4个函数的定义voidprocess 成绩统计 voidprint 成绩打印 includevoidmain intk m n floatfk fm fn floatfact intn scanf d d d main 库函数 调用 定义 函数的概念 函数的调用 voidmain intm n floatfk fm fn floatfact intn fm fact 6 调用 定义 floatfact intn inti floatf 1 for i 1 i n i f f i returnf 思考 从函数调用的角度 函数的复用对可执行文件大小的影响 函数的参数传递 返回值类型函数名 形式参数表 voidmain intm n floatfk fm fn floatfact intn fm fact 6 floatfact intn inti floatf 1 for i 1 i n i f f i returnf 调用 定义 函数名 实际参数表 参数传递 返回值类型函数名 形式参数表 voidmain intm n floatfk fm fn floatfact intn fm fact 6 floatfact intn inti floatf 1 for i 1 i n i f f i returnf 函数的参数形式参数 接口类型1参数1 类型2参数2 类型n参数n定义函数时需要知道的信息参数个数 0 n实际参数调用时由主调函数给出 实参 形参 函数参数的定义 函数名 实际参数表 main output voidoutput printf n printf verygood n printf n main intx y z scanf d d 实参 实参与形参参数传递 voidmain intx y z scanf d d printf d z intmax inta intb intc c a b a b returnc 常量变量表达式 形参 变量 主调函数 被调函数 实参与形参参数传递 intmax inta intb intc c a b a b returnc voidmain intx y z scanf d d printf d z 5 1 实参与形参 个数相同 类型一致 按顺序传递2 实参 形参 值传递单向形参值的变化不会影响实参的值实参和形参可以同名 实参与形参参数传递 voidmain intx y z scanf d d printf d z intmax inta intb intc c a b a b returnc 返回值类型函数名 形式参数表 voidmain intm n floatfk fm fn floatfact intn fm fact 6 floatfact intn inti floatf 1 for i 1 i n i f f i returnf 2 返回值类型函数返回一个值 合法类型return exp 函数的返回值 main output voidoutput printf n printf verygood n printf n 返回值类型函数返回一个值 合法类型return f 函数不返回值 voidreturn 或省略返回值类型缺省是int main intx y z scanf d d int voidmain intx y scanf d d 阅读程序 voidswap intx inty intt t x x y y t 输入35 intx inty和intx y 函数的说明 voidswap inta intb intt t a a b b t voidmain intx y scanf d d voidmain intx y scanf d d voidswap inta intb 函数在被调用前必须先定义或说明 函数调用小结 函数调用时 实参计算值 复制给相应位置的形参 函数执行完后 通过return exp 可返回结果 调用其他函数 必须先说明 例T9 11 2 n 算法 k 1tonf k s s fk s 0 for k 1 k n k f fact k s s f floatfact intn inti floatf 1 for i 1 i n i f f i return f 例T9 2x x2 xn 算法 k 1tonf xks s fk s 0 for k 1 k n k f mypow x k s s f floatmypow floatx intn inti floatf 1 for i 1 i n i f f x return f T9 1和T9 2的main 例T9 3编写函数比较2个变量是否相等 equal x y 当x y 返回1否则 返回0 intequal intx inty if x y return1 elsereturn0 voidmain intx y scanf d d intequal intx inty return x y 例T9 4输出100 200间所有素数 算法 m 100to200ifm是素数printm intprime intm inti n sqrt m for i 2 in return1 elsereturn0 for m 100 m 200 m if prime m printf d m prime m ifm是素数 返回1否则 返回0 函数的顺序调用和嵌套调用 顺序调用voidmain f1 f2 f1 f2 函数的顺序调用和嵌套调用 嵌套调用voidmain f1 f1 f2 f2 例求三角形面积area s s a s b s c s a b c 2 include includevoidmain floata b c floatarea floata floatb floatc floats floata floatb floatc scanf f f f 程序模块结构 一 文件包含可以实现一个文件把另一个文件的全部内容包含进来 格式 include 文件名 说明 1 include不是 语句 无需分号 2 如果要连接多个文件 可用多个include包含 顺序按调用关系 被调的应在调用的前面 允许多层调用 3 文件与 性质相同 都是 程序文件 文件突出了头文件 head 的性质 4 include有两种写法 include file1 c include二 工程文件 只在tc include文件夹下找 适用于系统头文件 除此之外 还到程序所在文件夹下查找 适用于自定义头文件 程序模块结构 文件模块的连接 include F1 c voidmain intn longt scanf d 文件名F1 c longfact intk inti longres 1 for i 1 i k i res res i returnres 文件名F2 c longfact intk inti longres 1 for i 1 i k i res res i returnres voidmain intn longt scanf d 文件名F1 c 递归式 递归出口 函数的递归调用 递归函数 求n 递归定义n n n 1 n 1 n 1 n 0 1 voidmain floatfact intn printf f n fact 5 floatfact intn floatres if n 0 n 1 res 1 elseres n fact n 1 returnres fact n n fact n 1 递归函数求n 的实现过程 floatfact intn floatres if n 0 n 1 res 1 elseres n fact n 1 returnres 函数的递归调用 递归函数 用递归实现的问题 满足两个条件 问题可以逐步简化成自身较简单的形式 递归式 n n n 1 nn 1 i n ii 1i 1f n f n 1 f n 2 递归最终能结束 递归出口 两个条件缺一不可解决递归问题的两个着眼点 递归程序设计 汉诺塔问题古代有一个梵塔 塔内有三个座A B C A座上有64个盘子 盘子大小不等 大的在下 小的在上 有一个和尚想把这64个盘子从A座移到C座 但每次只能允许移动一个盘子 并且在移动过程中 3个座上的盘子始终保持大盘在下 小盘在上 在移动过程中可以利用B座 一个盘子 则不需要利用B座 直接将盘子从A移动到C 2个盘子 可以先将盘子1上的盘子2移动到B 将盘子1移动到c 将盘子2移动到c 3个盘子 那么根据2个盘子的结论 可以借助c将盘子1上的两个盘子从A移动到B 将盘子1从A移动到C A变成空座 借助A座 将B上的两个盘子移动到C 上述的思路可以一直扩展到64个盘子的情况 可以借助空座C将盘子1上的63个盘子从A移动到B 将盘子1移动到C A变成空座 借助空座A 将B座上的63个盘子移动到C 汉诺塔问题的递归求解示意图 程序算法Hanio n A C if n 1 直接A C elseHanio n 1 A B n号盘直接A C Hanio n 1 B C 变量作用范围 作用域 在函数内定义的变量 包括形参 局部变量作用范围 本函数内部 定义在复合语句内的变量 作用范围 复合语句内部 作用 使用局部变量可以避免函数之间各变量的相互干扰 尤其是同名变量 全局变量 在函数以外定义的变量 不从属于任一函数 作用 给独立的函数之间提供一个公用的变量 增加函数之间数据交流的平台 作用范围 从定义处到源文件结束 包括各函数 变量作用范围示例 区分局部变量和全局变量intx 1 voidmain inta 2 intb 3 f intt 4 voidf intx 5 b 6 inta 7 x a b b x 5b 6t 4a没定义 若局部变量与全局变量同名 局部变量优先 变量作用范围示例 intx 1 intf intx return x main inty y f 2 x f x printf d d y x x 1 变量作用范围 如果局部变量与全局变量同名 局部变量优先 不要滥用全局变量 副作用 intx 1 voidf1 x voidf2 x 5 voidmain x 10 f1 printf d x f2 printf d x 115 9 3 2动态存储变量和静态存储变量 变量从作用域的角度来分 分为局部变量和全局变量从生存时间角度来分 分为静态存储变量和动态存储变量 静态存储程序运行期间分配固定存储空间的方式动态存储程序运行期间根据需要进行动态分配存储空间的方式 静态存储还是动态存储由变量的存储类别决定 存储类别分为四种自动的auto 静态的static 寄存器的register 外部的extern格式存储类别关键字类型关键字标识符1 标识符2 如autointa b c 1 auto存储类 函数中的局部变量 凡不加存储类说明的都表示为auto类 即auto可以缺省 如 intf a inta intb c 3 intf a autointa autointb c 3 注 auto类属于动态存储 进入函数分配存储单元 退出函数系统收回存储单元 对于递归 每递归一次 产生一个克隆体 克隆体中的变量只能在克隆体中有效 2 static存储类 static声明的变量属于静态存储 其用途让局部变量在退出它所在函数后仍保留存储单元 下一次进入该函数后 这些局部变量的值仍有效 称为静态局部变量 例9 9阅读程序 includevoidfun intk inta 0 printf d a a k voidmain intk for k 1 k 3 k fun k 运算 ka输出a k1000 1 12000 2 23000 3 3 输出0 0 0 例9 9阅读程序 includevoidfun intk staticinta 0 printf d a a k voidmain intk for k 1 k 3 k fun k 运算 ka输出a k1000 1 12111 2 33333 2 5 注 static型与auto型区别 存储单元分配 static分配固定存储空间auto动态分配存储空间 存储单元缺省值 static为0auto为随机值 输出0 1 3 3 register存储类 直接使用寄存器存储数据 提高运算速度 属于动态存储 一般小型机16个寄存器允许3个作为register变量个人微机13个寄存器没有多余寄存器作为register变量当定义的register变量超过能使用的寄存器时自动转成auto类变量 includevoidfun intk registerinta 0 printf d a a k voidmain intk for k 1 k 3 k fun k 例9 9阅读程序 输出0 0 0 4 extern变量 includevoidmain inta externx a 1 x a x x a printf d n x intx 声明x变量 在后定义 定义x是全局变量 格式extern 类型名 变量名表 extern只是说明变量起作用 告诉C编译器该变量后面会定义 它不分配存储单元 所对应存储单元在变量定义处分配 9 3 3全局变量与程序文件模块 前面讲过全局变量是指在一个源程序文件 其作用域是定义变量的位置起到本源程序文件结束 当多个源程序文件时 全局变量作用域如何定义 1 在一个源程序文件中声明使用另一个源程序文件定义的全局变量使用extern声明 如在文件file1 c为 includeintf intx intv voidmain intj 3 v j printf d d v f v 在文件file2 c为intf intx externintv return 3 x v 声明v是外文件定义的全局变量 全局变量 2 用static声明全局变量的作用域从定义起到本源程序文件结束 割断与外源程序文件联系 使全局变量只有本源程序本文件内有效 即使外源程序文件用extern声明 也无效 如在文件file1 c为 includestaticinta voidmain intj 2 printf d a 在文件file2 c为externinta fun intn a a n 外部说明无效 在多人合作时 使用静态全局变量避免各自定义的全局变量重名 静态全局变量 9 4编译预处理 预处理功能主要有三种1 宏定义2 文件包含3 条件编译 在头文件出现 夹在函数之内 9 4 1宏定义1 基本宏定义格式 define标识符字符串操作指定一个标识符来代表一个字符串 即定义符号常量例 definePI3 1415926编译预处理先把程序中的PI均用3 1415926替换 然后再编译 例字符串常量 的定义 definePI3 1415926main floatm s r scanf f main floatm s r scanf f 编译前 程序转化为 宏展开 然后 再编译 使用宏定义减少程序中重复书写某些字符串的工作量 其好处改动方便例如在主函数中定义可调数组 definearrary size1000intarray array size 根据算题需要对宏定义array size修改设置数组大小 宏定义字符串替换前不做语法检查 但对换后展开的语句检查语法例 definePI3 1415926 area PI r r 经宏展开后area 3 1415926 r r显然编译出错 在进行宏定义时可以引用已经定义的宏名 例 defineR3 0 definePI3 1415926 defineL2 PI R defineSPI R Rmain printf L f nS f n L S 宏展开printf L f nS f n 2 3 1415926 3 0 3 1415926 3 0 3 0 在双引号中的字符串内的字符不能展开 引号中的L S不能宏展开 宏定义应一行完成 用 可以续行 例 defineLong String itisalongstringthat isusedasanexample define的命令出现在函数体外部的任何位置 作用域从定义点起至源程序文件的结束 undef命令提前终止 define定义的作用域 例9 10宏定义作用域 defineA Thisisthefirstmacro voidf1 printf A printf n defineB Thisisthesecondmacro voidf2 printf B printf n undefBmain f1 f2 B作用域 A作用域 2 带参数的宏定义格式 define标识符 参数表 字符串操作不但进行字符串替换 还要参数替换 例9 11简单的带参宏定义程序 defineMAX a b a b a b defineSQR x x xmain intx y scanf d d 宏展开x MAX x y x a b a b x x y x y y SQR x y x x main intx y scanf d d 注 宏展开是字符串替换 程序中相应的参数是表达式替换也不例外如上例中要求y x y 2 所以参数宏定义时一般把参数用括号括起来 例9 11程序改为 defineMAX a b a b a b defineSQR x x xmain intx y scanf d

温馨提示

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

评论

0/150

提交评论