




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第1111章章 C C语言的模块化程序设计语言的模块化程序设计 Return 本章学习目标本章学习目标 q掌握模块化程序设计的基本方法。掌握模块化程序设计的基本方法。 q掌握内部函数和外部函数的概念和使用方法。掌握内部函数和外部函数的概念和使用方法。 q掌握由多个源文件组成的掌握由多个源文件组成的C C程序设计和编译运行程序设计和编译运行 方法。方法。 11.1 11.1 程序设计的基本方法程序设计的基本方法 11.2 C11.2 C语言对模块化编程的支持语言对模块化编程的支持 11.3 11.3 多个源程序文件组成的多个源程序文件组成的C C程序设计案例分析程序设计案例分析 11.1 程序
2、设计的基本方法 结构化程序设计方法是随着结构化程序设计语言(如 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)把数据写入该文件 最后,把各个子模块再细化为具体的C语言语句。请看书中 /*exam11_1*/。程
5、序编译运行后的用户界面如图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声明的全局变量和外部 函数以扩展其作用域从而提高模块之间的函数和数据 的共享性,提供s
8、tatic声明的全局变量和内部函数以 限制其作用域从而提高模块的相对独立性。本章11.2 节将重点讨论这些技术的使用。 11.1.3 11.1.3 结构化编程结构化编程 结构化编程是把任何程序的结构都限制为顺序、选 择和循环三种基本结构,以提高程序的可读性和可靠 性。 一个结构化程序应当具有以下特点: (1) 有一个入口、一个出口; (2) 没有死语句(永远执行不到的语句), 每一个语 句应当至少有一条从入口到出口的路径通过它; (3) 没有死循环(无限制的循环)。 在本书前面的章节已经详细介绍了顺序结构、选择 结构和循环结构的程序设计,这里就不再重复。 11.2 C语言对模块化编程的支持 1
9、1.2.1 11.2.1 局部变量与全局变量局部变量与全局变量 1. 1. 定义变量的位置定义变量的位置 C语言中定义变量的位置基本上有三种:在函数体内、函数体外 和函数形式参数。在函数体内定义的变量以及函数的形式参数都 称作局部变量,在所有函数体外定义的变量称作全局变量。 2. 2. 局部变量局部变量 局部变量只在定义它们的函数内有效,在此函数之外不能使用 它们。局部变量还可以在函数内的复合语句中定义,此时局部变 量只在定义它们的复合语句中有效。常常把起于左大括号“”, 止于右大括号“”内的语句块统称为代码块,所以可以说,局部 变量仅在定义它们的代码块中有效。 例如: fun1() int
10、z; /*z在函数fun1内有效*/ z=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+中则不存在此限制,可以 在任意地方定义变
11、量。 例如: fun() int i;i=10; int j;j=20; j变量的定义出现在给i的赋值语句之后,在多数C编译系统中会 报告语法错误。应改为: fun() int i;int j; i=10;j=20; 3. 3. 全局变量全局变量 与局部变量不同,全局变量可以自定义 位置起被本源文件中的其他所有函数使用 ,也可以用extern声明后,在由多个文件 组成的程序中被其它源文件使用(关于 extern的作用在下一节关于变量存储类型 中再详细讨论)。 【例例11-211-2】全局变量的作用范围。 代码如下: / /* *exam11_2exam11_2* */ / #include i
12、nt count; /*定义全局变量count*/ fun1() int temp; /*定义局部变量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; /*对全局变量t
13、emp赋值*/ count=100; /*对全局变量count赋值*/ fun1(); return 0; 全局变量 count的作用范围 全局变量temp的作用范围 演示 虽然main函数和fun1函数都没有定义count,但由于在 两个函数之前定义了全局变量count,所以main和fun1都 可以使用count;main和fun2函数都没有定义temp,但由 于在两个函数之前定义了全局变量temp,所以main和fun2 函数都可以使用temp;但是temp是在fun1之后才定义的全 局变量,所以如果在fun1函数中企图引用全局变量temp, 则会报告出错。 fun2函数定义了与全局变量
14、同名的局部变量count,所 以全局变量count在fun2中被屏蔽,即不起作用,而只使 用局部变量count。fun1函数定义了与全局变量同名的局 部变量temp,全局变量temp在本函数无效,并且就算fun1 函数内没有定义同名的局部变量temp,也不能引用全局变 量temp,因为全局变量temp在fun1函数之后才定义(若使 用extern声明后扩展了有效范围则可以引用,参考下节关 于变量的存储类型讨论)。 说明:说明: (1)使用全局变量的好处 全局变量可以起到在不同函数间进行数据传递的作用,尤 其当需要从一个函数返回多于一个的返回值时可以利用全 局变量来实现。这是因为在一个函数中改变
15、了全局变量的 值,则会影响到所有使用该全局变量的函数。 (2)使用全局变量的坏处 使用全局变量会使函数的通用性变。C语言的一大特点就 是支持模块化编程,通过函数和局部变量实现对代码数据 的包装,函数之间除了通过参数传递数据外尽量不要有其 它任何依赖关系,使得程序的移植性好,可读性强。使用 全局变量则使函数之间的依赖变强,降低程序的通用性。 在程序中大量使用全局变量容易引起程序错误,因为各 个函数执行时都可能改变全局变量的值,容易产生副作用 。 全局变量在程序的整个执行期间占用存储单元,而不像 局部变量只在需要时占用存储空间。 鉴于上述原因,建议非不得已时不使用全局变量。 【例例11-311-3
16、】通过全局变量从函数得到多于一个的返回值。 编写一个函数,能够求出一组整数中的最大值和最小值。 【思路导航思路导航】因为通过函数的return 语句只能返回一个值 ,所以把另一个结果赋给一个全局变量,从而达到返回两个 结果的目的。 / /* *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 ma
17、in(void) int a10,k; for(k=0;k10;k+) scanf(“%d”,a+k); printf(“Max=%dnmin=%dn”,Max, minimum(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 1
18、1.2.2 变量的存储类型变量的存储类型 在C语言中,每一个变量有两个属性:数据类型和数据的存储 类型。数据类型是指数据被定义为整形、字符型、实数型等,前 面已详细介绍过。存储类型是指数据在内存中的存储方法,分为 两大类:静态存储和动态存储。 所谓静态存储是指在程序运行期间分配固定存储空间的方式; 动态存储是指根据需要进行存储空间分配,不需要时即释放存储 空间的方式。 变量的存储类型具体又分为四种类型,四种类型说明 符如下: auto(自动) register(寄存器) static(静态) extern(外部) 动态存储 静态存储 一般以如下形式对变量进行声明: 存储类型说明符存储类型说明符
19、 数据类型数据类型 变量名;变量名; 如: auto int a,b; static int c=1; 1. auto1. auto变量变量 函数的局部变量,如果不作static存储类型声明,都是动态分 配存储空间的;函数的形式参数也是动态分配存储空间的,两者 都是在函数调用时系统给它们分配存储空间,在函数结束时系统 自动释放这些存储空间。所以这类局部变量和形式参数都属于 auto(自动)变量。 这类局部变量可用auto关键字声明,例如: int fun(int m) auto int j,k; /*定义j,k为自动变量,auto可以省略不写*/ 关键字auto可以省略不写,系统把没有进行static声明的局 部变量和形式参数默认为自动型变量。 2. 2. 用用extern extern 声明全局变量声明全局变量 全局变量是在所有函数的外部定义的,它的作用范围是从定 义位置起到本文件本文件结束处,全局变量是静态分配存储空间的,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 轻量化材料疲劳性能-第1篇-洞察及研究
- 地球成分演化与环境历史记录研究-洞察阐释
- 纺织设备安全风险评估方法-洞察阐释
- 朱砂资源可持续性研究-洞察阐释
- 汽车配件制造业绿色物流与供应链管理研究-洞察阐释
- 高分辨率风场预测模型-洞察及研究
- 程序错误与网络流量监控的动态防御-洞察阐释
- 广东省惠州市实验中学2025年高二下化学期末联考模拟试题含解析
- 消费者行为预测对零售业人力资源的影响-洞察阐释
- 纸浆废弃物的循环利用与资源化研究-洞察阐释
- 2025年绥化市中考化学试题卷(含答案解析)
- 危重病人观察和护理要点
- GB/T 45719-2025半导体器件金属氧化物半导体(MOS)晶体管的热载流子试验
- 宝妈日常心理护理
- 2025年社会学概论测试题含答案(附解析)
- 2025-2030年环境工程产业深度调研及发展趋势与投资战略研究报告
- 2025年事业单位公开招聘考试(E类)《综合应用能力西医临床》试卷真题及完整解析
- 保险公司保单管理制度
- 2025年中国AI翻译行业市场全景分析及前景机遇研判报告
- 2025-2030中国酶联免疫吸附测定(ELISA)行业市场发展趋势与前景展望战略研究报告
- 2025年内蒙古众达人力资源公司招聘题库带答案分析
评论
0/150
提交评论