第八章函数公开课一等奖优质课大赛微课获奖课件_第1页
第八章函数公开课一等奖优质课大赛微课获奖课件_第2页
第八章函数公开课一等奖优质课大赛微课获奖课件_第3页
第八章函数公开课一等奖优质课大赛微课获奖课件_第4页
第八章函数公开课一等奖优质课大赛微课获奖课件_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

8.1

概述8.2函数定义普通形式8.3函数参数和函数值8.4

函数调用8.5数组作为函数参数8.6局部变量和全局变量8.7

变量存储类别8.8内部函数和外部函数8.9如何运营一个多文献程序第八章函数第1页第1页8.1概述(1)一个源程序文献是由一个或多个函数构成。一个源程序文献是一个编译单位。(2)一个C程序文献由一个或多个源程序文献构成。(3)C程序执行从main函数开始,调用其它函数后回到main函数,并在main函数中结束整个程序运营。(4)所有函数都是平行,在定义函数时是互相独立,函数不能嵌套定义;函数间能够互相调用,但不能调用main函数。(5)从用户使用角度看,函数分为原则函数和用户自定义函数两种。(6)从函数形式看,函数分为无参函数和有参函数两种。如:第2页第2页#include<stdio.h>printstar(){ printf("******************\n");}print_message(){ printf("Howdoyoudo!\n");}main(){ printstar(); print_message(); printstar();}第3页第3页8.2函数定义普通形式1.无参函数定义

类型标识符函数名(){申明部分语句}2.有参函数定义

类型标识符函数名(形式参数列表){申明部分语句}3.“空函数”定义

类型标识符函数名(){}注意:假如在定义函数时不指定函数参数,系统会隐含指定函数类型为int型。第4页第4页#include<stdio.h>intmax(intx,inty)//或采用老式方式intmax(x,y){//intx,y; intz;//{intz;…. z=(x>y)?x:y; returnz;}main(){ intc,a,b; scanf("%d,%d",&a,&b); c=max(a,b); printf("%d",c); return1;}第5页第5页8.3函数参数和函数值1.形式参数和实际参数实际参数:主调函数中提供数据。能够是常量、变量、表示式等,是详细数值。形式参数:被调函数中用以接受主调函数数据变量。(1)在定义函数中指定形参,在未出现函数调用时,不占内存中存放单元。在调用结束后,形参所占内存单元也被释放。(2)实参能够是常数、变量或表示式,但要求有确定值。调用时将实参值赋给形参(形参是数组名除外)。(3)在被定义函数中,必须指定形参类型。(4)实参加形参类型应相同或赋值兼容。若类型不同,则进行类型转换,将实参类型转换为形参类型。(5)实参变量对形参变量数据传递是单向值传递。2a2x3b3y2a10x3b15y第6页第6页2.函数返回值(1)函数返回值是通过函数中return语句取得。return(表示式);或return表示式;(2)函数值类型是在函数定义时指定。C语言要求,凡不加类型阐明函数,一律按整型处理。(3)假如函数值类型与return语句中表示式值类型不一致,则以函数类型为准,并自动进行类型转换。(如:见例子)(4)假如被调用函数中没有return语句,函数带回是一个不拟定值。(5)为了明确表示“不带回值”,能够用“void”定义“无类型。第7页第7页#include<stdio.h>intmax(floatx,floaty){ return((x>y)?x:y);}main(){ intc;floata,b; scanf("%f,%f",&a,&b); c=max(a,b); printf("%d",c); return1;}第8页第8页8.3函数调用主调函数:主动去调用其它函数被调函数:被其它函数所调用1.函数调用普通形式函数名(实参列表);含多个实参,则各参数用逗号分开,实参加形参个数应相等(不等则犯错),类型应一致(不一致则转换),实参求值次序是不确定,有从左至右,有从右至左(如TC,MSC)。按函数在程序中出现位置不同,函数调用可分为:函数语句:printstar();带返回值函数语句:p=f(i,i++);//注意求解次序问题函数表示式:c=2*max(a,b);函数参数:m=max(a,max(b,c));第9页第9页2.对被调函数申明和函数原型在一个函数中调用另一个函数需要具备:(1)被调函数必须是已经存在函数(库函数或自定义函数)。(2)假如被调函数是库函数,普通应当在文献开头用#include命令将相关头文献包括到本文献中来(见附录V)。如:#include<stdio.h>(3)假如被调函数是自定义函数,且与主调函数在同一个文献中,普通应当在主调函数中在调用之前对被调函数作申明。格式:

