C语言程序设计-用函数实现模块化程序设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1第七章用函数实现模块化程序设计C语言程序设计北京航空航天大学交通科学与工程学院徐国艳2/73本章要点函数的定义、说明与调用函数之间参数传递规则函数递归调用和嵌套调用变量的存储类型与特性3/73第七章用函数实现模块化程序设计4/73一、模块化程序结构模块1主模块模块11模块2模块21模块227.1概述一个较大的应用程序应分为若干个程序模块,每一个模块用来实现一个特定的功能。所有的高级语言都有子程序概念,用子程序实现模块的功能。5/73学生成绩管理系统成绩录入成绩查询成绩统计成绩单打印在C语言中是利用函数来实现子程序的作用。6/73采用模块化程序设计的优越性:控制程序设计的复杂性提高软件的可靠性提高软件开发的效率提高软件的可维护性提高程序的重用性7/73C程序是函数的集合体,每个函数是一个独立的程序模块;有一个主函数,若干个子函数;所有子函数地位平等,可相互调用、自我调用;函数可集中或分散存放在一个或多个源程序文件中。函数F1()main()F11()F2()F21()F22()二、C程序的结构黑盒子8/73三、C函数的分类数学函数(math.h)字符和字符串函数(ctype.h,string.h)I/O函数(stdio.h)动态存储分配函数(stdlib.h或malloc.h)形式无参函数有参函数空函数库函数用户定义函数详见P384附录F9/73四、C程序的执行顺序一个源程序文件,由一个或多个函数以及其他有关内容组成,是一个编译单位,函数不是一个编译单位。C程序的执行总是从main函数开始,调用其它函数后回到main函数,在main函数中结束整个程序的运行;所有的子函数都是平行的,任何子函数都不属于其他函数;voidmain(){printstar();printmessage();}例7-1#includestdio.hvoidprintstar(){printf(“*************\n”);}voidprintmessage(){printf(“Hello,world.\n”);printstar();}这两个函数能单独执行吗?不能10/73例7-2#includestdio.hintmax(intx,inty){intz;z=xy?x:y;return(z);}voidmain(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Themaxis%d”,c);}voidprintstar(){printf(“***************”);}voidfunction(inta,floaty){}7.2函数的定义一、函数定义的一般形式类型说明函数名([形式参数说明]){函数体}形式参数说明方法:类型说明变量名1[,类型说明变量名2]…1.无参函数的定义形式类型说明函数名(){函数体}2.空函数的定义形式类型说明函数名([形式参数说明]){}11/73一般情况下,函数体由两部分组成:{[局部变量说明]语句}局部变量:函数体内定义的变量,其有效范围仅在函数内部,离开函数体无意义。7.2函数的定义二、函数体组成12/73┇c=max(a,b);┇7.3函数参数和函数的值一个C程序由若干个函数组成,各函数调用时经常要传递一些数据,调用函数把数据传递给被调用函数,经被调用函数使用后,一般会返回一个确定结果,在返回调用函数时,把这些结果带回调用函数。例7-2#includestdio.hintmax(intx,inty){intz;z=xy?x:y;return(z);}voidmain(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Themaxis%d”,);}主调函数intmax(intx,inty){┇return(z);}被调用函数a,bz各函数的信息往来主要是由参数传递和返回语句实现的13/73一、形式参数和实际参数7.3函数参数和函数的值例7-2#includestdio.hintmax(intx,inty){intz;z=xy?x:y;return(z);}voidmain(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Themaxis%d”,c);}函数参数用于函数间数据的传递形式参数:定义函数时使用的参数实际参数:调用函数时使用的参数函数max有两个形式参数x和y形参x和y只在max函数中使用a和b是主函数中定义的变量main函数调用max函数a和b是max函数的实参23,56Themaxis5614/73说明:1.定义函数时,必须说明形参类型,形参只能是变量和数组;2.函数被调用前,形参不占内存,函数调用结束后,内存也被释放;3.实参可以是常量、变量和表达式;4.实参和形参的类型必须一致,字符型和整型可以相互匹配;5.C语言中实参对形参的数据传递是“值传递”,即单向传递,仅由参数的对应位置决定,与名字无关。一、形式参数和实际参数7.3函数参数和函数的值例8-2#includestdio.hintmax(intx,inty){intz;z=xy?x:y;return(z);}voidmain(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Themaxis%d”,c);23,56Themaxis56例8-2#includestdio.hintmax(intx,inty){x=xy?x:y;return(x);}voidmain(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Themaxis%d”,c);例7-2#includestdio.hintmax(intb,inta){intc;c=ba?b:a;return(c);}voidmain(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Themaxis%d”,c);}15/73一、形式参数和实际参数7.3函数参数和函数的值例7-3读程序,写程序结果#includestdio.hintsum(inta,intb){intc;a=a+b;b=a+b;c=a+b;printf(“sum:%d+%d=%d\n”,a,b,c);returna;}voidmain(){inta=1,b=3,c;c=sum(a,b);printf(“main:%d+%d=%d\n”,a,b,c);}16/737.3函数参数和函数的值二、函数的返回值1.返回函数值的方法(1)函数的返回值也就是函数的值,如果一个函数有返回值,就必须用return语句;(2)一个函数中可以有多个return语句,无论执行到哪个return语句,都将结束函数调用,返回主调函数。例8-2#includestdio.hintmax(intx,inty){intz;z=xy?x:y;return(z);}voidmain(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Themaxis%d”,c);例8-2#includestdio.hintmax(intx,inty){if(xy)return(x);return(z);}voidmain(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Themaxis%d”,c);}例7-2#includestdio.hintmax(intx,inty){return(xy?x:y);}voidmain(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Themaxis%d”,c);}(3)return语句中的括号可以省略,return后面可以是一个表达式,返回的是表达式的值。17/732.函数值的类型(1)函数的类型也就是函数值的类型,函数max是int型的,函数max的值也是int型的;(2)省略了类型说明的函数是int型;(3)return语句中的表达式一般应与函数类型一致。如果不一致,需要进行类型转换,只有数值型数据可以进行自动类型转换,以函数类型为准。例7-2#includestdio.hintmax(intx,inty){intz;z=xy?x:y;return(z);}voidmain(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Themaxis%d”,c);}7.3函数参数和函数的值18/733.不需要返回值的函数(1)如果函数中没有使用return语句,函数返回的是一个不确定的值;(2)如果一个函数不需要返回值,可以用void做类型说明;(3)如果一个函数被声明为void型的,就不允许再引用他的返回值,只能用函数语句形式调用;7.3函数参数和函数的值例7-1#includestdio.hvoidprintstar(){printf(“***************”);}voidprintmessage(){printf(“Hello,world.\n”);printstar();}voidmain(){printstar();printmessage();}19/737.4函数的调用一.函数调用的一般形式函数名(实参表列)说明:1.如果调用无参函数,实参表列部分没有,但括号不能省略;2.实参的个数和形参个数一般相等;3.实参和形参的类型一一对应,必要时使用类型转换;4.实参变量定义在调用函数之前完成。例7-2#includestdio.hintmax(intx,inty){intz;z=xy?x:y;return(z);}voidmain(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Themaxis%d”,c);}20/73二.函数调用的方式1.函数语句形式为:函数名(实参表列);例如:printmessage();printf(“%d”,a);说明:这种方式不要求函数带返回值,函数仅完成一定的操作。2.函数表达式函数的值参与运算例如:m=max(a,b);m=3*max(a,b);printf(“Themaxis%d”,max(a,b));说明:这种方式不能用于void类型。7.4函数的调用21/737.4函数的调用三.函数调用的执行过程1.按从右到左的顺序,计算实参各表达式的值;2.按照位置,将实参的值一一传给形参;3.执行被调用函数;4.当遇到return(表达式)语句时,计算表达式的值,并返回主调函数。22/73#includestdio.hintsum(intx){inti,t=0;for(i=1;i=x;i++)t+=i;return(t);}voidmain(){ints;s=sum(100);printf(%d\n,s);}在程序中调用函数要满足以下条件:1.被调函数必须存在,且遵循先定义,后使用的原则;2.如果函数在主调函数之后定义,则应在主调函数中或主调函数之前对被调函数进行声明。7.4函数的调用四.函数的声明#includestdio.hvoidmain(){intsum(intx);ints;s=sum(100);printf(%d\n,s);}intsum(intx){inti,t=0;for(i=1;i=x;i++)t+=i;return(t);}23/73函数声明的一般形式函数声明与函数定义的格式区别:函数声明语句的()后必须有分号,而函数定义()后没有分号。函数声明只有一条语句,没有函数体,而函数定义有多条语句,有函数体。intmax(intx,inty);intmax(int,int

1 / 73
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功