您好,欢迎访问三七文档
计算机程序设计基础(C语言)第7章C程序的模块化设计计算机程序设计基础(C语言)本章要点–C程序的模块化结构–内部变量、外部变量、静态(static)变量–变量的存储属性–动态存储分配和释放–编译预处理计算机程序设计基础(C语言)7.1C程序的模块化结构7.3变量和函数的存储属性7.4动态存储分配和释放第7章C程序的模块化设计7.2内部变量、外部变量和作用域、生存期7.7本章小结7.5编译预处理7.6综合应用举例计算机程序设计基础(C语言)7.1C程序的模块化结构模块化程序设计方法的思想:将一个较大的程序按功能分割成一些模块,每个模块都是功能单一、结构清晰、接口简单、容易理解的小任务。对每一个处于底层的小任务编写相应的实现函数,然后通过函数调用的方法将多个这样的函数按功能组合成一个较高层的调用函数,多个这样的调用函数又可成为被调函数,并按功能组织成更高层次的调用函数。计算机程序设计基础(C语言)7.1C程序的模块化结构模块化程序设计的基本方法:自顶向下(或自底向上)和逐步求精。C语言的开发工具提供了程序工程开发的能力。•工程由多个源程序文件组成。•每个源程序文件可以单独编译;然后再连接成一个大的可执行文件。•每个源程序文件可以包含一个或多个函数。•一个工程只能有一个main主函数。计算机程序设计基础(C语言)7.1C程序的模块化结构7.1.1概述7.1.2多源文件程序的结构7.1.3分割编译计算机程序设计基础(C语言)7.1C程序的模块化结构7.1.1概述函数是C程序的基本组成单位。C编程就是在main函数中给一些函数安排一个执行顺序,而在这些函数中,又安排了另一些函数的执行顺序。计算机程序设计基础(C语言)7.1C程序的模块化结构7.1.1概述main(){……f1();……f2();……}f1(){…g1()…}f2(){…h1();…h2();…k1()…}g1(){…k1()…}h1(){…}h2(){…}k1(){…}图7.1由若干个函数组成的一个程序计算机程序设计基础(C语言)1.1算法、C语言和程序设计7.1.1概述如何组织这些函数?问题:计算机程序设计基础(C语言)1.1算法、C语言和程序设计7.1.2多源文件程序的结构当一个程序由许多函数构成时,如果所有的函数都放在一个.c程序文件中,势必会造成文件体积庞大,查找函数困难,阅读理解困难,函数取名困难,安排函数的顺序也困难。程序员编程时,往往采用模块化程序设计方法,将一个大的程序分解为功能单一的小模块。计算机程序设计基础(C语言)1.1算法、C语言和程序设计7.1.2多源文件程序的结构将图7.1的所有函数组织在三个程序文件file1.c、file2.c和file3.c中。/*file1.c*/externvoidf1();externvoidf2();voidmain(){…f1();…f2();……}/*file2.c*/voidg1();voidk1();voidf1(){…g1();…}voidg1(){…k1();…}voidk1(){…}/*file3.c*/voidh1();voidh2();externvoidk1();voidf2(){…h1();…h2();…k1();…}voidh1(){……}voidh2(){……}计算机程序设计基础(C语言)7.1C程序的模块化结构7.1.3分割编译编译是以源文件为单位进行的。在编译该程序时,可以以源文件为单位分别进行编译,相应产生目标文件,然后再用连接程序将分别编译产生的多个目标文件连接成一个可执行文件,这样的过程称为分割编译。计算机程序设计基础(C语言)7.1C程序的模块化结构7.1.3分割编译编写多源文件程序的步骤基本:编译:必须对程序中的每个源程序文件单独进行编译,编译通过后生成相应的文件名同源程序文件名,扩展名为.obj的目标程序文件。由于有多个源程序文件,因此有多个目标程序文件。连接:连接器把上一步生成的多个目标程序文件和系统的库函数代码结合在一起生成扩展名为.exe的可执行程序文件。运行:运行生成后的可执行文件。计算机程序设计基础(C语言)7.2内部变量、外部变量和作用域、生存期7.2.1内部变量、外部变量7.2.2静态(static)变量7.2.3作用域及生存期计算机程序设计基础(C语言)7.2内部变量、外部变量和作用域、生存期7.2.1内部变量、外部变量1.内部变量:也称局部变量,即在函数内部定义的变量。以下变量都是内部变量:在函数内部定义的变量,其作用范围只在该函数内部。函数定义时的形参,其作用范围只在该函数内部。在复合语句中定义的变量,其作用范围只在该复合语句内。计算机程序设计基础(C语言)7.2内部变量、外部变量和作用域、生存期7.2.1内部变量、外部变量内部变量的特点:块作用域:所有内部变量的作用域都是局部的,称为程序块作用域。自动生存期:局部变量具有自动存储期限。当调用函数时,“自动”分配局部变量的存储单元,当函数返回时释放变量所在存储空间。注意:当再次调用函数时,无法保证变量始终保留原来的值。计算机程序设计基础(C语言)7.2内部变量、外部变量和作用域、生存期7.2.1内部变量、外部变量讨论下面程序的内部变量及其特点:voidmain(){inta,b;intx[10],y[10];…if(ab){intt;t=a;a=b;b=t;}Fun(x);…}voidFun(intx[]){inta,b;…}计算机程序设计基础(C语言)7.2内部变量、外部变量和作用域、生存期7.2.1内部变量、外部变量2.外部变量:也称全局变量,在任何函数之外定义的变量。其特点如下:全局生存期:一直占据所分配的存储空间直至整个程序(工程)运行结束。文件作用域:从变量定义点开始到整个源程序结束处,跟在外部变量声明后的所有函数都可以访问它。还可以通过extern存储类型说明,把作用域扩大到该源程序文件外部变量声明之前的函数或者该工程的其它源程序文件中。计算机程序设计基础(C语言)7.2内部变量、外部变量和作用域、生存期7.2.1内部变量、外部变量分析下列程序不同位置上的变量n及其特点:intn=5;voidfun(void);voidmain(){printf(“1.main:n=%d\n”,n);fun();printf(“2.main:n=%d\n”,n);}voidfun(void){n=10;printf(“3.fun:n=%d\n”,n);}计算机程序设计基础(C语言)7.2内部变量、外部变量和作用域、生存期7.2.1内部变量、外部变量外部变量的作用:可以在不同的函数中传递数据。如例7.3可以在不同的源程序文件中传递数据,扩大其作用范围。如例7.4计算机程序设计基础(C语言)7.2内部变量、外部变量和作用域、生存期7.2.1内部变量、外部变量外部变量可以在不同的函数中传递数据:例7.3输入n×m的矩阵,将其转置后输出。下面给出实现的所有函数的说明:input():实现矩阵数据的输入。transpose():实现矩阵的转置。print():实现矩阵的输出。由于以上这些函数都用到矩阵数据,而函数不能返回数组,因此,可以将矩阵说明为外部变量。计算机程序设计基础(C语言)7.2内部变量、外部变量和作用域、生存期7.2.1内部变量、外部变量外部变量可以可以在不同的源程序文件中传递数据,扩大其作用范围。如例7.4。当一个程序分成几个源文件来实现时,可以在不同源文件中传递全局变量,但必须有一处是定义外部变量的,而其它源程序文件必须对该外部变量进行声明,称为外部变量的声明。外部变量的声明格式:extern数据类型变量名;注意:全局变量只能定义一次,可多次用extern声明以扩大作用域。计算机程序设计基础(C语言)7.2内部变量、外部变量和作用域、生存期7.2.1内部变量、外部变量外部变量与内部变量可以同名时,内部变量的优先级高于外部变量。例7.5分析下列程序的运行结果。#includestdio.hintn=5;intmain(){intn=50;printf(“main:n=%d\n”,n);fun();}voidfun(void){printf(“fun:n=%d\n”,n);}计算机程序设计基础(C语言)7.2内部变量、外部变量和作用域、生存期7.2.1内部变量、外部变量3.外部变量的利与弊在多个函数共享一个变量或者少数几个函数共享大量变量时,外部变量很有用。然而,外部变量破坏了函数的独立性。独立性是重用代码的起码条件,只有完全不存在外部变量的函数才有独立性,因此,尽量少用外部变量,可以通过形式参数在函数之间传递数据的方法消除外部变量。例7.6消去例7.3的外部变量,改成形式参数传递来实现。计算机程序设计基础(C语言)7.2内部变量、外部变量和作用域、生存期7.2.2静态(static)变量在模块化程序设计中,为了发挥程序的模块作用,有必要引入一种模块内的全局变量,它区别于前面介绍的局部变量和全局变量。这种变量具有全局寿命和局部可见性的特点;且默认初始化的值为0。计算机程序设计基础(C语言)7.2内部变量、外部变量和作用域、生存期7.2.2静态(static)变量静态变量的定义格式如下:static数据类型变量名表;例如,staticintx,y;注意静态全局变量和静态局部变量之分。计算机程序设计基础(C语言)7.2内部变量、外部变量和作用域、生存期7.2.2静态(static)变量1.静态全局变量:在所有函数之外定义的静态变量。特点:只在定义的文件范围内可见,在其他程序文件中不可见。例7.7分析下列程序,由两个源程序文件组成:/*test.c*/#includestdio.hexternvoidf1();externvoidf2();voidmain(){f1();f2();f1();f2();}/*test1.c*/#includestdio.hstaticinti;voidf1(void){printf(“f1:i=%d\n”,++i);}voidf2(void){printf(“f2:i=%d\n”,++i);}计算机程序设计基础(C语言)7.2内部变量、外部变量和作用域、生存期7.2.2静态(static)变量2.静态局部变量:在函数内部定义的静态变量。特点:它只在定义它的函数内部可见;在整个程序运行期间一直占据其所在的存储空间。计算机程序设计基础(C语言)7.2内部变量、外部变量和作用域、生存期7.2.2静态(static)变量例7.8分析下列程序,注意全局变量、静态局部变量和局部变量的区别。#includestdio.hvoidf1();intn=1;voidmain(){inta=0,b=-10;printf(“main:a=%d,b=%d,n=%d\n”,a,b,n);f1();printf(“main:a=%d,b=%d,n=%d\n”,a,b,n);f1();}voidf1(){staticinta=2;intb=5;a+=2,b+=5;n+=12;printf(“f1:a=%d,b=%d,n=%d\n”,a,b,n);}运行结果如下:main:a=0,b=-10,n=1f1:a=4,b=10,n=13main:a=0,b=-10,n=13f1:a=6,b=10,n=25计算机程序设计基础(C语言)7.2内部变量、外部变量和作用域、生存期7.2.3作用域及生存期作用域:通常把变量的有效使用范围称为作用域生存期:变量的存在时间称为生存期(存储期)。计算机程序设计基础(C语言)7.2内部变量、外部变量和作用域、生存期7.2.3作用域及生存期1.作用域:作用域规则主要是针对程序文件来说的,即作用域是一个变量在程序文件中的有效区域。C语言的作用域有2种:块作用域:–块中定义的变量:其作用域起于定义它的位置,止于块的结束,常见于复合语句中定义的变量;–函数内部定义的变量:其作用域从定义处开始一直到该函数结束;–函数的形参:其所在的整个函数内都有效。文件作
本文标题:C程序的模块化设计
链接地址:https://www.777doc.com/doc-5723543 .html