c8-函数省公开课一等奖全国示范课微课金奖课件_第1页
c8-函数省公开课一等奖全国示范课微课金奖课件_第2页
c8-函数省公开课一等奖全国示范课微课金奖课件_第3页
c8-函数省公开课一等奖全国示范课微课金奖课件_第4页
c8-函数省公开课一等奖全国示范课微课金奖课件_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

第七章函数武汉理工大学计算机学院8/18/20241第1页第七章函数7.1函数概念7.2函数定义7.3函数调用和函数返回值7.4函数应用实例7.5嵌套调用和递归调用7.6变量作用域和存放类别7.7内部函数和外部函数(*)7.8编译预处理8/18/20242第2页7.1

念#include"stdio.h"voidstars(intn);voidprint_message();main(){stars(20);print_message();stars(20);}voidstars(intn){inti;for(i=1;i<=n;i++)putchar('*');putchar('\n');}voidprint_message(){printf("Howdoyoudo!\n");}函数stars()、print_message()申明/*main函数定义*/stars()、print_message()函数调用定义stars()函数定义print_message()函数程序运行后输出结果为:8/18/20243第3页C程序结构8/18/20244第4页说明:C是函数式语言一个C程序有且只能有一个名为main主函数。全部函数都是相互独立,除main函数不能调用外,其它函数能够相互调用。函数库函数(标准函数)自定义函数有参函数无参函数或8/18/20245第5页7.2函数定义[类型说明符]函数名([形参说明表]){ [说明部分][语句部分]}说明函数返回值数据类型;若缺省,则为int类型;若函数无值,则定义为void类型。由用户自己命名,正当标识符说明参数个数和类型说明函数中用到除形参以外其它变量等为了完成函数特定功效而设计一个或多个语句

空函数:Function(){}8/18/20246第6页函数定义实例打印一行n个‘*’

voidstars(intn){inti;for(i=1;i<=n;i++)putchar('*');putchar('\n');}求整数xn次幂(n>0)longpower(intx,intn){inti;longmul=1;for(i=1;i<=n;i++)mul=mul*x;return(mul);}传统定义格调8/18/20247第7页传统函数定义形式longpower(x,n)intx,n;{inti;longmul=1;for(i=1;i<=n;i++)mul=mul*x;return(mul);}8/18/20248第8页7.3函数调用和函数返回值7.3.1函数参数7.3.2函数返回值7.3.3函数申明7.3.4函数调用8/18/20249第9页7.3.1函数参数形式参数:函数定义时所使用参数称为形式参数。形参能够是:变量或数组名。实际参数:函数调用时所使用参数称为实际参数。实参能够是:含有确切值常量、变量、表示式或数组名。8/18/202410第10页intmax(intx,inty);voidmain(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);printf("Max=%d.\n",c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}形参只能是变量或数组名intmax(intx,inty)c=max(a,b)实参能够是常量、变量、表示式或数组名,但要求它们有确定值如:c=max(10,(a+b)/2);实参加形参之间:个数一致,类型一致或赋值兼容,次序一致。形参:变量常量变量实参表示式值8/18/202411第11页7.3.2函数返回值返回语句(return语句):格式:return(表示式);或return表示式;或return;功效:将流程及表示式值从被调用函数返回到函数调用处。说明:

intmax(intx,inty){intz;z=(x>y)?x:y;return(z);}若return后面带表示式,首先计算表示式值,表示式值就是所求函数值。returnz;return((x>y)?x:y);8/18/202412第12页说明(续)一个函数体内能够有多个或没有return语句;intmax(intx,inty){intz;if(x>y)return(x);elsereturn(y);}voidoutput(intm){printf(”%d”,m);return;}

若return后面没有表示式,或没有return语句,则可能会返回不定值。output(intm){printf(”%d”,m);return;}/*默认为int类型函数*/void:空类型8/18/202413第13页7.3.3函数申明#include"stdio.h"voidstars(intn);voidprint_message();main(){stars(20);print_message();stars(20);}voidstars(intn){inti;for(i=1;i<=n;i++)putchar('*');putchar('\n');}voidprint_message(){printf("Howdoyoudo!\n");}8/18/202414第14页函数申明普通形式:函数类型函数名(类型名形参1,类型名形参2,……)包含参数和返回值类型函数申明称为函数原型。函数类型函数名(类型名,类型名,……)若有函数:

