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

下载本文档

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

文档简介

第9章 函数,函数的概述 函数的定义 函数的返回值与类型 函数的参数与传递方式 函数的调用 内部函数和外部函数 main函数,9.1 函数的概述,9.1.1 什么是函数 9.1.2 函数的分类,9.1.1 什么是函数,函数是c程序基本的组成单位。,范例9-1,9.1.2 函数的分类 1. 从函数定义的角度,可以将函数分为标准函数和用户自定义函数 2. 从有无返回值的角度,可以将函数分为有返回值函数和无返回值函数 3. 从函数的形式看,可以分为有参函数和无参函数。,#include void printstar( ) printf(“*“); int sum(int a,int b) return a+b; void main() int x=2,y=3,z; printstar(); z=sum(x,y); printf(“n %d+%d=%dn“,x,y,z); printstar(); ,9.2 函数的定义,函数定义的一般形式是: 函数类型 函数名( 类型说明 变量名,类型说明 变量名. ) 函数体 说明: 函数名必须符合标识符的命名规则; 函数类型规定了函数返回值类型; 函数名后面圆括号括起来的部分称为形式参数列表(即形参列表);,【范例9-2】 求最大值的函数的定义,int max(int a,int b) int c; c=ab?a:b; return c; ,9.2 函数的定义,说明: 函数体是由一对花括号“”括起来的语句序列,用于描述函数所要执行的操作。函数体又包含了说明部分和执行部分。 还有一类比较特殊的函数是空函数,即函数体内没有语句。 如:void empty() ,9.2 函数的定义,说明: c程序中所有的子函数都是平行的,它们之间可以相互调用,但是不能嵌套定义; int func_fst(int a,int b) /*第一个函数的定义*/ int func_snd(int c,int d) /*第二个函数的定义*/ 在函数定义中,可以包含对其他函数的调用,后者又可以调用另外的函数,甚至自己调用自己,即递归调用。,9.3 函数的返回值及类型,9.3.1 函数的返回值 9.3.2 函数的类型,9.3.1 函数的返回值 函数的返回值是通过函数中的return语句实现的。 return语句有两种格式: return expression; 或 return (expression);,【范例9-3】 编写cube()函数用于计算x3。,9.3.2 函数的类型 在定义函数时,必须指名函数的返回值类型; return语句中表达式的类型应该与函数定义时首部的函数类型是一致的; 如果二者不一致,则以函数定义时函数首部的函数类型为准。,【范例9-4】 改写范例9-3。,9.3.2 函数的类型 如果一个函数不需要返回值时,则将该函数指定为void类型,此时函数体内不必使用return语句 . 一个函数中可以有一个以上的return语句,但不论执行到哪个 return都将结束函数的调用返回主调函数,即带返回值的函数只能返回一个值。,* * *,【范例9-6】 改写范例9-2。,【范例9-5】 编写printdiamond()函数用于输出如下图形。,9.4 函数的参数与传递方式,9.4.1 函数的参数 9.4.2 函数参数的传递方式,9.4.1 函数的参数 函数的参数有两类:形式参数(简称形参)和实际参数(简称实参)。 函数定义时的参数称为形参,函数调用时使用的参数称为实参。,【范例9-7】 将两个数由小到大排序输出。,#include int max(int a,int b) int c; c=ab?a:b; return c; void main() int x,y; printf(“请输入两个整数:“); printf(“%d和%d的最大值为:%dn“,x,y,max(x,y); ,9.4.1 函数的参数 说明: 定义函数时,必须说明形参的类型,只能是简单变量或数组,不能是常量或表达式; 函数被调用前,形参不占用内存的存储单元;调用以后,形参才被分配内存单元,函数调用结束后,形参所占用的内存也将被回收,被释放; 实参可以是常量、变量,其它构造数据类型或表达式; 实参的个数、出现的顺序和实参的类型应该与函数定义中形参表的设计一一对应。,9.4.2 函数参数的传递方式 实参对形参的数据传递是“值传递”,即单向传递 。 【范例9-8】 使用函数交换两个变量的值。,9.5 函数的调用,9.5.1 函数调用方式 9.5.2 函数的声明 9.5.3 函数的 嵌套调用 9.5.4 函数的递归调用,9.5.1 函数调用方式 函数调用的一般形式有两种: 1. 函数语句 : 函数名 (实参表列); 或 函数名(); 如:swap(x,y); 2. 函数表达式: 如:m=max(a,b); m=3*max(a,b); printf(“max is %d”,max(a,b) ;,【范例9-9】 编写一个函数,求任意两个整数的最小公倍数。,不要求函数带返回值,必须有 返回值,9.5.2 函数的声明 函数声明采用函数原型的方法; 有参函数声明形式为:函数类型 函数名 (形参列表); 无参函数的声明形式为:函数类型 函数名(); 注 意: (1)函数声明包含了函数的首部和一个分号“:”,函数体不用写。 (2)有参函数声明时的形参列表只需要把参数类型给出就可以,如:int power(int,int); (3)函数声明可以放在所有函数的前面,也可以放在主调函数内被调函数之前。,【范例9-10】 编写一个函数,求半径为r的球的体积。球的半径r由用户输入。,9.5.3 函数的嵌套调用 函数之间的关系是平行的,在函数定义时不能嵌套定义; 但是c语言允许进行嵌套调用。,范例9-11,9.5.4 函数的递归调用 在调用一个函数的过程中,又直接或者间接地调用了该函数本身,这种形式称为函数的递归调用,这个函数就称为递归函数。 递归函数分为直接递归和间接递归两种: 1、直接递归就是函数在处理过程中又直接调用了自己,如: 01 int func(int a) 02 03 int b,c; 04 05 c=func(b); 06 07 ,9.5.4 函数的递归调用 2、如果函数p调用调用函数q,而函数q反过来又调用函数p,就称为间接递归。如:,9.5.4 函数的递归调用 【范例9-12】 用递归方法求n!(n0)。 【范例9-13】 用递归法求fibonacci数列。,9.6 内部函数和外部函数,9.6.1 内部函数 9.6.2 外部函数,9.6.1 内部函数 在一个源文件中定义的函数只能被本文件中的函数调用,而不能被同一源程序其它文件中的函数调用,这种函数称为内部函数。 定义内部函数的一般形式是: static 类型说明符 函数名() 例如: static int f(int a,int b); /*内部函数前面加static关键字*/ ,9.6.2 外部函数 外部函数在整个源程序中都有效,只要在定义函数时,前面加上extern关键字即可 定义的一般形式为: extern 类型说明符 函数名(形参表) 例如: extern int f(int a,int b) ,范例9-15,9.7 main函数,c程序的执行总从main函数开始; 注意: main函数可以调用其他函数,但其他函数不能调用main函数。main函数也不能调用自己。 main函数可以带有两个参数,其一般形式是: int main(int argc,char *argv ) 函数体 ,范例9-16,9.8 综合应用用截弦法求方程的根,【范例9-17】 编写一个程序,实现用截弦法求方程x3-5x2+16x-80=0在区间-3,6内的根。,范例9-17,x1,x2,x,f(x),f(x2),f(x1),x1,f(x1),9.10 跟我上机,1编写函数prime,判断给定的整数x是否为素数,在主函数输入一个整数,输出是否是素数。 2. 编写函数,求 (其中m,n由用户输入)。 3. 编写函数,根据整型参数m的值,计算下列公式的值: 4用递归法反序输出一个正整数的各位数值,如输入4532,应输出2354。,第10章 函数中的变量,局部变量与全局变量 变量的存储类别,10.1 局部变量与全局变量,10.1.1 局部变量 10.1.2 全局变量,10.1.1 局部变量 局部变量就是在函数内部或者块内定义的变量。局部变量只在它的函数内部或块内部有效; 例如: int func(int a,int b) /*函数func1*/ double x,y; main() int m,n; ,变量a,b,x,y只在func函数内有效,变量m,n只在main函数内有效,10.1.1 局部变量 说明: 主函数main中定义的变量(m,n)也只在主函数中有效,并不是因为在主函数中定义而在整个文件或程序中有效。因为主函数也是一个函数,它与其它函数是平行关系。 不同函数中可以使用相同的变量名,它们代表不同的变量,之间互不干扰。 在一个函数内部,还可以在复合语句(块)中定义变量,这些变量只在本复合语句中有效。,10.1.1 局部变量 说明: 如果局部变量的有效范围有重叠,则有效范围小的优先 ,如: void main() int a,b,c; int c; c=a+b; ,局部变量c优先,a,b,c在此范围有效,范例10-1,10.1.2 全局变量 在函数之外定义的变量称为全局变量,又称外部变量 。 例如: int a=2,b=5; /*全局变量*/ int f1() /*定义函数f1*/ double c,d; /*全局变量*/ void f2() /*定义函数f2*/ main() /*主函数*/ int e,d; /*全局变量*/,e,f的作用域,c、 d 的作用域,a、 b 的作用域,范例10-2,10.1.2 全局变量 注 意:当局部变量与全局变量同名时,在局部变量的作用范围内,全局变量不起作用,即局部变量优先。 在实际使用过程中,建议不在必要时不要使用全局变量。,范例10-3,10.2 变量的存储类别,10.2.1 自动类型(auto) 10.2.2 寄存器类型(register) 10.2.2 静态类型(static) 10.2.2 外部类型(extern),10.2.1 自动类型(auto) 自动类型关键字:auto。其一般形式为: auto 类型 变量名; 例如: int func1(int a) auto int b,c=3; ,10.2.2 寄存器类型(register) 寄存器类型变量的存储单元被分配在寄存器当中,用关键字register说明,其一般形式为: register 类型 变量名; 例如:register int a; 注意: 寄存器类型的变量不宜过多; 变量的长度应该与通用寄存器的长度相当,一般为int型或char型; 寄存器变量的定义通常是不必要的。,范例10-4,10.2.3 静态类型(static) 静态类型的变量占用静态存储区,用static关键字来说明,其一般形式为: static 类型 变量名; 例如:static int a; 静态类型又分为静态局部变量和静态全局变量。,10.2.3 静态类型(static) 1、静态局部变量 定义在函数内的静态变量称为静态局部变量。 说明: 静态局部变量的生存期是整个程序的运行期间; 静态局部变量具有局部变量的性质,即其作用域是局限在定义它的本函数体内的,但其值仍然存在,因为存储空间并未释放。 静态局部变量的赋初值的时间是在编译阶段,并且只被赋初值一次,即使它所有的函数调用结束,也不释放存储单元。,范例10-5打印1到5的阶乘,10.2.3 静态类型(static) 2、静态全局变量 在定义全局变量时前面加上关键字static,就是静态全局变量。 静态全局变量的特点是: 其作用范围(即作用域)是定义它的程序文件,而不是整个程序; 静态全局变量的生存期是整个程序运行期间; 使用静态全局变量的好处是同一程序的两个不同的源程序文件中可以使用相同名称的变量名,而互不干扰。,范例10-6,10.2.4 外部类型(extern) 在任何函数之外定义的变量都叫做外部变量。外部变量通常用关键字extern说明。其一般形式为: ex

温馨提示

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

评论

0/150

提交评论