c语言学习,c语言课件第11章.ppt
《c语言学习,c语言课件第11章.ppt》由会员分享,可在线阅读,更多相关《c语言学习,c语言课件第11章.ppt(44页珍藏版)》请在三一文库上搜索。
1、第11章 C语言的模块化程序设计,Return,本章学习目标 掌握模块化程序设计的基本方法。 掌握全局变量和局部变量、动态变量和静态变量的概念和使用方法。 掌握内部函数和外部函数的概念和使用方法。 掌握由多个源文件组成的C程序设计和编译运行方法。,11.1 程序设计的基本方法 11.2 C语言对模块化编程的支持 11.3 多个源程序文件组成的C程序设计案例分析,11.1 程序设计的基本方法,结构化程序设计方法是随着结构化程序设计语言(如PASCAL、C)的出现和发展而建立起来的,已经被广泛应用于软件系统的开发。 结构化程序设计方法主要包括如下3个方面:1)自顶向下、逐步求精的设计过程。2)模块
2、化程序设计。3)结构化编程。,11.1.1 自顶向下、逐步求精的设计过程 所谓自顶向下、逐步求精的设计过程就是在进行一个复杂系统的设计时采取先全局后局部、先整体后细节、先抽象后具体的分析设计方法,把系统分解为层次分明、结构清晰、容易实现的若干个模块,然后再将每一个模块细化为若干个处理步骤或算法,直到可用程序设计语言的语句来编程实现。,下面用一个简单例子说明这种自顶向下、逐步求精的设计过程。,【例11-1】 设计一个简单的通讯录管理程序。,【思路导航】首先将问题分解成以下7个模块: (1)主控模块 (2)菜单模块 (3)添加模块 (4)删除模块 (5)修改模块 (6)显示模块 (7) 保存模块,
3、然后,对这7个模块再分别进一步细化。,主控模块可细化为: (1)初始化; (2)循环等待用户选择菜单项; (3)根据用户选择菜单项执行相应操作: 若是“添加”,则调用添加模块; 若是“删除”。则调用删除模块; 若是“修改”,则调用修改模块; 若是“显示”,则调用显示模块; 若是“保存”,则调用保存模块; 若是“退出”,则结束程序。,添加模块可细化为: (1)查找 (2)根据查找结果做出相应操作: 若该名字已存在,输出提示信息;若该名字未存在,插入新记录。 删除模块可细化为: (1)查找 (2)根据查找结果做出相应操作: 若该名字不存在,输出提示信息;若该名字存在,删除该记录。,修改模块可细化为
4、: (1)查找 (2)根据查找结果做出相应操作: 若该名字不存在,输出提示信息;若该名字存在,修改该记录。 保存模块可细化为: (1)提示输入文件名; (2)以写方式打开该文件; (3)把数据写入该文件,最后,把各个子模块再细化为具体的C语言语句。请看书中/*exam11_1*/。程序编译运行后的用户界面如图11-1所示。,演示,图11-1,11.1.2 模块化程序设计,1什么是程序模块? 在软件设计过程中,往往将一个大规模的程序划分成若干个大小适当的程序段去编写,或者是将那些重复使用的程序段进行独立设计,以达到计算机可以重复执行,而设计人员又不必重复去编写的目的。这样划分的程序段被称为程序模
5、块。,2什么是模块化程序设计? 模块化程序设计就是遵循一定的模块分解和组织原则,把一个大程序分解为多个容易理解和实现的大小适当、功能明确、具有一定独立性的程序模块的过程。,(1)模块分解原则 在进行模块分解时,要求各模块功能尽可能专一,各模块之间的联系尽可能简单。模块之间的联系越简单,独立性就越强,就越容易独立地进行设计、维护和修改,程序的可维护性和可扩展性就越好,程序设计的效率和质量也就越高。,(2)模块组织原则 结构化程序设计方法要求按层次结构组织各模块。“自顶向下”地将一个大程序逐层分解,得到程序的模块层次结构,而后再进一步把每个模块分解为具体的执行模块或执行步骤。 按层次组织模块时,一
6、般较上层的模块描述“做什么”,最底层的模块才描述“如何做”。,3C语言的模块化技术,(1)C语言的模块化粒度 在C语言中,函数是实现程序模块化的有力工具。一般地,一个函数实现一个模块功能,一个模块(或一个源程序文件)可以由多个函数组成。C语言的模块粒度从小到大依次为:函数源程序文件程序,如图11-1所示。,图11-1,(2)C语言编译系统对模块化的技术支持 C语言编译系统提供了宏定义、文件包含、条件编译等编译预处理命令来实现编译预处理,并且提供了丰富的库函数,为实现模块化编程提供了极大的方便。,(3)C语言对模块化的技术支持 C语言提供函数和局部变量以实现模块的包装和独立性(在第7章已介绍),
7、提供全局变量以实现多个模块之间的数据共享,提供extern声明的全局变量和外部函数以扩展其作用域从而提高模块之间的函数和数据的共享性,提供static声明的全局变量和内部函数以限制其作用域从而提高模块的相对独立性。本章11.2节将重点讨论这些技术的使用。,11.1.3 结构化编程,结构化编程是把任何程序的结构都限制为顺序、选择和循环三种基本结构,以提高程序的可读性和可靠性。 一个结构化程序应当具有以下特点: (1) 有一个入口、一个出口; (2) 没有死语句(永远执行不到的语句), 每一个语句应当至少有一条从入口到出口的路径通过它; (3) 没有死循环(无限制的循环)。 在本书前面的章节已经详
8、细介绍了顺序结构、选择结构和循环结构的程序设计,这里就不再重复。,11.2 C语言对模块化编程的支持,11.2.1 局部变量与全局变量 1. 定义变量的位置 C语言中定义变量的位置基本上有三种:在函数体内、函数体外和函数形式参数。在函数体内定义的变量以及函数的形式参数都称作局部变量,在所有函数体外定义的变量称作全局变量。 2. 局部变量 局部变量只在定义它们的函数内有效,在此函数之外不能使用它们。局部变量还可以在函数内的复合语句中定义,此时局部变量只在定义它们的复合语句中有效。常常把起于左大括号“”,止于右大括号“”内的语句块统称为代码块,所以可以说,局部变量仅在定义它们的代码块中有效。 例如
9、:,fun1() int 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+中则不存在此
10、限制,可以在任意地方定义变量。,例如: fun() int i;i=10; int j;j=20; j变量的定义出现在给i的赋值语句之后,在多数C编译系统中会报告语法错误。应改为: fun() int i;int j; i=10;j=20; ,3. 全局变量 与局部变量不同,全局变量可以自定义位置起被本源文件中的其他所有函数使用,也可以用extern声明后,在由多个文件组成的程序中被其它源文件使用(关于extern的作用在下一节关于变量存储类型中再详细讨论)。,【例11-2】全局变量的作用范围。 代码如下:,/*exam11_2*/ #include int count; /*定义全局变量co
11、unt*/ 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; /*对全局变量temp赋值*/ count=100; /
12、*对全局变量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函数定义了与全局变量同名的局部变量count,所以全局变量count在
13、fun2中被屏蔽,即不起作用,而只使用局部变量count。fun1函数定义了与全局变量同名的局部变量temp,全局变量temp在本函数无效,并且就算fun1函数内没有定义同名的局部变量temp,也不能引用全局变量temp,因为全局变量temp在fun1函数之后才定义(若使用extern声明后扩展了有效范围则可以引用,参考下节关于变量的存储类型讨论)。,说明: (1)使用全局变量的好处 全局变量可以起到在不同函数间进行数据传递的作用,尤其当需要从一个函数返回多于一个的返回值时可以利用全局变量来实现。这是因为在一个函数中改变了全局变量的值,则会影响到所有使用该全局变量的函数。 (2)使用全局变量的
14、坏处 使用全局变量会使函数的通用性变。C语言的一大特点就是支持模块化编程,通过函数和局部变量实现对代码数据的包装,函数之间除了通过参数传递数据外尽量不要有其它任何依赖关系,使得程序的移植性好,可读性强。使用全局变量则使函数之间的依赖变强,降低程序的通用性。,在程序中大量使用全局变量容易引起程序错误,因为各个函数执行时都可能改变全局变量的值,容易产生副作用。 全局变量在程序的整个执行期间占用存储单元,而不像局部变量只在需要时占用存储空间。 鉴于上述原因,建议非不得已时不使用全局变量。,【例11-3】通过全局变量从函数得到多于一个的返回值。 编写一个函数,能够求出一组整数中的最大值和最小值。 【思
15、路导航】因为通过函数的return 语句只能返回一个值,所以把另一个结果赋给一个全局变量,从而达到返回两个结果的目的。,/*exam11_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
16、=%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 变量的存储类型,在C语言中,每一个变量有两个属性:数据类型和数据的存储类型。数据类型是指数据被定义为整形、字符型、实数型等,前面已详细介绍过。存储类型是
17、指数据在内存中的存储方法,分为两大类:静态存储和动态存储。 所谓静态存储是指在程序运行期间分配固定存储空间的方式;动态存储是指根据需要进行存储空间分配,不需要时即释放存储空间的方式。,变量的存储类型具体又分为四种类型,四种类型说明符如下: auto(自动) register(寄存器) static(静态) extern(外部),一般以如下形式对变量进行声明: 存储类型说明符 数据类型 变量名; 如: auto int a,b; static int c=1;,1. auto变量,函数的局部变量,如果不作static存储类型声明,都是动态分配存储空间的;函数的形式参数也是动态分配存储空间的,两者
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 学习 课件 11
链接地址:https://www.31doc.com/p-2142764.html