floatfun(doublea,intb,floatc){……}则可有函数申明:⒈floatfun(doublea,intb,floatc);⒉floatfun(doublex,inty,floatz);⒊floatfun(double,int,float);说明:8/18/202415第15页说明(续):假如函数值是int或char型,能够无须进行申明,系统自动按int型申明。假如被调用函数出现在主调函数之前,能够无须进行申明。#include<stdio.h>main(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);printf("Max=%d\n",c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}8/18/202416第16页说明(续):假如已在全部函数定义之前,在函数外部已作了函数申明,则在各个主调函数中无须对所调用函数再做申明。#include<stdio.h>doublemysqrt(floatx);main(){floata,c;scanf(”%f”,&a);c=mysqrt(a);printf(”sqrt(%f)=%f\n”,a,c);}doublemysqrt(floatx){doubley;y=sqrt(x);return(y);}8/18/202417第17页7.3.4函数调用调用普通形式:函数名(实参1,实参2,……)说明:若调用无参函数,则无实参表列,但括弧不能省略;假如实参表列包含多个实参,则各参数间用逗号隔开;实参加形参个数应相等,类型应一致或赋值相容;实参加形参按次序一一对应传递数据;8/18/202418第18页调用方式函数语句:由函数调用加上分号组成,在主调函数中可作为一个独立语句。如:

stars(20);或printf(”Cprogram”);函数表示式:函数调用作为一个运算对象出现在表示式中,此时要求函数带回一个确定值以参加表示式运算。如:c=mysqrt(a);函数参数:函数调用作为另一个函数实参,其值作为一个实际参数传给被调函数形参进行处理;此时也要求函数带回一个确定值。如:m=max(a,max(b,c));printf("%d",max(a,b));8/18/202419第19页调用过程floatadd();main(){floata,b,c;scanf(”%f,%f”,&a,&b);c=add(a,b);printf(”sumis%f”,c);}floatadd(floata,floatb){return(a+b);}调用,流程从主调函数转移到被调用函数,且实参将值传给对应形参;执行被调用函数;流程从被调用函数返回到主调函数,并返回函数值。abc615a6b15218/18/202420第20页调用过程floatadd();main(){floata,b,c;scanf(”%f,%f”,&a,&b);c=add(10,b+2);printf(”sumis%f”,c);}floatadd(floata,floatb){floatc;c=a+b;a++;b++;return(a+b);}abc615a10b1717c2711182929形参:变量实参:常量变量表示式值108/18/202421第21页7.4函数应用实例例7.1求累加和sum=1+2!+…+10!分析:能够编写一个求阶乘函数fac(n)计算n!实现:longfac(intn);main(){inti;longsum=0;for(i=1;i<=10;i++)sum+=fac(i);printf(”\nsum=%ld”,sum);}longfac(intn){inti;longx=1L;for(i=1;i<=n;i++)x*=i;return(x);}8/18/202422第22页例7.2由键盘输入x、y及z值,计算函数

sin(x)sin(y)sin(z)

func(x,y,z)=————+————+————

sin(x-y)sin(x-z)sin(y-z)sin(y-x)sin(z-x)sin(z-y)分析:能够定义一个函数part(x,y,z)求每加项值另外定义一个度与弧度之间转换函数change(x)主函数中以度为单位输入x、y及z值,并转换为弧度;屡次调用part()函数求出func值输出func值8/18/202423第23页

sin(x)sin(y)sin(z)

func(x,y,z)=————+————+————

sin(x-y)sin(x-z)sin(y-z)sin(y-x)sin(z-x)sin(z-y)#include<math.h>doublechange(floatx);doublepart(floatx,floaty,floatz);main(){floatx,y,z,sum;scanf(”%f%f%f”,&x,&y,&z);x=change(x);y=change(y);z=change(z);sum=part(x,y,z)+part(y,z,x)+part(z,x,y);printf(”\nfunc=%f”,sum);}8/18/202424第24页

sin(x)sin(y)sin(z)

