版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章函数1主要内容第一节
C函数概述第二节C函数的定义第三节函数调用和参数传递第四节数组作为函数的参数第五节函数的多级调用第六节局部变量和全局变量第七节变量的存储类别第八节内部函数和外部函数2第一节
C函数概述print_mess(){printf("Howdoyoudo!\n");}printstar(){printf("*********\n");}main()(见ff1){
printstar();print_mess();
printstar();}3源文件1函数n函数2函数1源文件m源文件2一个C程序
一个C程序的源文件............4函数的概述Functionsbreaklargecomputingtasksintosmallerone,andenablepeopletobuildonwhatothershavedoneinsteadofstartingoverfromscratch.5第二节C函数的定义无参函数的定义类型标识符函数名(){说明部分语句}有参函数的定义类型标识符函数名(形式参数表列){说明部分语句}6例如:int
max(int
x,inty){intz;z=x>y?x:y;returnz;}对形参说明的传统方式intmax(x,y)intx,y;{intz;z=x>y?x:y;returnz;}7第三节函数调用和参数传递3.1形参和实参3.2函数返回值3.3函数调用的一般形式3.4函数的调用方式3.5被调用函数的说明83.1形参和实参形式参数:在定义函数时,函数名后面的括号中的变量称为形式参数,简称形参。实际参数:在调用函数时,函数名后面括号中的表达式称为实际参数,简称实参。9例:int
max(int
x,inty){intz;if(x>=y)z=x;elsez=y;return(z);}main(){inta,b,c;
scanf("%d%d",&a,&b);c=max(a,b);
printf(”%d\n",c);}10main()(ff2){inta,b;scanf("%d,%d",&a,&b);/*键入2,5*/printf(“a=%d,b=%d\n”,a,b);/*显示a=2,b=5*/exch(a,b);printf(“a=%d,b=%d\n”,a,b);}/*显示a=2,b=5*/int
exch(int
x,inty){intt;printf(“x=%d,y=%d\n”,x,y);/*显示x=2,y=5*/t=x;x=y;y=t;printf(“x=%d,y=%d\n”,x,y);}/*显示x=5,y=2*/11关于形参和实参的说明:1、形参的有效作用范围是:在其定义所在的函数内。2、实参对形参的数据传递是值传递,即单向传递。只由实参传给形参。思考:在主函数的最后插入:printf("x和y是:%d,%d\n",x,y);结果?!2525abxy2552abxy123、对于有参函数,调用语句中的实参个数等于被调用函数的形参个数。若实参个数>形参个数,去掉实参表中右边的几个参数。若实参个数<形参个数,结果是不可预料的数。4、形参仅在其定义所在的函数被执行时,系统才为其分配存储空间,退出该函数时该存储空间被系统收回。
5、当形参是变量,对应的实参可以是常量、变量、表达式或数组元素,但必须有确定的值,如:max(2,b)。调用时会将实参的值赋给形参变量。6、实参传递给形参的实际值必须与函数定义中的参数类型一致。避免发生类型不匹配的错误。133.2函数返回值一个函数中可以用return语句功能得到返回值return后面可以是一个表达式如果return语句中表达式的类型与函数值的类型不一致,以函数类型为准。如果被调函数中没有return语句,则带回的是一个不确定的值。为了明确表示不带返回值,可以用void定义无类型14见ff3intmax(floatx,floaty){floatz;if(x>=y)z=x;elsez=y;return(z);}main(){floata,b;intc;
scanf("%f%f",&a,&b);c=max(a,b);
printf(”%d\n",c);}15main()见ff4{floatdiv3(float,float);intdiv2(float,float);floata,b,c;scanf("%f,%f",&a,&b);c=div1(a,b);printf("%f\n",c);c=div2(a,b);printf("%f\n",c);c=div3(a,b);printf("%f\n",c);}
floatdiv1(floatx,floaty){return(x/y);}intdiv2(floatx,floaty){return(x/y);}floatdiv3(floatx,floaty){return(x/y);}16运行结果:3,50.6000000.0000000.600000173.3函数调用的一般形式
函数名(实参表);
例如:exch(a,b);
exch(int
x,int
y)实参自右向左的逐个传递与形参。18main()ff5{inti;i=1;test(i++,i);i=1;test(i,i++);}test(int
x,inty){printf("x=%d\ty=%d\n",x,y);}执行后:x=1y=1x=2y=119
3.4函数的几种调用方式
printstar();print_mess();
c=max(a,b);1.函数调用作为语句2.表达式中的函数调用3.函数调用作为函数的实际参数。printf("%d\n",max(a,b));203.5被调用函数的几点说明1.被调函数必须是已经存在的函数。2.如果使用库函数,必须在本文件开头加上用#include命令将调用有关库函数时所用的信息包含到本文件中。例如:
#include”stdio.h”3、如果是调用自己定义的函数,函数调用语句之前使用函数说明语句对该被调用函数作说明。说明形式为:类型标识符被调函数名(形参类型标识符);4、函数的两个操作概念函数定义函数说明21main()见ff6{doublepower(int,float);inti;
for(i=1;i<9;i++)printf(“%d%f\n”,i,power(i,1.5));』}doublepower(intn,floatx){inti;doublep=1;for(i=1;i<=n;i++)p=p*x;
return(p);
}/*函数说明*//*函数调用*//*函数定义*/22有些情况下可以不做说明:1.被调用函数定义在调用函数之前,可以免去说明。doublepower(intn,floatx)/*函数定义*/{inti;doublep=1;for(i=1;i<=n;i++)p=p*x;
return(p);}main(){inti;
for(i=1;i<9;i++)printf(“%d%f\n”,i,power(i,1.5));}/*函数调用*/232、在所有函数之前,在文件的开头,在函数的外部已说明了函数类型,则在各个主调函数中不必对所调用的函数再做类型说明。如:
floatf();charch();main(){...}/*不必再进行函数说明*/floatf(floatx,floaty){…}charch(charc1,charc2){…}3、如果函数值是整型或者字符型的时候,可以不必进行说明,系统已经对它们自动进行了说明。24第四节数组作为函数的参数数组元素作为函数的实际参数
数组元素的引用与一般变量的引用是一样的,传递的是数组元素的值,属于“值传递”方式。例、设a[8]和b[8]分别保存了A班和B班八门课程的平均成绩,现要统计出A班有几门课程的平均成绩高于B班25intbetter(floatave1,floatave2){if(ave1>ave2)return(1);elsereturn(-1);}main()见ff7{inti,k=0;floata[8]={65,78,67,90,84,63,58,76},b[8]={62,79,65,88,80,65,60,74};for(i=0;i<8;i++)if(better(a[i],b[i])>0)k=k+1;
printf("%d\n",k);}26数组名作为函数的实际参数
C语言中的数组名代表了数组在内存中存放的起始地址,所以数组名作为函数的参数传递的是数组的起始地址,属于“传地址”。说明:(1)用数组名作为函数的参数,必须对实参数组先定义,形参必须说明成与实参数组类型一致的数组。(2)形参数组和实参数组的数组名可以不一样,数组的大小也可以不一致。由于传递的是地址,所以形参数组和实参数组在内存中实际上是共用了连续的一块地址空间。27
用函数average()求30个学生英语课的平均成绩。见ff8floataverage(mark,n)intmark[];intn;{floatave;intsum=0,i;for(i=0;i<n;i++)sum=sum+mark[i];
ave=sum/n;
return(ave);}
main(){inti,score[30];
printf("请输入30个学生的英语成绩:\n");for(i=0;i<30;i++)
scanf("%d",&score[i]);
printf("%5.1f\n",average(score,30));
}28第五节函数的多级调用main函数的作用函数的嵌套调用函数的递归调用29主函数main的作用开始执行程序总控作用结束程序主函数main30函数的嵌套调用
函数1函数2函数3在程序的执行过成中,当调用一个函数时,在该函数中又在调用另一个函数。31〔例题〕见ff9#include<stdio.h>main()/*第一层*/{c();}/*第二层*/a()/*第三层*/{putchar('a');/*第四层*/b();/*第四层*/
putchar('a');}/*第四层*/b() /*第四层*/{putchar('b');}/*第五层*/c()/*第二层*/{putchar('c');/*第三层*/a(); /*第三层*/
putchar('c');}/*第三层*/该程序执行后显示cabac
32函数的递归调用当函数被调用时,又同时调用自身,被称为函数递归调用。见P115直接递归间接递归33例:共计5个人,有如下关系:见ff18
age(5)=age(4)+2
age(4)=age(3)+2
age(3)=age(2)+2
age(2)=age(1)+2
age(1)=10求第五个人的年龄?age(n)intn;{intc;if(n==1)c=10;elsec=age(n-1)+2;return(c);}main(){printf("%d",age(5));}Age函数共计调用5次,age(5)---age(1)递归调用共计进行4次在每一次调用时,不是立即得到递归值,而是一次一次地进行递归,直到age(1)为止。回推-----得到函数关系递推-----得到函数值递归条件----已知的值34例:用递归方法求n!。见ff11n!=1n=0,1n*(n-1)!n>16!--5!--4!--3!--2!--1!=1(已知条件)1!*2--2!*3--3!*4--4!*5--5!*6=720floatfac(intn){floatf;if(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}main(){intn;floaty;
scanf(“%d”,&n);y=fac(n);
printf(“%d!=%10.2f\n”,n,y);}35第六节局部变量和全局变量按照变量的作用范围,变量分为:局部变量在一个函数或复合语句内部定义的变量,也称内部变量。作用范围:在定义该变量的函数或复合语句内有效。全局变量函数外定义的变量。作用范围:从定义点开始到本源文件结束。36局部变量举例:floatf1(inta){intb,c;a,b,c有效
…}intf2(intx,inty){intb,c,i,j;x,y,b,c,i,j有效
…}main(){intm,n;m,n有效
...}说明:形参是局部变量main函数的变量也是局部的不同函数中变量的名字可以相同复合语句内可以定义变量,但有效区间为本语句内部37例func(int
a,charch){int
b=1,c=2;floatf;...
{int
a,b=3;a=b+c;
printf("a=%d\n",a);...}
a=b+c;
printf("a=%d\n",a);}a=5a=338全局变量举例:intk=1;/*全局变量*/floatf1(inta){intb,c;a,b,c有效
…}charc1;/*全局变量*/intf2(intx,inty){inti,j;x,y,i,j有效
…}doublep;/*全局变量*/main(){intm,n;m,n有效
...}P的作用范围c1的作用范围k的作用范围39见ff12andff188inta=3,b=5;max(int
a,intb){intc;形参a,b起作用的范围c=a>b?a:b;returnc;}main(){inta=6;局部变量a和全局变量b起作用的 范围printf(“%d”,max(a,b));}程序运行结果为
640如果在变量的定义点之前,有函数引用该外部变量,则在该函数中用关键字extern作”外部变量说明”。若在同一个源文件中,外部变量与局部变量同名,则在局部变量作用范围内,外部变量定义不起作用。41max(int
x,inty)/*definefunction*/{intz;z=x>y?x:y;returnz;}main(){externinta,b;/*defineexternvariabledeclare*/
printf(“%d”,max(a,b));}inta=13,b=-8;/*defineexternvariable*/程序运行结果为
1342第七节变量的存储类别变量的存储器类别寄存器静态存储区
内存动态存储区CPU寄存器变量静态存储区变量动态存储区变量
按照生存期43局部变量的存储方式
定义局部变量的存储类别时可以使用的三个关键字:
auto
自动变量
static
局部静态变量
register
寄存器变量说明存储类别缺省是auto.44局部变量存储类别的定义形式:CPU寄存器内存静态存储区动态存储区registerintaregisterstaticintaautofloatastaticinta45什么时候使用局部静态变量?例题:求1到5的阶乘见ff15。int
fac(intn){intf=1,i;for(i=1;i<=n;i++)f=f*i;returnf;}main(){inti;for(i=1;i<=5;i++)printf(“%d!=%d”,i,fac(i));}int
fac(intn){staticintf=1;f=f*n;returnf;}main(){inti;for(i=1;i<=5;i++)printf(“%d!=%d”,i,fac(i));}46int
f(inta)见ff16{intb=0;staticintc=3;b=b+1;c=c+1;return(a+b+c);}main(){inta=2,i;for(i=0;i<3;i++)printf(“%d”,f(a));}47main()见ff17{inti;for(i=0;i<5;i++)test();}test(){inta=0;staticints=0;
printf("a=%d,s=%d\n",a,s);++a;++s;}a=0,s=0a=0,s=1a=0,s=2a=0,s=348用static定义静态全局变量例如:若在源文件的开头有
staticinta;
则该变量就只能被本文件中使用。若static缺省,则使用范围扩大到组成程序的所有C源文件。全局变量的存储方式49
关键字
extern的作用(p39)文件file1.c文件file2.c
inta;main(){…d=power(m);……}
externinta;
power(n)
intn;{………}50全局变量的说明1、staticinta;
inta;
均都是存放在静态存储区中。2、如果外部变量仅仅被本函数使用,则:
staticinta;51例题/*TEST1.C*/staticinta;/*a只允许文件TEST1.C中函数访问*/f1(){a=2;
printf("函数f1中的
a是%d\n",a);}/*TEST2.C*/
inta;/*a还允许其它文件中函数访问的全局变量*/f2(){a=4;
printf("函数
f2中的a是%d\n",a);}/*TEST3.C*/externf1(),f2();/*函数f1和f2定义在其它文件中*/externinta;/*a是定义在其它文件中的全局变量,是
TEST2.C中的变量a*/52main(){f1();f2();printf("函数main中的a是%d\n",a);}
该程序执行时显示:函数f1中的a是2
函数
f2中的a是4
53第八节
内部函数和外部函数
1.内部函数只能够被函数定义所在的文件当中的函s数调用的函数。static类型表示符函数名(形参列表)staticintfun(a,b)2.外部函数能被函数定义所在的文件以及其它文件中的函数调用的函数。externintfun(a,b)54多个源文件的处理编译DOS下的处理tcc
文件名1文件名2。。。。文件名n完成了编译连接功能生成可执行文件*.exe55集成环境下1创建PRJ文件
tc
文件名.prj2选择包含需要编译连接的文件名的.prj文件名Alt+P3编译连接运行Alt+R56例题/*TEST1.C*/staticf1(){printf("TEST1.C的函数f1\n");}f2(){printf("TEST1.C的函数f2\n");}57/*TEST2.C*/f1(){printf("TEST2.C的函数f1\n");}staticf2(){printf("TEST2.C的函数f2\n");}/*TEST3.C*/externf1(),f2();main(){f1();f2();}TEST2.C的函数f1TEST1.C的函数f258一.函数变量的归纳1.变量属性定义:数据类型和存储类型。如下表:
变量属性表存储类型数据类型变量名称 含义
static
int a a为静态内部变量或静态外部变量auto charb b为自动变量,在函数内定义 registerfloat c c为寄存器变量,在函数内定义externdouble d d是一个已被定义的外部变量 592.变量的作用域、作用时间和在内存的存储区。 变量类别 作用域 作用时间内存存区自动变量局部变量(离开函数,值消失)动态存储动态存储区 形式参数局部变量(离开函数,值消失)动态存储动态存储区
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【盲校高中物理】实验:探究速度变化知识清单
- 2025-2026学年语文写字课教学设计
- 八年级地理下册 第六章 北方地区6.2 白山黑水-东北三省第2课时教学设计 (新版)新人教版
- 高中化学 第一章 第三节 有机化合物的命名教学设计 新人教版选修5
- 第27课 复杂多变的天气教学设计小学地方、校本课程浙教版人·自然·社会
- 2026年内科护理中级职称主管护师基础知识考试历年真题及答案
- 2025年养老护理员练习题库含答案
- 2025学年浙江金华市金东区第一学期八年级期末检测地理历史道德与法治试卷卷-初中道德与法治
- 隧道防排水施工方案范本
- 肺炎护理查房(含护理流程)
- 中国中化2026届人才测评题库
- 2025-2026学年赣美版(新教材)小学美术三年级下册《神气磊落》教学设计
- 2026年职业技能鉴定考试(烟草物流师五级)练习题及答案
- 项目负责人考核制度
- 《2025中国临床肿瘤学会黑色素瘤诊疗指南》
- 钢铁行业新员工安全培训
- 门诊病人猝死应急培训
- 2026年icu考试试题及答案
- 精神科护理管理制度与应急救援预案
- 健身房消防预案和应急预案
- GB/T 5759-2025塑料离子交换树脂离心法测定氢氧型阴离子交换树脂的含水量
评论
0/150
提交评论