函数类型函数名(参数类型1,参数类型2,····);函数类型函数名(参数类型1参数名1,参数类型2参数名2,····);(4)函数调用时函数名、实参个数应与函数定义一致,实参类型必须与函数定义中形参类型赋值兼容。第10页第10页#include<stdio.h>main(){ floatadd(floatx,floaty);floata,b,c; scanf("%f,%f",&a,&b); c=add(a,b); printf("sumis%f",c); return1;}floatadd(floatx,floaty){ floatz; z=x+y; return(z);}第11页第11页函数申明语句中。(1)函数类型函数名(参数类型1,参数类型2,····)(2)函数类型函数名(参数类型1参数名1,参数类型2参数名2,····)称为函数原型:编译系统不检查参数名,因此参数名是什么都无所谓。但应确保函数原型与函数首部写法一致,即函数类型、函数名、参数个数、参数类型和参多顺序必须相同。阐明:

以前C版本只申明函数名和函数类型,不包括参数类型和参数个数。假如函数调用之前,没有对函数作申明,则编译系统会把第一次碰到该函数形式作为函数申明,并将函数类型默认为int型,即假如函数类型为整型或字符型,能够在函数调用之前不必作函数申明(但不对参数类型和个数进行检查)。假如函数定义在主调函数之前,则能够不必申明。也能够在所有函数之前,在函数外部进行函数申明。如:第12页第12页

charletter(char,char);floatf(float,float);intI(float,float);main(){······}charletter(charc1,charc2);{······}floatf(floatx,floaty);{······}intI(floatj,floatk);{······}第13页第13页8.4函数嵌套调用C语言不允许嵌套定义函数,但能够嵌套调用函数,即,在调用一个函数过程中,又调用另一个函数。函数嵌套调用图示maina函数b函数调用a函数调用b函数123456789结束第14页第14页8.5函数递归调用递归:在函数调用过程中,直接或间接调用本身。

1.直接递归:在函数体内又调用本身如:intf(intx){inty,z;z=f(y);return(2*z);}2.间接递归:当函数去调用另一函数时,而另一函数反过来又调用本身。f1()┇调用f1()┇f1()函数f2()函数

调用f2()函数调用f1()函数第15页第15页能够看到,这两种递归调用都是无终止本身调用,处理无终止递归调用办法是:拟定好结束递归条件。条件成立,进行递归用if语句控制条件不成立:结束递归第16页第16页例有5个人在一起问年龄,第5个人比第4个人大2岁,第4个人比第3个人大2岁...第2个人比第1个人大2岁,第1个人为10岁。age(5)age(4)age(3)age(2)age(1)=2+age(4)=2+age(3)=2+age(2)=2+age(1)=10=18=16=14=1210n=1用式子表示:age(n)=age(n-1)+2n>1第17页第17页

问年龄递归程序下列:age(intn){intc;if(n==1)c=10;elsec=2+age(n-1);return(c);}main(){printf(“%d\n”,age(5));}第18页第18页用递归法求n!floatfac(intn){floatf;if(n<0)printf(“n<0dataerror!\n”);elseif(n==0||n==1)f=1;elsef=n*fac(n-1);return(f);}main(){intn;floaty;printf(“inputaintegernumber:”);scanf(“%d”,&n);y=fac(n);printf(“%d!=%15.0f\n”,n,y);}1(n=0,1)用式子表示:n!=n.(n-1)!(n>1)第19页第19页

8.6数组作为函数参数1、数组元素做函数参数数组元素作实参时,与变量作实参同样,也是单向传送。2、数组作为函数参数数组名作实参时,实参和形参都用数组名,传送是数组地址(地址常量)。调用函数时,对形参数组元素操作,事实上也是对实参数组元素操作。

几点阐明:①数组名作形、实参数时,应分别在主、被调函数中对其申明为数组;②形、实参数数组类型要完全一致(int,char也不能通用);③形参数组能够不指定大小,需要时能够用一实参将数组长度传递给形参;数组名作参数时,传递是地址值,对形参数组操作事实上也是对实参数组操作。

