




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度银行资金监管与环保设备制造合作协议
- 2025年度矿山开采与加工合作协议书模板
- 建筑工作合同范本
- 二零二五年度口腔医院护士团队聘用与绩效改进协议
- 科技创新下酒店设计中的人性化与高效化
- 科技与环保的融合-科普知识在办公环境中的实践应用
- 门扇安装合同范本
- 线束合同范本
- 科技产品的用户体验设计与优化策略
- 考察活动合同范本
- 高中主题班会 悟哪吒精神做英雄少年-下学期开学第一课主题班会课件-高中主题班会课件
- 2025电力物资检储配一体化建设技术导则
- 新学期 开学第一课 主题班会课件
- 民法典合同编讲座
- 2024年青岛港湾职业技术学院高职单招语文历年参考题库含答案解析
- 广西壮族自治区公路发展中心2025年面向社会公开招聘657名工作人员高频重点提升(共500题)附带答案详解
- 大学转专业高等数学试卷
- DBJ51-T 198-2022 四川省既有民用建筑结构安全隐患排查技术标准
- 公司厂区保洁培训
- 江苏省招标中心有限公司招聘笔试冲刺题2025
- 2024年防盗门销售合同范本
评论
0/150
提交评论