模块化程序设计(2)

上传人:xy****7 文档编号:94168099 上传时间:2019-08-03 格式:PPT 页数:30 大小:111.50KB
返回 下载 相关 举报
模块化程序设计(2)_第1页
第1页 / 共30页
模块化程序设计(2)_第2页
第2页 / 共30页
模块化程序设计(2)_第3页
第3页 / 共30页
模块化程序设计(2)_第4页
第4页 / 共30页
模块化程序设计(2)_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《模块化程序设计(2)》由会员分享,可在线阅读,更多相关《模块化程序设计(2)(30页珍藏版)》请在金锄头文库上搜索。

1、C语言程序设计,1,第四章 模块化程序设计,C语言程序设计,2,第四章 模块化程序设计,C语言程序的结构特点是,程序整体是由一个或多个称为函数的程序块组成的,每个程序都具有各自的独立的功能和明显的界面,从而程序整体具有清晰的模块化结构。因此,C语言是十分适宜实现模块化软件设计的程序语言,提高了开发效率,改变了软件质量的保障。 在C语言程序设计中,省去了相同程序段的重复书写、输入和编译,并且无论多么复杂、规模多么大的程序,最终都落实到一个个小型简单函数的编写工作上。因此,C语言程序设计的基础工作是函数的设计和编制。,C语言程序设计,3,4.1 模块化软件与C语言程序结构,模块化设计方法的基本思想

2、是:把软件设计成由相对独立、功能单一的若干模块组成,又称为结构化软件设计。 模块化软件具有逻辑清晰、层次分明的功能结构。它便于采用有顶向下,逐步分解的结构化设计技术。我们给出一个模块化软件结构示意图: 图4.1.1模块化软件结构示意图 A 说明:(1)矩形框表示功能模块,它们具 有相对独立的单一功能。 B C (2)连接矩形框的箭头表示模块间 的调用关系。 D E F G (3)箭头指向的是被调用的模块。 H I,C语言程序设计,4,从图中看出,软件功能A的实现需要调用模块B和C的功能,而B的功能是通过调用D和E的功能来实现,其中D模块又需要使用E模块的功能等, 用C语言编制程序时,每个模块都

3、对应一个函数,模块间的调用关系是在一个函数中调用其它函数的功能。C语言中使用“函数”这一概念,是因为它与数学中函数的概念十分相似。数学中的函数y=f(x)的概念是,对于自变量x的每一给定值,函数总是按照一定的规律f,给定它的结果y。 在一个函数中可以使用另一个函数的功能,称为函数的调用。可以说程序中除主函数之外的其它函数就是在执行主函数时,通过嵌套调用得以执行的。 每个函数的程序块称为函数的定义。从形式上看,一个C语言源程序清单是由一个或多个函数定义组成的,组成C程序的函数,除了用户定义的函数外,还有系统提供的标准函数,它们有系统定义,在程序中可以直接调用它们,这在后面章节中详细讲述。,C语言

4、程序设计,5,4.2 函数的定义和调用,C语言中的函数和变量一样,具有一定的存储类型和数据类型。此外,函数在定义时有一定的格式,在调用函数是要遵循一定的规则,本节主要作这方面的介绍。,C语言程序设计,6,4.2.1 函数的存储类型和数据类型,当一个函数被调用时,一般情况下,它要把运行结果返回给调用它的函数,函数在调用时返回的值为函数的返回值。在函数中使用return语句返送返回值。一般情况下,函数被多次调用时,它的返回值将随给定的参数值而变化。另一方面,从调用者的角度,调用某个函数是为了使用该函数的功能完成某种处理并得到它的返回值。由于返回值是随着给定参数变化的,所以从效果上看,在程序中使用一