第20页第20页3、多维数组名作为函数参数多维数组名作实参和形参时,形参数组能够指定每一维大小,也能够省略第一维大小,二者等价。8.7局部变量和全局变量1、局部变量局部变量:作用域仅限在所定义函数或复合语句内部。说明:(1)在不同函数(包含main函数)中允许同名,它们占据不同内存单元,相互之间互不影响。(2)形参属局部变量,只能在其所在函数内部使用。(3)能够在复合语句中定义变量,这些变量只在本复合语句中有效且能够与整个函数变量同名。第21页第21页

2、全局变量全局变量:在一个文献所有函数以外定义变量称为外部或全局变量。作用域:从定义变量位置开始到源程序结束。

阐明:①在源程序开始定义全局变量,对源程序中所有函数有效②在源程序中间定义全局变量,仅对其后面所有函数有效③在函数或复合语句中定义局部变量假如与全局变量同名,则局部变量优先,全局变量不起作用.④全局变量使用,增长了函数间数据联系渠道,同一文献中所有函数都能引用全局变量值,当某函数改变了全局变量值时,便会影响其它函数。第22页第22页#include<stdio.h>inta=3,b=5;/*全局变量作用域及其使用情况*/max(inta,intb){ intc; c=a>b?a:b; return(c);}voidmain(){ inta=8; printf("%d",max(a,b));}第23页第23页

8.8变量存储类别1、动态存储方式与静态存储方式在C中,每一个变量和函数有两个属性:数据类型和数据存储类别。依据变量存储类别,能够知道变量作用域和生存期。从变量值作用域可分为全局变量和局部变量从变量值存在时间即生存期来看,又可分为:(1)静态存储方式:即程序运营期间为其分派存储单元是固定。(2)动态存储方式:程序运营期间依据需要为其动态分派存储单元。

程序运营时,在内存中存储情况下列:

第24页第24页代码段数据段程序区静态存储区动态存储区编译、连接后生成指令代码。外部、局部静态(static):程序运营开始到结束始终占用形参、自动变量、函数调用时现场保护和返回值等。函数调用时分派存储单元,调用结束时释放用户区第25页第25页

2、auto变量函数内部无static申明局部变量、函数中形参均为自动变量。当变量存储类别为自动时,申明符auto可省;自动变量被分派在动态区,未赋初值时,其值未定义,每次调用重新赋值。比如:intf(inta){autointb,c=3;···3、用static申明局部变量若希望函数调用结束后,其值不消失,下次调用函数时继续使用,则用static对变量加以申明为“静态局部变量”。如:第26页第26页例考察静态局部变量值f(inta){auto[int]b=0;static[int]c=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));}main()iaf(a)02f(2)12f(2)22f(2)f(a)abcreturn(a+b+c)20314return(7)20415return(8)20516return(9)运营结果:789第27页第27页静态局部变量阐明:(1)分派在静态区,程序运营结束释放存储单元。(2)仅开始时赋初值一次(未赋初值时为0),以后每次调用函数时,变量不再赋值,前次操作结果被保留。(3)局部动态变量若未赋初值,其值是不拟定,所分派存储单元是不固定;而局部静态变量未赋初值,其值为0(字符型变量值为‘\0’),所分派存储单元是固定。(4)静态局部变量在函数调用结束后虽存在,但其它函数不能引用它。第28页第28页使用局部静态变量有下列几种情况(1)需要保留上一次调用结束时值例打印1~5阶乘值intfac(n)intn;{staticintf=1;f=f*n;return(f);}main(){inti;for(i=1;i<=5;i++)printf(“%d!=%d\n”,i,fac(i));}(2)初始化后变量只被引用而不改变其值,则用静态局部变量较以便,缺点:从程序运营开始到结束始终占用内存,这样会浪费系统资源。第29页第29页

