版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第1111章章 c c语言的模块化程序设计语言的模块化程序设计 return本章学习目标本章学习目标q掌握模块化程序设计的基本方法。掌握模块化程序设计的基本方法。 q掌握全局变量和局部变量、动态变量和静态变量掌握全局变量和局部变量、动态变量和静态变量的概念和使用方法。的概念和使用方法。q掌握内部函数和外部函数的概念和使用方法。掌握内部函数和外部函数的概念和使用方法。 q掌握由多个源文件组成的掌握由多个源文件组成的c c程序设计和编译运行程序设计和编译运行方法。方法。 11.1 11.1 程序设计的基本方法程序设计的基本方法 11.2 11.2 c c语言对模块化编程的支持语言对模块化编程的支
2、持 11.3 11.3 多个源程序文件组成的多个源程序文件组成的c c程序设计案例分析程序设计案例分析 11.1 程序设计的基本方法 结构化程序设计方法是随着结构化程序设计语言(如pascal、c)的出现和发展而建立起来的,已经被广泛应用于软件系统的开发。 结构化程序设计方法主要包括如下3个方面:1)自顶向下、逐步求精的设计过程。2)模块化程序设计。3)结构化编程。 11.1.1 11.1.1 自顶向下、逐步求精的设计过程自顶向下、逐步求精的设计过程 所谓自顶向下、逐步求精的设计过程就是在进行一个复杂系统的设计时采取先全局后局部、先整体后细节、先抽象后具体的分析设计方法,把系统分解为层次分明、
3、结构清晰、容易实现的若干个模块,然后再将每一个模块细化为若干个处理步骤或算法,直到可用程序设计语言的语句来编程实现。 下面用一个简单例子说明这种自顶向下、逐步求精的设计过程。 【例【例11-111-1】 设计一个简单的通讯录管理程序。 【思路导航】【思路导航】首先将问题分解成以下7个模块: (1)主控模块 (2)菜单模块 (3)添加模块 (4)删除模块 (5)修改模块 (6)显示模块 (7) 保存模块 然后,对这7个模块再分别进一步细化。 v主控模块可细化为:(1)初始化;(2)循环等待用户选择菜单项;(3)根据用户选择菜单项执行相应操作:若是“添加”,则调用添加模块;若是“删除”。则调用删除
4、模块;若是“修改”,则调用修改模块;若是“显示”,则调用显示模块;若是“保存”,则调用保存模块;若是“退出”,则结束程序。 v添加模块可细化为:(1)查找(2)根据查找结果做出相应操作: 若该名字已存在,输出提示信息;若该名字未存在,插入新记录。v删除模块可细化为:(1)查找(2)根据查找结果做出相应操作: 若该名字不存在,输出提示信息;若该名字存在,删除该记录。v修改模块可细化为:(1)查找(2)根据查找结果做出相应操作: 若该名字不存在,输出提示信息;若该名字存在,修改该记录。v保存模块可细化为:(1)提示输入文件名;(2)以写方式打开该文件;(3)把数据写入该文件 最后,把各个子模块再细
5、化为具体的c语言语句。请看书中/*exam11_1*/。程序编译运行后的用户界面如图11-1所示。 演示图11-1 11.1.2 11.1.2 模块化程序设计模块化程序设计 1什么是程序模块? 在软件设计过程中,往往将一个大规模的程序划分成若干个大小适当的程序段去编写,或者是将那些重复使用的程序段进行独立设计,以达到计算机可以重复执行,而设计人员又不必重复去编写的目的。这样划分的程序段被称为程序模块。 2什么是模块化程序设计? 模块化程序设计就是遵循一定的模块分解和组织原则,把一个大程序分解为多个容易理解和实现的大小适当、功能明确、具有一定独立性的程序模块的过程。 (1)模块分解原则 在进行模
6、块分解时,要求各模块功能尽可能专一,各模块之间的联系尽可能简单。模块之间的联系越简单,独立性就越强,就越容易独立地进行设计、维护和修改,程序的可维护性和可扩展性就越好,程序设计的效率和质量也就越高。 (2)模块组织原则 结构化程序设计方法要求按层次结构组织各模块。“自顶向下”地将一个大程序逐层分解,得到程序的模块层次结构,而后再进一步把每个模块分解为具体的执行模块或执行步骤。 按层次组织模块时,一般较上层的模块描述“做什么”,最底层的模块才描述“如何做”。3c语言的模块化技术 (1)c语言的模块化粒度 在c语言中,函数是实现程序模块化的有力工具。一般地,一个函数实现一个模块功能,一个模块(或一
7、个源程序文件)可以由多个函数组成。c语言的模块粒度从小到大依次为:函数源程序文件程序,如图11-1所示。 c程序源程序文件1源程序文件2源程序文件n函数1函数2函数n图11-1(2)c语言编译系统对模块化的技术支持 c语言编译系统提供了宏定义、文件包含、条件编译等编译预处理命令来实现编译预处理,并且提供了丰富的库函数,为实现模块化编程提供了极大的方便。(3)c语言对模块化的技术支持 c语言提供函数和局部变量以实现模块的包装和独立性(在第7章已介绍),提供全局变量以实现多个模块之间的数据共享,提供extern声明的全局变量和外部函数以扩展其作用域从而提高模块之间的函数和数据的共享性,提供stat
8、ic声明的全局变量和内部函数以限制其作用域从而提高模块的相对独立性。本章11.2节将重点讨论这些技术的使用。 11.1.3 11.1.3 结构化编程结构化编程 结构化编程是把任何程序的结构都限制为顺序、选择和循环三种基本结构,以提高程序的可读性和可靠性。一个结构化程序应当具有以下特点:(1) 有一个入口、一个出口;(2) 没有死语句(永远执行不到的语句), 每一个语句应当至少有一条从入口到出口的路径通过它;(3) 没有死循环(无限制的循环)。 在本书前面的章节已经详细介绍了顺序结构、选择结构和循环结构的程序设计,这里就不再重复。 11.2 c语言对模块化编程的支持 11.2.1 11.2.1
9、局部变量与全局变量局部变量与全局变量1. 1. 定义变量的位置定义变量的位置c语言中定义变量的位置基本上有三种:在函数体内、函数体外和函数形式参数。在函数体内定义的变量以及函数的形式参数都称作局部变量,在所有函数体外定义的变量称作全局变量。2. 2. 局部变量局部变量 局部变量只在定义它们的函数内有效,在此函数之外不能使用它们。局部变量还可以在函数内的复合语句中定义,此时局部变量只在定义它们的复合语句中有效。常常把起于左大括号“”,止于右大括号“”内的语句块统称为代码块,所以可以说,局部变量仅在定义它们的代码块中有效。 例如:fun1()int z; /*z在函数fun1内有效*/z=10;
10、fun2(int x,int y)int z; /*x,y,z在函数fun2内有效*/z=x+y;return z; fun3() int flag; /*flag在函数fun3内有效*/ scan(“%d”,flag); if(flag) char s30; /*s仅在if语句块中有效*/ printf(“please enter information:”); gets(s); 注意:在c语言中,代码块中的局部变量必须在代码块开始处定义,即变量的定义必须出现在其它非变量定义语句之前。而在c+中则不存在此限制,可以在任意地方定义变量。 例如:fun() int i;i=10; int j;j
11、=20;j变量的定义出现在给i的赋值语句之后,在多数c编译系统中会报告语法错误。应改为:fun() int i;int j; i=10;j=20;3. 3. 全局变量全局变量 与局部变量不同,全局变量可以自定义位置起被本源文件中的其他所有函数使用,也可以用extern声明后,在由多个文件组成的程序中被其它源文件使用(关于extern的作用在下一节关于变量存储类型中再详细讨论)。 【例【例11-211-2】全局变量的作用范围。 代码如下: / /* *exam11_2exam11_2* */ /#include int count; /*定义全局变量count*/fun1() int temp;
12、 /*定义局部变量temp*/temp=count; /*引用全局变量count*/ fun2();printf(“ncount is %d, temp is %d ”,count,temp);int temp; /*定义全局变量temp*/fun2() int count; /*局部变量count屏蔽了全局变量count*/ for(count=1;count=temp;count+)/*引用全局变量temp*/ putchar(*);int main(void) temp=10; /*对全局变量temp赋值*/ count=100; /*对全局变量count赋值*/ fun1(); ret
13、urn 0; 全局变量 count的作用范围 全局变量temp的作用范围 演示 虽然main函数和fun1函数都没有定义count,但由于在两个函数之前定义了全局变量count,所以main和fun1都可以使用count;main和fun2函数都没有定义temp,但由于在两个函数之前定义了全局变量temp,所以main和fun2函数都可以使用temp;但是temp是在fun1之后才定义的全局变量,所以如果在fun1函数中企图引用全局变量temp,则会报告出错。 fun2函数定义了与全局变量同名的局部变量count,所以全局变量count在fun2中被屏蔽,即不起作用,而只使用局部变量count
14、。fun1函数定义了与全局变量同名的局部变量temp,全局变量temp在本函数无效,并且就算fun1函数内没有定义同名的局部变量temp,也不能引用全局变量temp,因为全局变量temp在fun1函数之后才定义(若使用extern声明后扩展了有效范围则可以引用,参考下节关于变量的存储类型讨论)。 说明:说明:(1)使用全局变量的好处全局变量可以起到在不同函数间进行数据传递的作用,尤其当需要从一个函数返回多于一个的返回值时可以利用全局变量来实现。这是因为在一个函数中改变了全局变量的值,则会影响到所有使用该全局变量的函数。(2)使用全局变量的坏处使用全局变量会使函数的通用性变。c语言的一大特点就是
15、支持模块化编程,通过函数和局部变量实现对代码数据的包装,函数之间除了通过参数传递数据外尽量不要有其它任何依赖关系,使得程序的移植性好,可读性强。使用全局变量则使函数之间的依赖变强,降低程序的通用性。在程序中大量使用全局变量容易引起程序错误,因为各个函数执行时都可能改变全局变量的值,容易产生副作用。全局变量在程序的整个执行期间占用存储单元,而不像局部变量只在需要时占用存储空间。鉴于上述原因,建议非不得已时不使用全局变量。【例【例11-311-3】通过全局变量从函数得到多于一个的返回值。编写一个函数,能够求出一组整数中的最大值和最小值。【思路导航】【思路导航】因为通过函数的return 语句只能返
16、回一个值,所以把另一个结果赋给一个全局变量,从而达到返回两个结果的目的。 / /* *exam11_3exam11_3* */ /int max=0;/*定义全局变量*/int minimum(int array,int n) int min,j; max=min=array0; for(j=0;jarrayj) min=arrayj; else if(maxarrayj) max=arrayj; return min;int main(void) int a10,k;for(k=0;k10;k+) scanf(“%d”,a+k);printf(“max=%dnmin=%dn”,max, mi
17、nimum(a,10);return 0; 演示1 2 3 4 5 6 7 8 9 10 max=10 min=1 运行情况 注意:上面主函数中的printf函数的参数的前后位置。若把max放在minimum(a,10)的右边,则得不到正确结果,因为c函数的参数运算顺序是从右到左,所以应把minimum(a,10)放在max的右边,这样才能先调用minimum函数从而同时得到最大值和最小值的结果。 11.2.2 11.2.2 变量的存储类型变量的存储类型 在c语言中,每一个变量有两个属性:数据类型和数据的存储类型。数据类型是指数据被定义为整形、字符型、实数型等,前面已详细介绍过。存储类型是指数
18、据在内存中的存储方法,分为两大类:静态存储和动态存储。 所谓静态存储是指在程序运行期间分配固定存储空间的方式;动态存储是指根据需要进行存储空间分配,不需要时即释放存储空间的方式。 变量的存储类型具体又分为四种类型,四种类型说明符如下:auto(自动)register(寄存器)static(静态)extern(外部)动态存储静态存储一般以如下形式对变量进行声明:存储类型说明符存储类型说明符 数据类型数据类型 变量名;变量名;如:auto int a,b;static int c=1; 1. auto1. auto变量变量 函数的局部变量,如果不作static存储类型声明,都是动态分配存储空间的;
19、函数的形式参数也是动态分配存储空间的,两者都是在函数调用时系统给它们分配存储空间,在函数结束时系统自动释放这些存储空间。所以这类局部变量和形式参数都属于auto(自动)变量。 这类局部变量可用auto关键字声明,例如:int fun(int m)auto int j,k; /*定义j,k为自动变量,auto可以省略不写*/ 关键字auto可以省略不写,系统把没有进行static声明的局部变量和形式参数默认为自动型变量。 2. 2. 用用extern extern 声明全局变量声明全局变量 全局变量是在所有函数的外部定义的,它的作用范围是从定义位置起到本文件本文件结束处,全局变量是静态分配存储空间的,使用extern可以扩展全局变量的作用范围。 为了解决不同文件可以使用同一个全
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论