func(x,y,z)=————+————+————

sin(x-y)sin(x-z)sin(y-z)sin(y-x)sin(z-x)sin(z-y)doublechange(floatx){return(x*3.14159/180);}doublepart(floatx,floaty,floatz);{floattmp;tmp=sin(x)/sin(x-y)/sin(x-z);return(tmp);}8/18/202425第25页7.5函数嵌套调用和递归调用7.5.1函数嵌套调用7.5.2函数递归调用8/18/202426第26页7.5.1函数嵌套调用C语言函数定义都是相互平行、独立,即不允许嵌套定义函数;不过,能够嵌套调用函数,即程序在调用一个函数过程中,该被调函数又能够调用其它函数。如:main函数调用a函数a函数调用b函数b函数结束main函数调用a函数a函数调用b函数b函数结束main函数调用a函数a函数调用b函数结束8/18/202427第27页

nm!

例7.1求组合数C=————

mn!*(m-n)!longcmn(intm,intn);longfac(intn);main(){intm,n;longc;printf(”\n输入两整数:”);scanf(”%d%d”,&m,&n);c=cmn(m,n);printf(”\n组合数值=%ld”,c);}longcmn(intm,intn){longx;x=fac(m)/fac(n)/fac(m-n);return(x);}

longfac(intn){longx=1L;while(n>=1)x*=nreturn(x);}8/18/202428第28页调

程main函数调用cmn函数cmn(m,n)调用fac函数fac(m)调用fac函数fac(n)调用fac函数fac(m-n)结束main函数调用cmn函数cmn(m,n)调用fac函数fac(m)调用fac函数fac(n)调用fac函数fac(m-n)结束8/18/202429第29页7.5.2函数递归调用概念:定义一个函数时,在函数体内直接或间接地调用了本身,则称为函数递归调用。intf1(intx){inty,z;……z=f2(y);……return(z);}intf2(intt){intb,c;……c=f1(c);……return(3+c);}intf(intx){inty,z;……z=f(y);……return(z*z);}直接递归间接递归8/18/202430第30页递归两个方面:递归普通形式

递归结束条件如:n!递推形式:n!=1×2×…×n递归形式:longf(intn){longy;if(n==0)y=1;elsey=f(n-1)*n;return(y);}main(){intn;printf("\ninputn(n>0):");scanf("%d",&n);if(n<0)printf("Dataerror!\n");elseprintf("%d!=%ld\n",n,f(n));}运行过程演示8/18/202431第31页main(){……n=5;print(f(5));}longf(5){longy;……y=5*f(4);

}longf(4){longy;……y=4*f(3);

}longf(3){longy;……y=3*f(2);

}longf(3){longy;……y=3*f(2);

}longf(2){longy;……y=2*f(1);

}longf(1){longy;……y=1*f(0);}return(1);return(2);return(6);return(6);return(24);return(120);longf(0){longy;……y=1;}return(1);调用过程8/18/202432第32页7.6变量作用域和存放类别7.6.1变量作用域7.6.2变量存放类别7.6.3小结8/18/202433第33页7.6.1变量作用域变量作用域:是指在程序中不一样位置所定义变量,其变量起作用区域。依据变量起作用范围,变量可分为:局部变量:在函数内部或复合语句中定义变量,也称为内部变量。其作用域仅在所定义函数或复合语句中。全局变量:在全部函数外部定义变量,也称为外部变量。其作用域从定义位置开始到其所在源文件结束。8/18/202434第34页1.局部变量main(){intj,x,c;……{intc;

c=j%2;……}……}intf1(inta){intv1,x;……}intf2(){intv2,x,y;……}jxcca,v1,xv2,x,y8/18/202435第35页例voidf(){inta=1;printf("\n1.a=%d",a);}main(){inta=10,i;f();for(i=1;i<=2;i++){inta=50;a++;printf("\n2.%d:a=%d",i,a);}printf("\n3.a=%d",a);}程序运行结果为:11233321.a=12.1:a=512.2:a=513.a=108/18/202436第36页程序运行结果为:1.a=12.1:a=512.2:a=513.a=10a210511.a=12.1:a=512.2:a=513.a=10a210a350a3508/18/202437第37页2.