4、register变量CPU内部有存储器组可用来存储数据,若把数据申明为存储器类型,则将该类型数据存储在存储器中,其长处在于:减少数据与内存之间互换频率,提升程序效率和速度。intfac(intn){registerinti,f=1;for(i=1;i<=n;i++)f=f*i;return(f);}main(){inti;for(i=1;i<=5;i++)printf(“%d!=%d\n”,i,fac(i));}第30页第30页存放器类型变量几点说明:1.只有局部自动类型和形参可定义为存放器类型,其它(如全局变量、静态变量)不行。2.使用存放器类别变量个数与系统相关,Turboc中,register变量作auto变量处理。当今优化编译系统会自动将使用频繁变量放在存放器中,不需要程序设计者指定。3.auto,static,register,全局变量分别属于不同存放区,因而不能重合使用。4.存放器类型变量不允许对其地址操作。第31页第31页

5、用extern申明外部变量外部变量也称全局变量,在函数外部定义,其作用域是从变量定义处开始,到本程序文献未尾。用extern对全局变量进行申明,能够扩展全局变量作用域。全局变量分派在静态存储区。(1)在一个文献内部申明外部变量例—用extern申明外部变量,扩展程序文献中作用域intmax(intx,inty){intz;z=x>y?x:y;return(z);}main(){externA,B;/*类型名可写也可省略*/printf(“%d”,max(A,B));}intA=13,B=-8;第32页第32页

(2)在多文献程序中申明外部变量当一个程序由多个文献构成时,要在一个文献中引用另一文献中定义外部变量时,此时要用extern加以申明;若在两个文献中都要使用同一个外部变量,若同时对同名外部变量申明,则系统将提醒“重定义类型错”,处理办法是:在任一文献中定义外部变量,在另一文献用extern对该变量作“外部变量申明”。比如,file1.c为:intAmain(){}文献file2.c为:externA;power(intn);{}第33页第33页

6、用static申明外部变量

若使全局变量只限于定义它文献中函数引用,而不让其它文献中函数引用,需要用static加以阐明,称为静态全局变量。(注意:此种说法只在工程办法中有效,而在文献包括中则不起作用)第34页第34页

7、关于变量申明和定义申明部分:对相关标识符(变量,函数,结构体)属性进行阐明。对于函数,申明和定义区别明显,申明是函数原型,定义是函数本身,是一个独立程序模块;对于变量,有两种情况:1.定义性申明:需建立存储空间,如inta;也称定义。2.引用性申明:不建立存储空间,如externA广义地讲,申明包括定义,但并非所有申明都是定义;如:intA;既包括申明又包括定义;externA;只是申明,而无定义。商定:建立存储空间申明称定义;不建立存储空间申明称申明。auto,register,static申明变量时,是在定义变量基础上加上这些关键字,不能单独使用。第35页第35页8、存储类别小结在C中,定义数据需指出数据类型和存储类别。(1)作用域:变量在某个文献或函数范围内是有效,则称该文献或函数是该变量作用域。

自动(动态局部)变量:离开函数,值消失静态局部变量:离开函数,值仍保留存储器变量:离开函数,值消失形式参数:可定义为自动或存储器变量局部变量静态外部变量:只限本文献引用外部(非静态)变量:允许其它文献引用全局变量第36页第36页

(2)生存期:变量在某一时刻是存在,认为这一时刻属于该变量生存期:

自动变量(本函数内有效)存储器变量(本函数内有效)形式参数动态存储静态局部变量(函数内有效)静态外部变量(本文献内有效)外部变量(其它文献可引用)静态存储第37页第37页(3)从变量存在位置来分:静态局部变量静态外部变量(函数外部静态变量)外部变量(可为其它文献引用)内存中静态存储区内存中动态存储区自动变量和形式参数CPU中存储器存储器变量第38页第38页

8.9内部函数和外部函数函数能否被其它源文献中函数调用,看其是内部还是外部函数1、内部函数只能被本文献中其它函数所调用

形式:static类型标识符函数名(形参表列)若是内部函数,其作用域仅限于定义它所在文献。此时在其它文献中能够有相同函数名,它们互相之间互不干扰。2、外部函数能被其它文献中函数所调用。形式:extern类型标识符函数名(形参表列)注意:extern可省,隐含时,系统默认其为外部函数。第39页第39页

8.10如何运营一个多文献程序

