函数要点说明省公开课一等奖全国示范课微课金奖_第1页
函数要点说明省公开课一等奖全国示范课微课金奖_第2页
函数要点说明省公开课一等奖全国示范课微课金奖_第3页
函数要点说明省公开课一等奖全国示范课微课金奖_第4页
函数要点说明省公开课一等奖全国示范课微课金奖_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

2024/5/517.2.1函数定义函数定义普通形式函数类型函数名(类型名形式参数1,…

){说明语句

执行语句}比如:求两个数最大值。

int

max(intx,inty){intz;z=x>y?x:y;return(z);}类型省略时默认为int类型没有形式参数为无参函数

第1页2024/5/52函数名(实参表列)在C语言中,把函数调用也作为一个表示式。所以凡是表示式能够出现地方都能够出现函数调用。比如:①welcome();

②if(fabs(a)>max)max=fabs(a);

③m=max(c,max(a,b));7.2.2函数调用函数调用普通形式:第2页2024/5/53voidswap(intx,inty){intz;z=x;x=y;y=z; printf("\nx=%d,y=%d",x,y);}main(){inta=10,b=20;swap(a,b);printf("\na=%d,b=%d\n",a,b);}7.2.3函数参数与函数返回值1.函数形式参数与实际参数程序输出结果:x=20,y=10a=10,b=20形式参数(形参)实际参数(实参)【例7.3】编一程序,将主函数中两个变量值传递给swap函数中两个形参,交换两个形参值。单向值传递第3页2024/5/54相关形参和实参说明:

①当函数被调用时才给形参分配内存单元。调用结束,所占内存被释放。②实参能够是常量、变量或表示式,但要求它们有确定值。③实参加形参类型要一致,字符型与整型能够兼容④实参加形参个数必须相等。在函数调用时,实参值赋给与之相对应形参。“单向值传递”。注意:在TC中,实参求值次序是从右到左。

第4页2024/5/55函数返回值是经过return语句带回到主调函数功效:终止函数运行,返回主调函数,若有返回值,将返回值带回主调函数。说明:①若函数没有返回值,return语句能够省略。②return语句中表示式类型普通应和函数类型一致,假如不一致,系统自动将表示式类型转换为函数类型。函数返回值return语句格式:return(表示式);

或return表示式;或return;第5页2024/5/56【例7.6】计算并输出圆面积。s(intr){return3.14*r*r;}main(){intr,area;scanf("%d",&r);printf("%d\n",s(r));}自动转换为int型思索:若要得到单精度实型圆面积,程序应怎样修改程序运行情况以下:2

12?第6页2024/5/57

7.2.4对被调函数申明和函数原型变量要先定义后使用,函数也如此。即被调函数定义要出现在主调函数定义之前。如swap函数:允许整型函数(且参数也是整型)定义出现在主调函数之后。如max函数:假如非整型函数在主调函数之后定义,则应在主调函数中或主调函数之前对被调函数进行申明。voidswap(intx,inty){…}main(){…swap(a,b);}main(){…c=max(a,b);}max(intx,inty){…}第7页2024/5/58对被调函数进行申明普通形式

函数类型函数名(参数类型1

参数名1,…);或函数类型函数名(参数类型1,参数类型2,…);思索:以下哪种情况需要在主调函数中对被调函数申明被调函数定义在前,主调函数定义在后。主调函数定义在前,被调函数定义在后,且被调函数类型不是整型。被调函数定义在后,但被调函数类型是整型。第二种形式省略了参数名,此种形式也称为函数原型。?第8页2024/5/597.3数组作函数参数7.3.1一维数组元素作函数参数main(){inta[5],i,m;for(i=0;i<5;i++)scanf("%d",&a[i]);m=a[0];for(i=1;i<5;i++)m=min(m,a[i]);printf("%d\n",m);}【例7.8】求5个数中最小值。intmin(intx,inty){return(x<y?x:y);}用打擂台方法求最小值。m相当于擂主第9页2024/5/5107.3.2一维数组名作函数参数数组名表示数组在内存中起始地址。比如:数组a在内存中从地址开始存放,则a值为。是地址值,是指针类型数据(第8中将介绍指针类型),不能把它看成是整型或其它类型数据。实参是数组名,形参也应定义为数组形式,形参数组长度能够省略,但[]不能省,不然就不是数组形式了。

【例7.9】用冒泡法将10个整数排序。第10页2024/5/511voidsort(intb[],intn);voidprintarr(intb[]);main(){inta[10]={11,22,63,97,58,80,45,32,73,36};printf("Beforesort:\n");

printarr(a);

sort(a,10);

printf("Aftersort:\n");

printarr(a);}voidprintarr(intb[10]){inti;for(i=0;i<10;i++)printf("%5d",b[i]);printf("\n");}voidsort(intb[],intn){inti,j,t;for(i=1;i<n;i++)for(j=0;j<n-i;j++)if(b[j]>b[j+1]){t=b[j];b[j]=b[j+1];b[j+1]=t;}}第11页2024/5/512

a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]

b[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]b[8]b[9]11226397588045327336(a)排序前a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]b[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]b[8]b[9]11223236455863738097(b)排序后图7.3调用sort函数b形参b实际是一个能够存放地址变量a:实参赋给形参首地址:

