您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C语言-第七章--函数
C语言程序设计2020/5/31第七章函数武汉理工大学计算机学院2020/5/32第七章函数7.1函数的概念7.2函数的定义7.3函数的调用和函数的返回值7.4函数应用实例7.5嵌套调用和递归调用7.6变量的作用域和存储类别7.7内部函数和外部函数(*)7.8编译预处理2020/5/337.1函数的概念#includestdio.hvoidstars(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()函数程序运行后输出结果为:2020/5/34C程序结构源程序文件1预编译命令说明部分执行部分函数1函数n源程序文件i源程序文件nC程序2020/5/35说明:C是函数式语言一个C程序有且只能有一个名为main的主函数。所有的函数都是互相独立的,除main函数不能调用外,其它函数可以互相调用。函数库函数(标准函数)自定义函数有参函数无参函数或2020/5/367.2函数的定义[类型说明符]函数名([形参说明表]){[说明部分][语句部分]}说明函数返回值的数据类型;若缺省,则为int类型;若函数无值,则定义为void类型。由用户自己命名,合法的标识符说明参数的个数和类型说明函数中用到的除形参以外的其它变量等为了完成函数特定的功能而设计的一个或多个语句空函数:Function(){}2020/5/37函数定义实例打印一行n个‘*’voidstars(intn){inti;for(i=1;i=n;i++)putchar('*');putchar('\n');}求整数x的n次幂(n0)longpower(intx,intn){inti;longmul=1;for(i=1;i=n;i++)mul=mul*x;return(mul);}传统的定义风格2020/5/397.3函数的调用和函数的返回值7.3.1函数的参数7.3.2函数的返回值7.3.3函数的声明7.3.4函数的调用2020/5/3107.3.1函数的参数形式参数:函数定义时所使用的参数称为形式参数。形参可以是:变量或数组名。实际参数:函数调用时所使用的参数称为实际参数。实参可以是:具有确切值的常量、变量、表达式或数组名。2020/5/311intmax(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=xy?x:y;return(z);}形参只能是变量或数组名intmax(intx,inty)c=max(a,b)实参可以是常量、变量、表达式或数组名,但要求它们有确定的值如:c=max(10,(a+b)/2);实参与形参之间:个数一致,类型一致或赋值兼容,顺序一致。形参:变量常量变量实参表达式值2020/5/3127.3.2函数的返回值返回语句(return语句):格式:return(表达式);或return表达式;或return;功能:将流程及表达式的值从被调用函数返回到函数的调用处。说明:intmax(intx,inty){intz;z=(xy)?x:y;return(z);}若return后面带表达式,首先计算表达式的值,表达式的值就是所求的函数值。returnz;return((xy)?x:y);2020/5/313说明(续)一个函数体内可以有多个或没有return语句;intmax(intx,inty){intz;if(xy)return(x);elsereturn(y);}voidoutput(intm){printf(”%d”,m);return;}若return后面没有表达式,或没有return语句,则可能会返回不定值。output(intm){printf(”%d”,m);return;}/*默认为int类型函数*/void:空类型2020/5/3147.3.3函数的声明#includestdio.hvoidstars(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);}2020/5/315函数声明的一般形式:函数类型函数名(类型名形参1,类型名形参2,……)包含参数和返回值类型的函数声明称为函数原型。函数类型函数名(类型名,类型名,……)若有函数:floatfun(doublea,intb,floatc){……}则可有函数声明:⒈floatfun(doublea,intb,floatc);⒉floatfun(doublex,inty,floatz);⒊floatfun(double,int,float);说明:2020/5/316说明(续):如果函数的值是int或char型,可以不必进行声明,系统自动按int型声明。如果被调用函数出现在主调函数之前,可以不必进行声明。#includestdio.hmain(){inta,b,c;scanf(%d%d,&a,&b);c=max(a,b);printf(Max=%d\n,c);}intmax(intx,inty){intz;z=xy?x:y;return(z);}2020/5/317说明(续):如果已在所有函数定义之前,在函数的外部已作了函数声明,则在各个主调函数中不必对所调用的函数再做声明。#includestdio.hdoublemysqrt(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);}2020/5/3187.3.4函数的调用调用的一般形式:函数名(实参1,实参2,……)说明:若调用无参函数,则无实参表列,但括弧不能省略;如果实参表列包含多个实参,则各参数间用逗号隔开;实参与形参的个数应相等,类型应一致或赋值相容;实参与形参按顺序一一对应传递数据;2020/5/319调用方式函数语句:由函数调用加上分号构成,在主调函数中可作为一个独立的语句。如:stars(20);或printf(”Cprogram”);函数表达式:函数调用作为一个运算对象出现在表达式中,此时要求函数带回一个确定的值以参加表达式的运算。如:c=mysqrt(a);函数参数:函数调用作为另一个函数的实参,其值作为一个实际参数传给被调函数的形参进行处理;此时也要求函数带回一个确定值。如:m=max(a,max(b,c));printf(%d,max(a,b));2020/5/320调用过程floatadd();main(){floata,b,c;scanf(”%f,%f”,&a,&b);c=add(a,b);printf(”sumis%f”,c);}floatadd(floata,floatb){return(a+b);}1.调用,流程从主调函数转移到被调用函数,且实参将值传给对应的形参;2.执行被调用函数;3.流程从被调用函数返回到主调函数,并返回函数值。abc615a6b15212020/5/321调用过程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形参:变量实参:常量变量表达式值102020/5/3227.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);}2020/5/323例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的值2020/5/324sin(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)#includemath.hdoublechange(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);}2020/5/325sin(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);}2020/5/3267.5函数的嵌套调用和递归调用7.5.1函数的嵌套调用7.5.2函数的递归调用2020/5/3277.5.1函数的嵌套调用C语言的函数定义都是互相平行的、独立的,即不允许嵌套定义函数;但是,可以嵌套调用函数,即程序在调用一个函数的过程中,该被调函数又可以调用其它函数。如:main函数调用a函数a函数调用b函数b函数结束main函数调用a函数a函数调用b函数b函数结束main函数调用a函数a函数调用b函数结束2020/5/328nm!例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)/f
本文标题:C语言-第七章--函数
链接地址:https://www.777doc.com/doc-5181700 .html