语言西理生活-课件第6章函数_第1页
语言西理生活-课件第6章函数_第2页
语言西理生活-课件第6章函数_第3页
语言西理生活-课件第6章函数_第4页
语言西理生活-课件第6章函数_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

1第6章函数

标准函数函数定义函数调用和声明函数嵌套调用和递归调用变量的存储类别2float

volume(int,int,int);

main(){

int

i,w,h;floatv;printf(“pleaseinputl,w,h”);scanf(“%d%d%d”,&l,&w,&h); v=volume(l,w,h); printf("v=%f",v); }floatvolume(intlength,intwidth,inthigh)

{

floatv;

v=length*width*high;

returnv; }

提示:C程序是由多个函数组成,分为库函数和自定义函数。3标准函数(库函数)4库函数调用形式

函数名(参数表);y=pow(x,2.5)+1.3

可以是常量、变量和表达式。若有多个用逗号分开。y=sqrt(4);y=fabs(-7);y=x2.5+1.3提示:常量、变量、函数可以看成是表达式的一个特例。5必须包含相关头文件#include“math.h”#include<stdio.h>6函数定义和返回值7main(){

floatm,n,f;inti;m=1;for(i=1;i<=5;i++)m=m*i;n=1;for(i=1;i<=2;i++)n=n*i;f=1;for(i=1;i<=3;i++)f=f*i;printf(“%f”,m/(n*f));}分析:为什么要使用函数8main(){floatm,n,f;

m=fact(5);

n=fact(2);

f=fact(3);printf(“%f”,m/n/f);}floatfact(int

n){inti;floatf;f=1;for(i=1;i<=n;i++)f=f*i;

returnf;}9函数定义函数类型

函数名(类型

变量,类型

变量){声明部分;语句部分;

}floatfact(intn){inti;floatf;f=1;for(i=1;i<=n;i++)f=f*i;

returnf;

}形参提示:在定义函数时,括号里面定义的变量称为形参。10函数类型缺省为int

spc(intn){}

若无返回值,则可定义为void

voidspc(intn){}说明11形参

是用来存储传递给函数的值,也可没有。提示:形参变量只有在函数调用时才分配内存单元。在函数调用结束时,即释放所分配的内存单元。intspc(void){}

intspc(){}12函数可有返回值,也可没有函数类型是非void返回一个不确定的值无return语句返回一个确定的值

return

表达式;

return(表达式);注意:表达式值的类型应和函数类型一致。提示:函数类型是定义函数时指定的类型,而不是返回的表达式类型。13intfact(intn){inti;intf;f=1;for(i=1;i<=n;i++)f=f*i;

returnf;

}shortfact(intn){inti;intf;f=1;for(i=1;i<=n;i++)f=f*i;

returnf;

}运行结果出错intfact(intn){inti;intf;f=1;for(i=1;i<=n;i++)f=f*i;}

返回的是一个随机的整数结论:函数类型如果不是void,不管函数体中是否有return语句都会返回一个值。有return语句会返回一个确定的值,否则返回的是一个随机数。14return;

若返回值类型是void,函数体要包含return语句时,只能是以下形式或没有。voidpstar(intn){

inti;for(i=1;i<=n;i++)printf(“*”);

return;}voidpstar(intn){

inti;for(i=1;i<=n;i++)printf(“*”);}返回函数调用处15函数执行到return或遇到函数的右},函数调用结束,则返回到调用处。空函数

pstar(){}16函数不能嵌套定义func1(){

…}

func2(){…

}func1(){…

func2(){…}…}提示:函数的定义都是并列的关系。17编写函数求两个整数中较大数intmax()intx,inty{}intz;if(x>y)z=x;elsez=y;return

z;return

(x>y)?x:y;18编写函数定义打印n个空格的函数voidspc()intn{}inti;for(i=1;i<=n;i++)printf(““);19区别voidspc(intn){inti;for(i=1;i<=n;i++)printf(““);}spc(intn){inti;for(i=1;i<=n;i++)printf(““);}spc(4);y=spc(4);spc(4);y=spc(4);返回随机数,没有意义20编写函数定义一个求阶乘函数doublefact()intn{}doublef;inti;f=1;for(i=1;i<=n;i++)f=f*i;returnf;21编写函数验证某一数是否为素数intisPrim()intx{}inti;for(i=2;i<x;i++)if(x%i==0)return

0;return

1;22函数调用和声明23函数调用

函数名(表达式1,表达式2)提示:实参和形参按顺序对应,一一传递数据。函数的实参实参

调用函数时传递给函数的值,可为变量、常量、表达式。形参

定义函数时,接受传过来的实参值的变量,只能是变量。24函数的调用形式函数语句

main()

{

spc(4);

}void

