C语言程序设计模板.ppt_第1页
C语言程序设计模板.ppt_第2页
C语言程序设计模板.ppt_第3页
C语言程序设计模板.ppt_第4页
C语言程序设计模板.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1 第七章 函数 2 第七章函数 一 函数概述二 函数的定义和返回值三 函数的调用四 函数的说明五 局部变量和全局变量六 变量的存储类别七 嵌套调用和递归调用八 函数的存储类型九 函数程序举例 主要内容 end 3 一 函数概述 C程序结构 第七章函数 4 一个C程序可由一个主函数和若干个函数构成 由主函数调用其他函数 其他函数可以相互调用 同一函数可以被一个或多个函数调用任意多次 基本概念 分类 从用户使用的角度看 标准函数和用户自定义函数从函数的形式看 无参函数和有参函数 第七章函数 back 5 一 举例 二 函数的定义 三 函数的返回值 二 函数的定义和返回值 第七章函数 back 6 一 举例 先来看一个函数使用的例子 输入两个数 输出最大值 判断的两个数的最大值用函数 main inta b c c max a b printf Themaxis d c intmax intx inty intz if x y z x elsez y return z 函数调用 函数定义 第七章函数 7 二 函数定义 类型标识符函数名 形参列表 声明部分语句部分 intmax intx inty intz if x y z x elsez y return z 函数首部 函数体 格式 int 函数类型max 函数名intx inty 形参及其定义 声明部分 intz 说明函数内部用到的变量 语句部分 if 说明函数的功能return z 返回函数的结果 第七章函数 8 三 函数的返回值 1 函数的返回值是通过函数中的return语句获得的 一个函数中可以有一个以上的return语句 只有一个起作用 2 return z returnz 3 如果函数值的类型和return语句中表达式的值不一致 则以函数类型为准 4 如果被调用函数中没有return语句 一般表示此函数完成一定操作 并不带回任何值 5 为了明确表示 不带回值 可以用 void 定义 无类型 第七章函数 9 例无返回值函数voidswap intx inty inttemp temp x x y y temp printstar printf main inta a printstar printf d a voidprintstar printf main inta a printstar printf d a 正确 函数printstar 没有说明类型表示整型 在main 中 语句a printstar 执行函数调用 因为在函数定义时没有定义返回值 所以返回一个随机整数 运行结果 1010就是返回的随机整数 错误 在编译时将提示下列信息 cannotconvertfrom void to int 即不能将 void 转换为 int 举例 第七章函数 10 三 函数的调用 一 函数调用可以有两种方式 二 函数的参数传递 三 函数调用的语法要求 第七章函数 back 11 一 函数调用可以有两种方式 函数调用出现在表达式中例 c max a b 是一个赋值表达式函数调用以语句的形式出现例 若调用hello函数 可用以下语句 hello 第七章函数 12 格式 函数名 实参列表 方式 1 函数语句printstar 2 函数表达式c a max a b 3 函数参数m max a max b c main inta b c c max a b printf Themaxis d c 函数调用 第七章函数 13 举例 C m n m n m n m n main floatc intm n floatfac intx printf inputm n scanf d d inputm n 53 Theresultis10 0 第七章函数 14 二 函数的参数传递 计算实在参数的值 为形式参数分配存储单元 将实在参数的值传给对应的形式参数 通过return语句将返回值返回到调用处 释放形式参数所分配的内存单元 因此 形参只在函数内部有效 函数调用结束返回主调函数后则不能再使用该形参变量 函数之间还可以通过全局变量传递参数 将在本章后续内容中介绍 在C语言中 数据只能从实参传给形式参数 而不能把形式参数的值传回给实在参数 称为 按值传递 既单向传递 第七章函数 15 实际参数与形式参数的关系 对应关系 个数对应顺序对应类型对应 类型相同或赋值相容 传递关系 实参传递给形参值传递 单向传递 第七章函数 形参 定义函数时函数名后面括号中的变量名 形参 定义函数时函数名后面括号中的变量名 说明 1 形参在函数被调用前不占内存 2 函数调用时为形参分配内存 调用结束 释放内存 3 实参可以是常量 变量或表达式 4 在被定义的函数中 必须指定形参的类型 5 形参与实参类型一致 个数相同 6 若形参与实参类型不一致 自动按形参类型转换 函数调用转换 7 实参对形参与进行 值传递 8 形参与实参占用不同的内存单元 单向传递 16 三 函数调用的语法要求 函数调用的语法要求函数调用时 函数名必须与定义的函数名完全一致 实参可以是常量 变量 表达式 函数等 在进行函数调用时 它们都必须具有确定的值 实参的个数必须与形参的个数相等 顺序一致 类型匹配 否则会发生 类型不匹配 的错误 被调函数类型是int或char以外的函数 应先定义或说明 后使用 第七章函数 17 四 函数的说明 一 函数说明的形式其一般形式如下 数据类型函数名 类型名形式参数1 类型名形式参数2 或者也可以省略形式参数的名字 写成下面形式 数据类型函数名 类型名1 类型名2 如果被调函数的返回值是整型或字符型时 可以不对被调函数作说明 而直接调用当被调函数的定义出现在主调函数之前时 在主调函数中也可以不对被调函数再作说明而直接调用 第七章函数 18 二 函数说明的位置函数说明可以放在两个位置 主调函数的说明部分所有函数外部 被调用之前 第七章函数 back 19 五 局部变量和全局变量 局部变量定义 在函数内定义 只在本函数内有效说明 main中定义的变量只在main中有效不同函数中同名变量 占不同内存单元形参属于局部变量局部变量可用存储类型 autoregisterstatic 默认为auto 全局变量 外部变量定义 在函数外定义的变量有效范围 从定义变量的位置开始到本源文件结束应尽量少使用全局变量 第七章函数 20 第七章函数 21 例不同函数中同名变量 局部变量 main inta b a 3 b 4 printf main a d b d n a b sub printf main a d b d n a b sub inta b a 6 b 7 printf sub a d b d n a b 运行结果 main a 3 b 4sub a 6 b 7main a 3 b 4 第七章函数 22 floatmax min floataverage floatarray intn inti floatsum array 0 max min array 0 for i 1 imax max array i elseif array i min min array i sum array i return sum n main inti floatave score 10 Input ave average score 10 printf max 6 2f nmin 6 2f naverage 6 2f n max min ave 例全局变量 第七章函数 back 23 六 变量的存储类别 变量定义的一般形式如下 存储类型标识符数据类型变量名 变量名 一 auto变量 局部变量可以定义为auto型 而全局变量不能被说明成此类型对于局部变量 如果没有指定存储类型 或使用了auto说明符 糸统就认为所定义的变量具有自动类别 因此 intx 等价于autointx auto变量的存储单元被分配在内存的动态存储区 每当进入函数体或复合语句时 糸统自动为auto变量分配存储单元 退出时自动释放这些存储单元另作它用 因此 这类局部变量的作用域是从定义的位置起 到函数体或复合语句结束为止 所有自动类存储单元都是在进入这些局部变量所在的函数体或复合语句时生成 退出其所在的函数体或复合语句时消失 这就是自动类局部变量的 生存期 当再次进入函数体或复合语句时 系统将为它们另行分配存储单元 未赋初值的自动变量其值不确定 自动变量的赋初值是在程序运行过程中进行的 每进入一次函数体或复合语句 就赋一次初值 第七章函数 24 寄存器变量也是自动类变量 它与auto类变量的区别在于 用register定义的变量占CPU中的寄存器 而auto类的变量占用内存的动态存储区 程序运行时访问寄存器的速度要比访问内存的速度快得多 因此 当程序对运行速度有较高要求时 把那些频繁引用的少数变量定义为寄存器类型 可以显著地提高运行速度 在使用寄存器类型的变量时需要注意 1 CPU中的寄存器是有限的 因此只能说明少量 两个左右 的寄存器变量 2 register型变量的值是存放在CPU中的寄存器中 而不是放在内存中 所以register型变量没有地址 也就不能对它们进行求地址运算 3 register型变量的说明应尽量放在靠近使用的地方 用完之后尽快释放 以提高寄存器的利用率 4 局部变量可以说明为register型 而全局变量不能被说明成此类型 二 register变量 第七章函数 25 三 static变量 static变量的存储单元被分配在内存的静态存储区中 它们在程序开始运行前就分配了固定的存储单元 在程序运行过程中占用的存储单元始终不变 只有在程序结束后 才释放所占用的内存单元 对于局部变量和全局变量都可以说明成static类型 静态局部变量如果进行初始化 只有第一次执行定义语句时随着定义而进行初始化 当退出所定义的函数或复合语句时 将保留当时值 再次进入所定义的函数或复合语句时 不重新定义 所以也不重新初始化 此时 该变量的值是上次离开时的值 静态局部变量如果不进行初始化 C语言编译系统将自动为其赋予零 第七章函数 26 例 static局部变量应用举例 includemain inti s intf intm for i 1 i 5 i s f i printf i d s d n i s intf intm staticintt 1 t t m return t 主函数中5次调用f函数 f函数中的局部变量t是静态变量 所以只有第一次调用时初始化为1 以后4次调用时都不再初始化 而引用上次函数调用结束时的值 全局变量无论是否被说明成static类型 都将占用静态存储区 只是说明成静态的全局变量将不能被其它编译单位所引用 第七章函数 27 四 extern说明的外部变量 1 在同一编译单位内用extern说明符来扩展全局变量的作用域全局变量是在函数外部定义的变量 它的作用域是从定义点开始到本源程序文件结束 如果全局变量的定义不在文件的开头 在定义点之前的函数想引用该外部变量 则应在引用之前用extern对该变量作说明 这样定义点之前的函数就可以引用该全局变量了 即在同一编译单位内扩展了全局变量的作用域 2 在不同编译单位内用extern说明符来扩展全局变量的作用域一个 程序可由一个或多个源程序文件组成 对于由多个源程序文件组成的程序 并且每个编译单位均需要引用同一个全局变量 这时若在每个文件中都定义这个全局变量 则在 连接 时将会出现 重复定义 的错误 解决的办法是在其中一个文件中定义所有的全局变量 其它文件中用extern对此变量进行说明 这样可以在不同编译单位内用extern说明符来扩展全局变量的作用域 注意 全局变量的说明与全局变量的定义不同 全局变量的定义只能出现一次 而全局变量的说明可出现多次 因为定义点之前可以有多个函数都可引用该全局变量 第七章函数 28 例 在不同编译单位内extern说明符应用举例 文件1 file a c includeintx 10 定义外部变量x和y main voidsub 在主调函数中说明被调函数sub是void类型 sub 调用函数sub printf x d n x 文件2 file b c voidsub void 函数sub定义在另一个文件中 externintx 说明定义在另一个文件中的外部变量x x 5 程序运行结果如图在file a中定义的全局变量x 在file b中用extern进行说明就可以使用了 扩展了全局变量的作用域 第七章函数 back 29 七 嵌套调用和递归调用 一 嵌套调用C规定 函数定义不可嵌套 但可以嵌套调用函数 第七章函数 30 例求三个数中最大数和最小数的差值 intdif intx inty intz intmax intx inty intz intmin intx inty intz voidmain inta b c d scanf d d d intdif intx inty intz returnmax x y z min x y z intmax intx inty intz intr r x y x y return r z r z intmin intx inty intz intr r x y x y return r z r z 第七章函数 31 二 递归调用 在调用一个函数的过程中又出现直接或间接地调用该函数本身 成为函数的递归调用 举例 用递归方法求n floatfac intn floatf if n 0 printf n 0 dataerror f 1 elseif n 0 n 1 f 1 elsef fac n 1 n return f voidmain intn floaty printf inputainternumer scanf d 第七章函数 back 32 八 函数的存储类型 函数一旦定义后就可被其它函数调用 但当一个源程序由多个源文件组成时 在一个源文件中定义的函数能否被其它源文件中的函数调用呢 为此 语言又把函数分为两类 外部函数和静态函数 第七章函数 33 一 外部函数 当定义一个函数时 如果在函数的返回值类型前加上说明符extern 则表示此函数是 外部函数 C语言规定 如在函数定义中省略extern 则隐含为extern 所以 我们以前所定义的函数都属于外部函数 例如函数首部可以写为 externfloatmax floatx floaty 外部函数在整个源程序中都有效 在一个源文件的函数中调用其它源文件中定义的外部函数时 应在调用语句所在的函数的说明部分用extern对被调用的函数进行说明 第七章函数 34 外部函数应用实例 文件1 file1 c include stdio h externvoidf 外部函数定义 voidff printf Thisisthefirstprogram n ff 调用另一个函数ff voidff printf Thisisthesecondprogram n 文件2 file2 c include stdio h main externvoidf 外部函数说明 表示f函数在其它源文件中 inti for i 0 i 2 i f 主函数中调用函数f 程序运行结果如图 整个程序由两个文件组成 在文件file2 c中主函数main调用f函数 而f函数的定义在文件file1 c中 因此 在main函数中使用extern对f函数加以说明 通过此例可知 使用extern声明就能够在一个文件中调用其它文件中定义的函数 即把一个函数的作用域扩展到说明它的另一个文件中 第七章函数 35 二 静态函数 定义函数时 如果在函数的返回值类型前加上说明符static 则表示此函数是 静态函数 例如 staticfloatmax floatx floaty 静态函数只能被本文件中的函数调用 而不能被同一源程序其它文件中的函数调用 静态函数也称为内部函数 但此时静态static的含义已不是指存储方式 而是指对函数的调用范围只局限于本文件 因此在不同的源文件中定义同名的静态函数不会引起混淆 第七章函数 back 36 九 函数程序举例 编写判断一个整数m是否为素数的函数 include includeintprime intm inti for i 2 i sqrt m i if m i 0 return0 return1 main intn printf Pleaseinputaintegernumer scanf d 分析 函数prime有一个整型参数m 函数功能是如果m是素数就返回1 否则返回0 第七章函数 37 编写函数fun按如下公式 includefloatfun intn inti floata a 1 for i 2 i n i a 1 5 a returna main printf A10 2f n fun 10 A1 1 A2 1 5 A1 A3 1 5 A2 An 1 5 An 1 计算A10的值 分析 变量a中放计算结果 先把公式中第一项放到a中 要计算An 只要将a 1 5 a 这条语句重复n 1次即可完成 第七章函数 38 includech

温馨提示

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

评论

0/150

提交评论