《C语言程序设计》函数目标要求课后作业讲课提纲讲课内容退出模块设计掌握函数、函数值(函数返回值)以及函数调用等的基本概念。掌握函数的定义和调用方法。掌握函数参数的传递方法。掌握变量的作用范围。目标要求目标要求课后作业讲课提纲讲课内容退出概述C的库函数简介函数的定义调用和声明函数的参数和返回值函数的嵌套调用和递归调用变量的作用域变量的存储类别典型实例剖析小结讲课提纲模块设计目标要求课后作业讲课提纲讲课内容退出模块设计(),!!()!mnmnmnmnnm从键盘输入两个正整数与求的值。C目标要求课后作业讲课提纲讲课内容退出模块化程序设计基本思想:将一个大的程序按功能分割成一些小模块开发方法:自上向下,逐步分解,分而治之概述模块设计目标要求课后作业讲课提纲讲课内容退出模块化的优点模块各司其职每个模块只负责一件事情,它可以更专心便于进行单个模块的设计、开发、调试、测试和维护等工作一个模块一个模块地完成,最后再将它们集成开发人员各司其职按模块分配任务,职责明确并行开发,缩短开发时间分而治之(Wirth,1971)信息隐藏(Parnas,1972)目标要求课后作业讲课提纲讲课内容退出函数(function)和模块(module)函数是C语言中模块化编程的最小单位可以把每个函数看作一个模块若干相关的函数可以合并作一个“模块”main()printf()scanf()power()putchar()getchar()main()stdio:printf()scanf()putchar()getchar()mymdl:power()目标要求课后作业讲课提纲讲课内容退出分而治之函数把较大的任务分解成若干个较小的任务,并提炼出公用任务复用程序员可以在其他函数的基础上构造程序,而不需要从头做起信息隐藏设计得当的函数可以把具体操作细节对程序中不需要知道它们的那些部分隐藏掉,从而使整个程序结构清楚用函数解决问题目标要求课后作业讲课提纲讲课内容退出概述源程序文件1预编译命令说明部分执行部分函数1函数n源程序文件i源程序文件nC程序C程序结构模块设计目标要求课后作业讲课提纲讲课内容退出函数是程序的基本组成单位必须有且只能有一个名为main的主函数C程序的执行总是从main函数开始,在main中结束函数与函数之间是平行的独立的,不能嵌套定义,可以嵌套调用函数分类从用户角度标准函数(库函数):由系统提供用户自定义函数从函数的参数形式看无参函数;有参函数模块设计目标要求课后作业讲课提纲讲课内容退出使用库函数应注意:1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型4、需要使用的包含文件C的库函数简介模块设计目标要求课后作业讲课提纲讲课内容退出函数定义的一般形式函数类型函数名(数据类型参数1,数据类型参数2,…){函数体;[return表达式;]}合法标识符模块设计参数表没有加void函数出口返回值目标要求课后作业讲课提纲讲课内容退出函数定义的一般形式例有参函数intmax(intx,inty){intz;z=xy?x:y;return(z);}例无参函数printstar(){printf(“**********\n”);}或printstar(void){printf(“**********\n”);}例空函数dummy(){}模块设计函数定义不允许嵌套目标要求课后作业讲课提纲讲课内容退出返回语句:形式:return(表达式);或return表达式;或return;功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数函数的返回值模块设计目标要求课后作业讲课提纲讲课内容退出函数是这样的一种运算:函数名说明运算规则参数是运算的操作数返回值是运算的结果当函数执行到return语句或}时,函数的运算停止。程序返回到调用它的地方继续执行函数可以有多个return,但最好只有一个且是最后一行用void定义返回值类型函数没有运算结果,没有返回值return语句之后不需要任何表达式用void定义参数,表示没有参数在定义函数时,对函数类型的说明,应与return语句中返回值表达式的类型一致。如果不一致,则以函数类型为准。系统将缺省函数类型按整型(int)来处理函数定义(definition)目标要求课后作业讲课提纲讲课内容退出例函数返回值类型转换函数的返回值main(){intmax(float,float);floata,b;intc;scanf(%f,%f,&a,&b);c=max(a,b);printf(Maxis%d\n,c);}intmax(floatx,floaty){floatz;z=xy?x:y;return(z);}模块设计目标要求课后作业讲课提纲讲课内容退出模块设计(),!!()!mnmnmnmnnm从键盘输入两个正整数与求的值。C目标要求课后作业讲课提纲讲课内容退出模块设计#includestdio.hintfac(intk)/*计算阶乘值的函数*/{ints,i;s=1;for(i=1;i=k;i=i+1)s=s*i;return(s);}main(){intm,n;intfac(int);scanf(%d,%d,&m,&n);if(m=n)printf(%d\n,fac(m)/(fac(n)*fac(m-n)));elseprintf(mn!\n);}目标要求课后作业讲课提纲讲课内容退出模块设计函数声明:一般形式:函数类型函数名(形参类型[形参名],…)作用:告诉编译系统函数类型、参数个数及类型,以便检验在主调函数之前,需对被调函数进行声明以下情况可以不用函数声明(1)当被调用函数的函数定义出现在主调函数之前时。(2)如果在所有函数定义之前,在函数外部(例如文件或程序开始处)预先对各个函数进行了声明,则在主调函数中可以省去对被调用函数的说明。函数调用的一般形式目标要求课后作业讲课提纲讲课内容退出调用形式:函数名(实参表);说明:无参函数调用时,圆括号不可省略实参与形参个数相等,类型一致,按顺序一一对应函数定义与函数调用的区别:函数的定义中有“类型标识符”而函数的调用中没有。函数的定义中的参数为“形参”,而函数的调用中参数为“实参”。函数的定义后没有“;”,而函数的调用中有“;”(函数作为实参外)。函数调用的一般形式模块设计目标要求课后作业讲课提纲讲课内容退出函数调用方式函数语句:例printf(IloveChina!\n);函数表达式:例c=max(a,b);函数参数:例printf(%d\n,max(a,b));putchar(getchar());函数调用的一般形式模块设计目标要求课后作业讲课提纲讲课内容退出调用函数时,对被调函数的要求:必须是已存在的函数库函数:#include*.h用户自定义函数:函数类型声明对被调用函数的声明模块设计目标要求课后作业讲课提纲讲课内容退出对被调用函数的声明main(){floatadd(float,float);/*函数原型声明*/floata,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sumis%f,c);}floatadd(floatx,floaty)/*函数首部*/{floatz;/*函数体*/z=x+y;return(z);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sumis%f,c);}被调函数出现在主调函数之前,不必函数说明模块设计目标要求课后作业讲课提纲讲课内容退出形式参数:在定义函数时函数名后面圆括号中的变量名,简称形参。实际参数:在主调用函数中调用一个函数时,函数名后面圆括号中的表达式,简称实参。。例比较两个数并输出大者intmax(intx,inty){intz;z=xy?x:y;return(z);}main(){inta,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(Maxis%d,c);}实参形参c=max(a,b);(main函数)形式参数和实际参数(max函数)intmax(intx,inty){intz;z=xy?x:y;return(z);}目标要求课后作业讲课提纲讲课内容退出说明:形参必须指定类型形参与实参类型一致,个数相同,才能正确地进行数据传递若形参与实参类型不一致,自动按形参类型转换——函数调用转换形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放实参对形参的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。实参和形参占用不同的内存单元,即使同名也互不影响。形式参数和实际参数目标要求课后作业讲课提纲讲课内容退出例计算x的立方形式参数和实际参数#includestdio.hfloatcube(floatx){return(x*x*x);}voidmain(){floata,product;printf(Pleaseinputvalueofa:);scanf(%f,&a);product=cube(a);printf(”Cubeof%.4fis%.4f\n,a,product);}aproduct××××1.21.21.728x模块设计目标要求课后作业讲课提纲讲课内容退出模块设计函数调用的执行过程main()函数{······}调用function()函数保存:返回地址当前现场function()函数①②③④⑤⑥⑦结束恢复:主调函数现场返回地址返回目标要求课后作业讲课提纲讲课内容退出C语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是C语言允许在一个函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。函数的嵌套调用模块设计目标要求课后作业讲课提纲讲课内容退出模块设计目标要求课后作业讲课提纲讲课内容退出例求三个数中最大数和最小数的差值main(){intdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);inta,b,c,d;scanf(%d%d%d,&a,&b,&c);d=dif(a,b,c);printf(Max-Min=%d\n,d);}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}intmax(intx,inty,intz){intr;r=xy?x:y;return(rz?r:z);}intmin(intx,inty,intz){intr;r=xy?x:y;return(rz?r:z);}函数的嵌套调用目标要求课后作业讲课提纲讲课内容退出例求三个数中最大数和最小数的差值main()调用函数dif输出结束dif函数max函数调用函数max调用函数minmin函数main(){……d=dif(a,b,c);……}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}intmax(intx,inty,intz){……}intmin(intx,inty,intz){……}目标要求课后作业讲课提纲讲课内容退出定义:函数直接或间接的调用自身叫函数的递归调用函数的递归调用intf(intx){inty,