1.用turboC集成环境(1)工程办法①建立工程文献名.prj,其中包括一个程序各文献名,②在工程菜单项中设置工程文献名③运营工程文献,按F9(2)文献包括办法①在主函数头部将本程序各文献用#include“文献名.c”,编译时,系统自动将“文献名.c”放到main函数前头,作为一个整体编译。这时,这些函数被认为是在同一个文献中,函数中extern申明能够不要。②运营该程序2.在MSC上①分别对4个文献进行编译,得到4个.obj文献②linkfile1+file2+file3+file4得可执行文献file1.exe第40页第40页下列程序输出结果是:_

。main(){intx=0;sub(&x,8,1);printf("%d\n",x);}sub(int*a,intn,intk){if(k<=n)sub(a,n/2,2*k);*a+=k;}第41页第41页#include<stdio.h>

inti=10;

intmain()

{

inti=1;

printf("%d\t,i);

{

inti=2;

pritnf("%d\t",i);

{

externi;

i+=1;

printf("%d\t",i);

}

printf("%d\t",++i);

}

printf("%d\n",++i);

return0;

}

运营结果为

1

2

11

3

2

第42页第42页例、写出下面程序执行结果。intk=3;

main()

{intk=7;

printf("k=%d\n",k);

{intk=11;

printf("k=%d\n",k);

{k+=1;

printf("k=%d\n",k);

}

printf("k=%d\n",k);

}

printf("k=%d\n",k);

}k=7

k=11

k=12

k=12

k=7第43页第43页例、写出下列程序执行结果。#include"stdio.h"

inti=3;

main()

{inti,j;

i=f1();

for(j=3;j<6;++j)

{printf("i=%d,j=%d\n",i,j);

printf("f2(%d)=%d\n",i,f2(i));

printf("f3(%d)=%d\n",i,f3(i));

printf("f4(%d)=%d\n",i+j,f4(i+j));

}

getch();

}intf1()

{returni;}intf2(intj)

{returnj=++i;}intf3(intj)

{staticinti=9;

returnj=i--;

}intf4(inti)

{intj=10;

returni=j+=i;

}i=3,j=3

f2(3)=4

f3(3)=9

f4(6)=16i=3,j=4

f2(3)=5

f3(3)=8

f4(7)=17i=3,j=5

f2(3)=6

f3(3)=7

f4(8)=18第44页第44页

下列程序运营后,输出结果是_____func(inta,intb){staticintm=0,i=2;i+=m+1;m=i+a+b;return(m);}main(){intk=4,m=1,p;p=func(k,m);printf(“%d,”,p);p=func(k,m);printf(“%d\n”,p);}第45页第45页编写函数fun,该函数功效是:从字符中删除指定字符,同一字母大、小写按不同字符处理。voidfun(chars[],intc){inti=0;char*p;p=s;while(*p){if(*p!=c){s[i]=*p;i++;}p++;}s[i]='\0';}第46页第46页请编写一个函数fun,它功效是:输出一个字符串长度。(不得调用C语言提供求字符串长度函数)。

intfun(char*s){inti=0;while(*s++)i++;returni;}第47页第47页请编写函数fun,其功效是:将s所指字符串中除了下标为偶数、同时ASCII值也为偶数字符外,其余全都删除;串中剩余字符所形成一个新串放在t所指一个数组中。voidfun(char*s,chart[]){inti,j,n;n=strlen(s);for(i=0;i<n;i++)if(i%2==0&s[i]%2==0){t[j]=s[j];j++;}t[j]='\0';}第48页第48页请编写一个函数fun,它功效是:将ss所指字符串中所有下标为奇数位置上字母转换为大写(若该位置上不是字母则不转换)。voidfun(char*ss){inti,n;n=strlen(ss);for(i=1;i<n;i+=2;)if(ss[i]>='a'&&ss[i]<='z')ss[i]=ss[i]-32;}第49页第49页一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?#include"math.h"

main()

{

longinti,x,y,z;

for(i=1;i<100000;i++)

{x=sqrt(i+100);

/*x为加上100后开方后结果*/

y=sqrt(i+268);

/*y为再加上168后开方后结果*/

if(x*x==i+100&&y*y==i+268)/*假如一个数平方根平方等于该数,这阐明此数是完全平方数*/

printf("\n%ld\n",i);

}

}第50页第50页一个数假如正好等于它因子之和,这个数就称为“完数”。比如6=

温馨提示

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

评论

0/150

提交评论