C语言程序设计ch7函数的概念.ppt_第1页
C语言程序设计ch7函数的概念.ppt_第2页
C语言程序设计ch7函数的概念.ppt_第3页
C语言程序设计ch7函数的概念.ppt_第4页
C语言程序设计ch7函数的概念.ppt_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

第七章 函 数,7.1 函数的概念,C 语言程序完全是由函数组成。除语言本身提供的库函数和必须包含的 main 函数外,用户还可以根据需要定义任意多个自己的函数。,main() char ss10 = “12345” ; strcat(ss, “6789”); gets(ss); printf(“%sn”, ss); ,标准 库函数,一、定义格式,7.2 函数的定义和返回值,类型名 函数名(形式参数表) 形式参数说明; 说明语句; 执行语句; ,函数体,int add(x,y) int x,y; int z; z=x+y; return(z); ,二、函数的返回值,return(表达式);,1、常量 2、变量 3、表达式 4、指针值,int add(x,y) int x,y; int z; z=x+y; return(z); ,add (a , b) ;,int add ( x, y ),实际参数,main() int a=100,b=200,c ; c =add(a,b); printf(“c=%dn”, c); int add ( x, y ) int x,y ; int z ; z=x+y; return(z); ,7.3 函数的调用,一、函数调用格式,函数名(实参表) ;,形式参数,二、函数的调用规则,1、调用函数时,函数名必须与调用处的函数名完全一致。,2、实参的个数必须与形参的个数一致。,3、函数必须先定义,后调用。,4、函数可以直接或间接地自己调用自己,称为递归调用。,在调用函数时,一般 在主调函数和被调用函数之间有 信息传递 这是由函数中的参数来完成的。,7.4 调用函数和被调用函数之间的参数传递,实际参数,形式参数,(实参),(形参),地址传递 方式,若利用参数传递信息时 则有两种传递方式,将数据本身作为实参传 递给形式参数。,5,10,5,10,10,10,main() int a=5,b=10, c ; c=max(a,b); printf(“c=%dn”, c); ,实参与形参各占用不同的内存单元,(即形参的值不能传回给实参),main() int a=5,b=10, c ; printf(“a=%p,b=%pn”, ,练习,main() int a=100,b=200,c ; c =add(a,b); printf(“c=%dn”, c); int add ( x, y ) int x,y ; int z ; z=(+x)+(+y) ; return(z); ,101,201,add (a , b) ;,int add ( x, y ),将数据的存储地址作为实参传递给形参,main() static int a5=1,2,3,4,5,i ; add(a,5); for(i=0;i5;i+) printf(“ %d,”, ai); ,2000 2002 2004 2006 2008,a0 a1 a2 a3 a4,b0 b1 b2 b3 b4,2,3,4,5,6,add ( a , 5 ) ;,int add ( b , n ),1、实参与形参占用相同的内存单元,(即实现了利用参数来返回计算结果的功能),2、可以批量地传递数据,练习,main() static int a34= 1,3,5,7,2,4,6,8,15, 17, 34, 12; printf(“max=%dn “,max(a); max (int b 4) int i , j , t ; t=b00; for(i=0; it) t=bij; return(t); ,第七章 函 数,P144,main() int a=100 ,c ; func( ,int func( int *p ) int j ; j=*p+100 ; return(j) ; ,从上面的分析中,我们可以得出,使用参数传递地址时,当 对形参作出的任何变动,都将影响实参的变化。所以,利用这个 特性,可以在被调用函数中把它的处理结果送入某个参数的存储 空间,函数返回时,通过参数的地址就会把处理结果带 回调用函数,练习,main() float s10, ave ; int i,n=10 ; for(i=0; in; i+) scanf(“%f ”, ,A) 11 B) 20 C) 21 D) 31,请写出下列程序的运行结果,main() int x=6,y=7,z=8,r ; r=f (x-,y+,x+y),z-); printf(“r=%dn”, r); ,C) 21,7.5 函数的递归调用,递归函数的典型例子是 计算阶乘 的函数,首先我们来分析一下阶乘计算的公式,并从中找出 递归算法和终结条件,n!=1X2X3XXn,=nX(n-1) XX3X2X1,=nX(n-1)!,1!=1,因此, 要想计算出n!,必须计算出 (n-1)!; 计算出 (n-1)!, 必 须计算出(n-2)!; ;由此类推,直到推到 1!=1,返回后即可依次计 算出 2!,3!, (n-1)!, n! 。,4!=4X 3!,f(n)=nX f(n-1) f(1)=1,例如,计算4!,其递归过程是:,3!=3X 2!,2!=2X 1!,1!=1,1!=1 2!=2X 1! =2 3!=3X 2! =3X2 =6 4!=4X 3! =4X6 =24,根据上面的分析我们知道,阶乘计算 的递归算法可归纳如下:,f(n)=nX f(n-1) f(1)=1,main() int t; t=fun(4); printf(“%dn”, t); ,4!,fun(4),第七章 函 数,P111,int f(x) int x ; int y, z ; z =f(y) ; return(2*z) ; ,直接调用,间接调用,递归函数的调用可分为,int f1(x) int x ; int y, z ; z =f2(y) ; return(2*z) ; ,int f2(t) int t ; int a, c ; c =f1(a) ; return(3+c) ; ,练习,age(5) =16+2=18,age(4) =14+2=16,age(3) =12+2=14,age(2) =10+2=12,设 age 表示年龄,则有如下:,age(5) =age(4)+2,age(4) =age(3)+2,age(3) =age(2)+2,age(2) =age(1)+2,age(1) =10,main() printf(“%d”, age(5); ,age(5),练习,main() int x=4 ; float sum; sum=fac(x); printf(“%dn”,sum); ,fac(4),作业,int w=3; (97.9) main() int w=10; printf(“%dn”, fun(5)*w); ,fun(5),3*2=6,6*3=18,18*4=72,72*5=360,fun(5)*w,360*10=3600,作业,main() printf(“%dn”, fun(9); ,fun(9),p=3-3=0,作业,main() int a,b,c; a=165; b=65; c=mult(a,b); printf(“%d*%d=%dn”, a,b,c); ,作业,main() printf(“%5d n”, fun(4); ,作业,main() int x,a =2,3,4,5,6,7,8,9; x=f(a,3); printf(“%d n”, x); ,请阅读以下函数并指出该函数的功能,4,作业,fun(char s ,char t ) int i=-1 ; while(+i,si=ti ,作业,main() int x=2,i,k; for(i=0;i2;i+) k=f(a+); printf(“%d n”, k); ,7.6 变量的使用范围与存储类型,3、变量的使用范围及其说明方法,4、变量的存储类别及其定义方法,变量的使用范围包括有 在一个函数内部使用的变量- 局部变量; 在 函 数 之 外部 使用的变量- 全局变量;,main() int a, b ; ,1、局部变量,在一个函数内部定义的变量称为局部变量,局部变量,局部变量,1、主函数中定义的变量也只用在主函数中有效;,2、不同函数中可以使用相同的变量名,且它们代 表不同的存储单元,互不干扰;,3、形式参数也是局部变量。其它函数是不能调用 该形参的;,4、在一个函数内部,可以在复合语句中定义变量 ,这些变量只能在本复合语句中有效。,main() int x=1; int x=2; int x=3; printf(“x1=%dn”, x); printf(“x2=%dn”, x); printf(“x3=%dn”, x); ,char c1,c2; int p=1,q=5; main() int a, b ; a=p; b=q; ,2、全局变量,在函数之外定义的变量 称为 全局变量 全局变量可以为本文件中其它函数所共用。 它的使用范围: 从定义变量的位置开始到本源程序文件结束,全局变量,举例,int a=13, b=-8; main() int m ; m=max(a,b); printf(“m=%dn”, m); ,举例,int a=3, b=5; main() int a=8,m ; m=max(a,b); printf(“m=%dn”, m); ,1、若在同一个源文件中,如有全局变量与局部 变量同名时,则在局部变量的作用范围内, 全局变量不起作用。,2、设置全局变量的作用是: 增加函数间数据联系的渠道。,由于同一个文件中的所有函数都能引用全局变量的值,因 此如果在一个函数中改变了全局变量的值,就能影响到其它函 数,相当于各个函数间有直接的传递通道。,float max,min; main() float ave, s5; int i ; for(i=0;i5;i+) scanf(“%f ”,si); ave=fun(s, 5); printf(“max=%f,min=%f, ave=%f n”, max,min,ave); ,全局变量,s0 s1 s2 s3 s4,a0 a1 a2 a3 a4,88,76,90,65,68,88,88,76,68,90,65,练习,int d=1; main() int a=3; fun(a); d+=a+; printf(“%dn”, d); ,8,4,8,4,4,练习,int x,y; main() int a=7,b=5; x=a+b; y=a-b; num( ); printf(“x=%d,y=%dn”, x,y); ,5,12,2,25,在C语言中,每一个变量和函数有两个属性:数据类型和数据的存储类别。 数据类型,如整型、实型等; 存储类别,指的是数据在计算机中的存储方式, 也可以说数据的 存储地点。,内存 储 器 (memory),寄 存 器 (CPU),数 据 区(动态),数 据 区(静态),内存存储区,程 序 区,用户区,在程序运行期间分配固定 的存储空间(如 全局变量)。,只有当函数被调用时才开始分配存储空间,在函数执行结束时就释放这些空间。在程序执行过程中,这种分配和释放是动态的(如 局部变量)。,关键词 auto,一、局部变量的存储方式,auto int b=1, c=2;,fun( ) auto int b=1, c=2; b+; c+; printf(“b=%d, c=%dn”, b, c); return; ,main() int i , ; for(i=0; i 2; i+) fun( ); ,2,3,1,2,2,3,举例,关键词 static,static int b=1, c=2;,fun( ) static int b=1, c=2; b+; c+; printf(“b=%d, c=%dn”, b, c); return; ,main() int i , ; for(i=0; i 2; i+) fun( ); ,1,b,2,c,2,3,3,4,int f( int a) auto int b=0; static int c=3; b=b+1;c=c+1; return(a+b+c); ,main() int a=2, i ; for(i=0; i 3; i +) printf(“%dn”, f(a); ,0,b,3,c,1,举,例,4,7,0,1,5,8,0,6,9,fun( int a,int b) static int m, i=2; i+=m+1; m=i+a+b; return(m); ,main() int k=4,m=1,p; p=fun(k,m); prinf(“%d,”,p); p=fun(k,m); prinf(“%d,”,p); ,练习,3,8,8,12,17,17,8, 17,main() fun(); fun(); ,练习,a0 a1 a2,0,2,4,0,4,8,main() int i; for(i=1;i=5;i+) printf(“%d!=%dn”, i, fac(i); ,1!=1 2!=2 3!=6 4!=24 5!=120,二、全局部变量的存储方式,int a=2, b=5; main() int i; printf(“a=%d, b=%dn”,a,b); fac( ); ,全局变量的扩展调用。 我们知道一个C 语言程序可以有一个或多个源程序 文件组成。如果程序是由多个源文件组成时,为了保障 某个全局变量能提供多个源文件中的函数调用,则可采 全局变量的扩展调用。,关键词 extern,1=3,9,5,2=100,6,10,6,88,3=88,6,200,2=100,7,10,7,4=88,7,200,5=88, 200,6=3,88,7,运算器,寄存器存储区,一般情况下,变量(包括静态和动态)的值都是存放在内存中的,当程序中用到哪一个变量的值时,则由控制器发出指令将内存中该变量的值送到运算器中进行运算,之后再将运算结果送回内存中存放。,内 存,但是,在有些情况下需要某些变量中的值频繁地读写(如某循环变量需要执行10000次循环,显然为了读写变量的值就需要花费许多的时间。因此,为了提高程序的执行效率,在C语言中允许将这些变量的值可以储存在CPU中的寄存器中,需要时可直接从寄存器中读出参加运算,而不必再到内存中去读写。由于寄存器的存取速度远高于内存的存取速度,因此可以提高执行效率。 这种变量称为 “寄存器变量” 。,寄 存 器,运算器,关键词 register,register int a,b;,int fac(int n) register int i, f=1; for(i =1; i =n; i +) f=f* i ; return( f ); ,1、只有 局部自动变量 和 形参 可以作为寄存器变量 。,5、局部静态 变量不能作为寄存器变量。,register static int a,b,c; 不能把变量 a,b,c 既放在静态存储区中,又放在寄存器中,二 者只能居其一。 对于一个变量只能定义为一个存储类别。,2、对于占用字节数多的变量,如: long、float、double 型变量 不能 说明为寄存器型变量。,3、由于寄存器中的数据可以直接访问,因此比其它存储类别的变 量运算速度要快。所以对于反复使用的变量均可作为寄存器变量。,4、寄存器型变量都是在某个函数中定义的,所以一旦退出该函数后就会 被 释放。,存储类别标识符表,自动型,auto,内存动态数据区,CPU 中的通用寄存器,内存静态数据区,静态型,寄存器型,扩展型,register,static,extern,内存静态数据区,作业,main() incx( ); incy( ); incx( ); incy( ); incx( ); incy( ); ,作业,main() int a=2,i,k; for(i=0;i2;i+); k=f(a+); printf(“%dn”

温馨提示

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

评论

0/150

提交评论