spc(intn)

{inti;for(i=0;i<n;i++)printf(“”);}

提示:这种调用形式适合函数没有返回值的情况25函数表达式main(){

inta,b,c;scanf(“%d%d”,&a,&b);c=2*max(a,b);}intmax(intx,inty){

return(x>y)?x:y;}

提示:这种调用形式适合函数有返回值的情况26函数参数int

max(intx,inty){

return(x>y)?x:y;}main(){

inta,b,c,y;scanf(“%d%d%d”,&a,&b,&c);printf(“%d”,max(a,b));y=}

提示:这种调用形式适合函数有返回值的情况max(a,b)max(),c;27函数的声明函数声明是指在调用某函数之前应对该被调函数进行说明函数类型为int或char的除外

注意:函数和变量一样,必须先声明后使用28函数说明的位置所有函数定义的最上面则该位置后面的所有函数都可以访问。函数内变量说明区中只能在该函数中调用说明的函数。29floatvolume(int,int,int);

main(){

int

i,w,h;floatv;scanf(“%d%d%d”,&l,&w,&h); v=volume(l,w,h); printf("v=%f",v); }floatvolume(intlength,intwidth,inthigh)

{floatv;

v=length*width*high; returnv;

}

函数定义在后函数调用在前函数声明30floatvolume(intlength,intwidth,inthigh);

main(){

int

i,w,h;floatv;scanf(“%d%d%d”,&l,&w,&h); v=volume(l,w,h); printf("v=%f",v); }floatvolume(intlength,intwidth,inthigh)

{floatv;

v=length*width*high; returnv;

}

31floatvolume(int

x,inty,intz);

main(){

int

i,w,h;floatv;scanf(“%d%d%d”,&l,&w,&h); v=volume(l,w,h); printf("v=%f",v); }floatvolume(intlength,intwidth,inthigh)

{

floatv;

v=length*width*high; returnv;

}

32floatvolume(intlength,intwidth,inthigh)

{

floatv;

v=length*width*high; returnv;

}

main(){

int

i,w,h;floatv;scanf(“%d%d%d”,&l,&w,&h); v=volume(l,w,h); printf("v=%f",v); }提示:函数定义在前,使用在后可以不用说明函数33main(){floatvolume(inti,intw,inth);

int

i,w,h;floatv;scanf(“%d%d%d”,&l,&w,&h); v=volume(l,w,h); printf("v=%f",v); }exam(){}

float

volume(intlength,intwidth,inthigh)

{floatv;

v=length*width*high; returnv;

}

在该函数内部不能调用volume函数34函数调用

35main(){longm,n;

m=fact(5);

n=fact(2);printf(“%ld”,m/n);}longfact(intn){inti;longf;f=1;for(i=1;i<=n;i++)f=f*i;returnf;}将5=>n将2=>n函数的调用返回5!返回2!36main(){longm,n;m=5;

n=fact();

}longfact(){longf=1,i;for(i=1;i<=m;i++)f=f*i;returnf;}

C语言规定:在一个函数内部不能引用其他函数内部定义的变量。不同函数中定义的变量之间没有任何关系。37调用函数与被调函数之间的数据传递实参和形参之间进行数据传递通过return通过全局变量38实参—形参传递参数的原理

当调用一个函数时,系统为形参在内存中分配相应的存储单元,并且把

实参值=>

形参这样就实现了把数据由调用函数=〉被调函数。39使用两种传递方式值传(实现单向传递)

实参:变量、常量、表达式

形参:同类型的变量地址传递(实现双向传递)

实参:变量的地址

形参:指针变量40利用return返回一个值intplus(intx,inty){intz;z=x+y;returnz;

}main(){

inta,b,c;a=8;b=7;c=plus(a,b);printf(“%d”,c);}mainplusx=ay=b

提示:通过return只能向调用函数传回一个值。abcxyz8715871541main(){int

a,b;a=8;b=7;

swap(a,b);printf(“%d%d”,a,b);}swap(intx,inty){intz;z=x;x=y;y=z;}值传的特点mainswapx=ay=b

提示:形参在函数体的任何变化不会影响到对应的实参abxyz87878742函数的嵌套调用f1(){…}f2(){…

f1();…}main(){

f1();

f2();}main(){

f1();

f2();}f1(){…}f2(){…

f1();…}43计算(1!)2+(2!)2+(3!)2+(4!)2+(5!)2doublefact(intn){

inti;doublef;f=1;for(i=1;i<=n;i++)f=f*i;

returnf;}doublefun(intx){

doublef;f=fact(x);returnf*f;}main(){doubles=0;inti;for(i=1;i<=5;i++)s=s+fun(i);printf(“s=%f”,s);}44函数递归调用