5、个有返回值的函数,如同使用一个变量。在C语言中,变量有一定的存储类型和数据类型,从而作为变量使用的函数,也具有这种特性。 C语言把函数返回值的数据类型定为该函数的数据类型。因此,函数所具有的数据类型的种类与变量的相同。当函数的返回值是数值时,它可以是带符号或不带符号(unsigned)的char,int,short或long型,以及float,double型,当返回值是地址值时,函数的数据类型是指针型,当函数没有返回值时,不必指定它的数据类型。在ANSI标准C中,把没有返回值的函数规定为void型。各种不同数据类型的函数,在下面的程序实例中将陆续接触。 函数的定义总是在其它函数的外部,所以函数

6、的存储类型都是外部型,它们可以是缺省存储类型(extern型)或static型。和外部变量一样,函数具有全局寿命,它在其它所有的函数内部都是可见的,从而任何一个函数都可以在其它函数内部被调用。,C语言程序设计,7,4.2.2 函数的定义,函数的定义就是编写完成函数功能的程序块。函数的定义的一般格式是: 存储类型数据类型函数名(形式参数列表) 形式参数说明; 内部数据说明; 执行语句组; 其中,函数名是用户定义的,其定义使用的字符规定与变量名相同。大括号(方括号)“ ”中的部分可以缺省,但小括号“()”符号不能缺省。 从格式上看,函数的定义主要有函数名和用大括号包围的函数体两部分组成。,C语言程

7、序设计,8,例4.2.1,阶乘函数的定义。 long facto(x) int x; long y; for(y=1;x0;-x) y=y*x; return (y); ,该函数的功能是计算形式参数x为给定值的阶乘,返回值是计算结果,即x!的值。由于返回值时long型数据,所以该函数的数据类型是long型。 当函数的返回值是int型或无返回值时,函数定义时一般缺省函数的数据类型指定。对于配置有void型的编译系统,无返回值函数则指明为void型,但也可以缺省。如果函数有返回值,则函数体中需要使用return语句。 按照传统,函数的形式参数(简称形参)虽然是在函数体“”外部说明的,但它们与在“”

8、内部说明的变量相同,即形参是函数的内部变量,并且它们只能是auto型(一般缺省)或register型局部变量。因此,它们的寿命和可见性仅限于函数内部,函数被调用时,形参接收函数传递来的实参值。所以,函数被调用时,它的形参被赋予了一定的值。因此,我们可以说,形参是被初始化的内部变量。 C语言规定,在一个函数的内部不能定义其它函数,即函数的定义不能嵌套,这个规定保证了每个函数都是一个相对独立的程序块。在多个函数组成的C语言程序中,各个函数定义的顺序是任意的,函数定义的顺序并不影响程序运行时的执行顺序。,C语言程序设计,9,4.2.3 函数的调用,在一个函数中调用另一个函数时,程序控制就是从调用函数

9、中转移到被调用函数,并且从被调用函数的函数体起始位置开始执行该函数的语句。在执行完函数体中的所有语句,或者遇到return语句时,程序控制就返回调用函数中原来的断点位置继续执行。 在程序中调用一个函数时,应该说明该函数的存储类型和数据类型,这称为函数的说明。函数的说明在程序的数据说明部分,它可以在函数内部,也可以在函数外部说明。与变量一样,函数说明在程序中的位置决定了它的可见性和使用范围。 函数说明的一般形式是:存储类型 数据类型 函数名(); 函数的说明可以和具有相同类型的变量、指针等在一起说明。 例4.2.2, long fun(); char a,*pa,strfun(); 函数说明时指

10、出的数据类型必须与该函数在定义是指定的数据类型一致。对于int型、无返回值或void型的函数,可以缺省它们的说明。,C语言程序设计,10,例4.2.2, main() int c; printf(“Input a number:n”); c=getchar(); 函数调用的一般格式为:函数名(实际参数列表); 若函数名后的小括号中的实际参数列表中有多个实际参数(简称实参)时,彼此用逗号隔开。若无实参时小括号不能缺省。 使用参数可在函数之间传递数据。在一个函数中调用另一个函数时,实参的值传递到形参中,这样就实现了把数据由调用函数传递给被调用函数。在使用参数传递数据时,可以采用两种不同的方式:数据