量#include<stdio.h>intp=1,q=5;main(){intm,n;……}floatf1(inta){intb,c;……}charc1,c2;charf2(intx,inty){inti,j;.……}p,q作用范围c1,c2作用范围8/18/202438第38页说明全局变量增加了函数间数据联络尽可能少使用全局变量(除非在必要时)intk;voidshow(){printf("\n2.k=%d",k);k=9;}main(){k=2;show();printf("\n1.k=%d",k);}运行结果:2.k=21.k=98/18/202439第39页说明(续)若全局变量与局部变量同名,则在局部变量作用范围内,全局变量不起作用inta=3,b=5;intmax(inta,intb){intc;c=a>b?a:b;return(c);}main(){inta=10;printf("%d",max(a,b));}形参a、b作用域全局变量a、b不起作用局部变量a作用域全局变量a不起作用运行结果为:108/18/202440第40页说明(续)能够用extern作外部变量申明,扩大全局变量作用域voidf1(){externintc;……}externintb;

voidf2(){……}main(){externinta;

……}inta=8,b=-2,c=15;abc注意:externintb=1;

×ac8/18/202441第41页7.6.2变量存放类别存放空间划分程序区静态数据区动态数据区程序区:用于存放程序编译后形成可执行代码(执行时装入)静态存放区:用于存放程序中静态数据,如全局变量等动态存放区:用于存放程序中动态数据,如函数形参、局部变量、函数调用时现场保护和返回地址等静态数据:说明时在静态存放区中分配存放单元并在程序执行过程中一直占用该单元,直到程序结束才释放;动态数据:在函数开始执行时分配动态存放空间,函数结束时释放这些空间。C存放类别有四种:auto、static、register和extern。8/18/202442第42页局部变量存放属性自动(auto)、静态(static)、存放器(register)voidf(intc);main(){registerinti;/*i:局部存放器变量*/for(i=1;i<=3;i++)f(i);}voidf(intc){autointa=0;/*a:局部自动变量,inta=0;*/staticintb;/*b:局部静态变量,staticintb=0;*/a++;b++;printf("%d:a=%d,b=%d\n",c,a,b);}存放在动态存放区存放在静态存放区存放在存放器中,无地址8/18/202443第43页存放器变量说明为了降低从内存中存取变量值时间,C语言允许将局部变量值放在存放器中;用关键字register申明。

intfac(intn){registerinti,f=1;for(i=1;i<=n;i++)f=f*i;return(f);}不能定义太多存放器变量,因为存放器数量有限,太多无效(将自动按自动变量处理)存放器无地址,所以:&i×&f×返回8/18/202444第44页自动变量和静态局部变量区分voidf(intn){inta=0;

staticintb=0;a++;b++;printf("\n%d:a=%d,b=%d",n,a,b);}main(){registerinti;for(i=1;i<=3;i++)f(i);}i1n1a0b0111:a=1,b=1

22233:a=1,b=32:a=1,b=20130134程序结束返回8/18/202445第45页局部静态变量说明函数编译时在静态存放区分配存放单元,函数调用结束后不释放存放单元,即在整个程序运行中不释放存放单元。用static申明该变量为“局部静态变量”若对变量赋初值,对于静态变量,只执行一次,再次调用函数时不再赋初值而保留上次函数调用结束时值;而对于自动变量,每次调用都要重新分配内存单元并赋初值若不对变量赋初值,对于静态变量系统自动赋缺省值;而对于自动变量,只分配存放单元,其值不确定即使静态局部变量在函数调用结束后仍占存放单元,但因为是局部变量,其它函数不能引用它8/18/202446第46页全局变量存放方式全局变量是在函数外部定义,存放在静态存放区,在程序整个运行过程中占用存放单元,生存期为整个程序运行期间8/18/202447第47页intc;voidf(intn){inta=0;a++;c++;printf("\n%d:a=%d,c=%d",n,a,c);}main(){inti;for(i=1;i<=3;i++){f(i);c++;}printf("\nc=%d",c);}c0i1n1a0111:a=1,c=1

2220132:a=1,c=34330153:a=1,c=56c=64程序结束

温馨提示

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

评论

0/150

提交评论