首地址:

第12页2024/5/513函数B{

……

……

……}函数A{……

调用函数B;

……}main函数{

……

调用函数A;

……}7.4函数嵌套调用和递归调用7.4.1函数嵌套调用第13页2024/5/514【例7.11】函数嵌套调用main(){intn=3;printf("%d\n",sub1(n));}sub1(intn){inti,a=0;for(i=n;i>0;i--)a+=sub2(i);returna;}sub2(intn){returnn+1;}程序输出结果:9第14页2024/5/5157.4.2函数递归调用1.递归基本概念递归调用:一个函数直接或间接地调用了它本身,就称为函数递归调用。递归函数:在函数体内调用该函数本身。intsub(intx){inty,z;……if(……)z=sub(y);else{……}return;}比如:直接调用sub函数本身第15页2024/5/5162.递归函数执行过程【例7.12】编一递归函数求n!。思绪:以求4阶乘为例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。递归结束条件:当n=1或n=0时,n!=1。递归公式:n!=1(n=0,1)n×(n-1)!(n>1)第16页2024/5/517程序以下:floatfact(intn){floatf=0;if(n<0)printf("n<0,error!");elseif(n==0||n==1)f=1;elsef=fact(n-1)*n;return(f);}main(){intn;floaty;printf("\nInputn:");scanf("%d",&n);y=fact(n);printf("%d!=%-10.0f\n",n,y);}运行情况以下:Inputaintegernumber:4

4!=24第17页2024/5/518递归调用过程

回推main()fact(4)fact(3)fact(2)fact(1){{{{{……………

y=fact(4);f=4*fact(3);f=3*fact(2);f=2*fact(1);f=1;

……………return24return6return2return1}}}}}

递推

第18页2024/5/5197.5局部变量和全局变量及其作用域7.5.1变量作用域7.5.2局部变量及其作用域变量作用域:变量在程序中能够被使用范围。依据变量作用域能够将变量分为局部变量和全局变量。局部变量(内部变量):在函数内或复合语句内定义变量以及形参。作用域:函数内或复合语句内。【例7.15】分析下面程序运行结果及变量作用域。问题:一个变量在程序哪个函数中都能使用吗?第19页2024/5/520voidsub(inta,intb){intc;a=a+b;b=b+a;c=b-a;printf("sub:\ta=%db=%dc=%d\n",a,b,c);}局部变量main(){inta=1,b=1,c=1; printf("main:\ta=%db=%dc=%d\n",a,b,c);sub(a,b);printf("main:\ta=%db=%dc=%d\n",a,b,c);

{inta=2,b=2;printf("comp:\ta=%db=%dc=%d\n",a,b,c);}printf("main:\ta=%db=%dc=%d\n",a,b,c);}局部变量局部变量“分程序”或“程序块”程序输出结果:main: a=1b=1c=1sub: a=2b=3c=1main:a=1b=1c=1comp:a=2b=2c=1main: a=1b=1c=1第20页2024/5/5217.5.3全局变量及其作用域全局变量(外部变量):在函数外部定义变量。作用域:从定义变量位置开始到根源文件结束。如在其作用域内函数或分程序中定义了同名局部变量,则在局部变量作用域内,同名全局变量暂时不起作用。【例7.16】全局变量和局部变量作用域。第21页2024/5/522inta=5; voidf(intx,inty) {intb,c; b=a+x;c=a-y;printf("%d\t%d\t%d\n",a,b,c);}局部变量main(){intb=6,c=7; f(b,c);printf("%d\t%d\t%d\n",a,b,c);

{inta=9,b=8; printf("%d\t%d\t%d\n",a,b,c);

{

c=10; printf("%d\t%d\t%d\n",a,b,c);

}printf("%d\t%d\t%d\n",a,b,c);

}printf("%d\t%d\t%d\n",a,b,c);}局部变量局部变量程序输出结果:511-2567987981098105610全局变量第22页2024/5/5237.6变量存放类别及变量生存期7.6.1变量生存期与变量存放分类变量生存期:变量在内存中占据存放空间时间。思索:1.何时为变量分配内存单元?

2.将变量分配在内存什么区域?3.变量占据内存时间(生存期)?程序代码区静态存放区动态存放区存放分配动态存放变量静态存放变量第23页2024/5/5247.6.2变量存放类别变量属性数据类型:决定为变量分配内存单元长度,数据存放形式,数范围。存放类别:决定了变量生存期,给它分配在哪个存放区。第24页2024/5/525变量定义语句普通形式存放类别数据类型变量名1,…,变量名n;auto(自动)

register(存放器)static(静态)

extern(外部)1.自动变量(auto类别)局部变量能够定义为自动变量。main()

{intx,y;…}main()

{autointx,y;…}自动变量等价可省第25页2024/5/5262.静态变量(static类别)除形参外,局部变量和全局变量都能够定义为静态变量。局部静态变量(或称内部静态变量)全局静态变量(或称外部静态变量)静态变量静态变量staticinta;main(){f

温馨提示

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

评论

0/150

提交评论