11、传递和地址传递。此外,使用参数还可以把函数的处理结果返回到调用它的函数中。 使用数据复制方式传递数据的特点是:由于数据在传递和被传递方占用不同的内存空间,所以被传递的数据在被调用的函数中无论如何变化,都不影响该数据在调用函数中的值。采用这种方式,每个参数值能传递一个数据。当需要传递数据较多时,一般不采用这种方式,而采用地址传递方式。这时作为参数传递的不是数据本身,而是数据的存储地址。这部分在讲述指针时详细讲述。,C语言程序设计,11,4.3 使用返回值和全局变量传递数据,C语言程序设计,12,4.3.1 使用返回值传递数据,我们曾经提到,函数被调用后可以向调用它的函数返回一个值,返回值是通过函

12、数中使用return语句实现的。return语句是流程控制语句,它可以用在除主函数main()之外的其它函数中。它的一般使用形式为:return (表达式);其中,小括号可以缺省。它的功能是:把程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函数。它只能把一个返回值传递给调用函数,当要求返回值多于一个时,就不能使用return语句。返回值本身可以是数值,也可以是地址值 。当返回值为数值时,在调用函数时,使用具有同数据类型的变量接收。当返回值为地址值时,在调用函数时,使用指针变量接收它。如上例4.2.2中的“return(y):”。 需要补充一下: (1)return语句可以不带表达式

13、部分,既return;这种情况,它仅仅实现程序控制的转换而不传递任何值。 (2)C语言的函数中不是必须有return语句。这点与BASIC,FORTRAN,汇编程序中的子程序不同。没有return语句的C语言函数,程序控制到达包围函数的下面大括号“”时,自动返回调用函数。 例4.3.1,判断输入的是否是小写字母。 inx(x) char x; if(xz); printf(“Warning,error!n”); ,C语言程序设计,13,(3)函数中可以根据需要设置多个return语句。 例4.3.2,符号函数。 sign(x) int x; if(x=0) return (0); else i

14、f(x0) return (1); else return (-1); 虽然函数中有三个return语句,但每次被调用时仅仅执行其中一个。因此,返回值只有一个。 在编写函数时,常常要求把函数的运行状态,比如是否顺利执行了函数的功能,在执行过程中是否出错、溢出等状态返回给调用函数,在这种情况下,使return返回值返回状态标志值。,C语言程序设计,14,4.3.2使用全局变量传递数据 例4.3.3,使用全局变量在函数间传递数据。 int c; main() int a,b; printf(“Enter A and B:n”); scanf(“%d,%d”, ,c是外部变量,是在函数main()和

15、plus()中都可见的全局变量。在plus()中把“x+y”的结果赋予c,在main()中同样使用c得到函数plus()的结果。所以使用全局变量c把plus()的求和结果传递给main()。 程序中全局变量的使用增加了函数之间的联系,从而降低了函数作为一个程序模块的相对独立性。在模块化软件设计方法中,不提倡过多的使用全局变量。因此,除非大多数函数要使用的公共数据外,一般不使用全局变量在函数间传递数据。 数组、指针函数、字符串函数在以后章节中讲述。,C语言程序设计,15,递归函数又称为自调用函数,它的特点是,在函数内部直接或间接地自己调用自己,其结构十分简练。 在递归函数中,由于存在着自调用的过

16、程,程序控制将反复的进入它的函数体,为了防止自调用过程无休止继续下去,在函数内必须设置某个条件,当条件成立时,终止自调用过程,并使程序控制逐步从函数中返回。 例4.4.1,阶乘函数。 facto(x) int x; if(x=1) return (1); else return (x*facto(x-1); 在编写递归函数时,函数内使用的变量应该是auto堆栈型变量。C语言编译系统对递归函数的自调用次数没有限制,但当递归函数层次过多时,可能会引起堆栈溢出。值得注意的是,主函数不能进行自调用。,4.4 递归函数,C语言程序设计,16,4.5 编译预处理,编译预处理语句的作用不是实现程序的功能,而是发布给编译系统信息。它们告诉编译系统,在对源程序进行编译之前应该做些

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号