45函数的递归调用

在一个函数中,直接调用了自身,称为递归int

f(intx){…

f(4);…

}46能写成递归函数的问题可以把一个问题的求解转换为一个新问题,而新问题的求解跟旧问题的求解一致,只是所处理的数据不同,但数据是有规律递增或递减。这种转换可使问题得到解决。必须要有一个明确结束递归的条件。47n!=1n=0或1n*(n-1)!n>15!5*4!4*3!3*2!2*1!12266242412012048编写求某一数阶乘的递归函数n!=1n=0或1n*(n-1)!n>1doublefact(intn){

doublef;

if(n==1||n==0)f=1;

else

}f=n*n-1fact();returnf;49递归函数的执行过程double

fact(intn){doublef;

if(n==0||n==1)f=1;elsef=n*fact(n-1);returnf;}main(){doubley;y=fact(3);}f=3*fact(2);returnf;f=2*fact(1);returnf;f=1;returnf;fact

n:3

fact

n:2

fact

n:150long

fun(intn){longs;

if(n==1||n==2)s=2;elses=n-fun(n-1);

returns;}main(){longy;y=fun(3);}fun

n:3s=3-fun(2);returns;fun

n:2s=2;returns;结果为151fun(intx){

if(x/2>0)fun(x/2);printf(“%d”,x);}main(){

fun(6);}fun

x:6fun(3);printf(“%d”,6);fun

x:3fun(1);printf(“%d”,3);输出为:136fun

x:1printf(“%d”,1);52#include<stdio.h>voidputstr(){charch;ch=getchar();if(ch!='\n')putstr();putchar(ch);}main(){putstr();}

输出:edcba

输入:abcde53变量的作用域和存储类别54变量的作用域和生存期作用域

变量可使用的范围变量的定义位置决定了其作用域生存期

变量在内存的存在时间55全局变量局部变量根据变量的定义位置(作用域),将变量分为:56局部变量floatf1(inta){intb,c;…}charf2(intx,inty){inti,j,b,c;…}main(){intm,n;…}

函数内部定义的变量,调用函数时生成,退出函数时消亡局部变量的作用域仅限于函数内,离开该函数后再使用这种变量是非法的。同一函数内部变量不能重名。不同函数的局部变量可重名,但是是不同的量。a,b,cx,y,i,j,b,cm,n57复合语句内定义的变量main(){inta,b;a=b=6;

{intc=5,a;a=b+c++;

}a++;}a,ca,bmain()复合语句abac6651167

提示:在复合语句的的范围中访问的复合语句中定义的同名变量。58全局变量

作用范围从定义位置开始到本文件结束的所有函数生存期

在整个程序的运行期间所有函数外部定义的变量59int

p=1,q=5;floatf1(inta){intb,c;…}char

c1,c2;charf2(intx,inty){inti,j,b,c;…}main(){intm,n;…}p,qc1,c260int

a=3,b=5;max(inta,intb){intc;c=a>b?a:b;returnc;}main(){inta=8;printf(“%d”,max(a,b));}局部变量与全局变量同名时的处理全局量main()max()aabcab358858

提示:在函数中访问的是函数中定义的同名局部变量。61通过全局变量在函数间传递数据inta=3,b=5;fun(void){intc;c=a;a=b;b=c;}main(){printf(“%d%d”,a,b);fun();printf(“%d%d”,a,b);}缺点:

增加了函数之间的联系,使函数通用性减低了。62变量的存储类型

指示变量怎样存储,存储在内存什么区域用户区程序区

存储在静态存储区的变量,在程序运行期间都存在。动态存储区存储的变量,动态生成和消亡静态数据区动态数据区63存储类型

数据类型变量extern外部的static静态的auto自动的register寄存器的全局变量全局变量局部变量局部变量64自动的局部变量若没有指定局部变量的存储类别,为auto的。该变量存储在动态区,调用函数时生成该变量,退出函数时消亡。自动变量若初始化,每调用函数,都要进行初始化。作用域函数内部生存期调用函数生成,退出消亡65静态的局部变量在静态存储区存储生存期同全局量,在程序执行过程中一直存在。作用域

函数内部

静态局部变量初始化的值,是在编译阶段赋予的,在程序执行期间不再赋予。对未初始化的静态局部变量的值,C编译程序自动给它赋初值0。66intf(inta){

intb=0;

staticintc=3;

b++;c++;return(a+b+c);}main(){

inta=2,i;for(i=0;i<3;i++)printf(“%d”,f(a));}静态区main()f()作用域在函数f中ca3ab2201输出:74f()ab20158f()ab2016967intn=1;intfunc(void){

staticintx=4;inty=10,n=0;

温馨提示

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

评论

0/150

提交评论