第5章模块化程序设计.ppt
《第5章模块化程序设计.ppt》由会员分享,可在线阅读,更多相关《第5章模块化程序设计.ppt(66页珍藏版)》请在课桌文档上搜索。
1、第5章 模块化程序设计,2,解析C程序设计第5章 模块化程序设计,2023/3/30,本章内容,模块化程序设计思想 函数的嵌套调用,函数的递归调用,3,解析C程序设计第5章 模块化程序设计,2023/3/30,5.1 怎样解决一个复杂的问题,怎样来分析和完成“高校信息管理系统”呢?一个大系统(或子系统)不可能用一个主函数来完成,必须将大问题分解成小问题,再由若干人、若干函数(模块)来完成。,4,解析C程序设计第5章 模块化程序设计,2023/3/30,高校信息管理系统功能分解,5,解析C程序设计第5章 模块化程序设计,2023/3/30,模块化程序设计思想,为了完成上述大型系统的开发,我们将软
2、件开发看成是一项工程来做,其过程大致分为:系统定义、需求分析、系统设计、编写程序、系统测试、系统维护等阶段。软件工程的思想:将一个大的系统采取“分而治之”方法解决。,6,解析C程序设计第5章 模块化程序设计,2023/3/30,模块化程序设计思想,开发一个软件系统时,最好的办法是从编写主程序开始,在主程序中,将问题作为一个整体考虑,然后找出完成整个任务的主要步骤,再沿着这条主线将整个问题继续分解为独立的模块。这种“自顶向下、逐步细化”的思想就是模块化程序设计的主要思想。,7,解析C程序设计第5章 模块化程序设计,2023/3/30,为什么需要模块化程序设计,什么时候需要模块化?某一功能,如果重
3、复实现2遍及其以上,即应考虑模块 化,将它写成通用函数,并向小组成员发布。要尽可能利用其它人的现成模块。模块化程序设计方法就是按照“自顶向下、逐步求精”的思想,将系统功能逐步细分,使每个功能非常单一,一般不超过50行。,8,解析C程序设计第5章 模块化程序设计,2023/3/30,模块化程序设计方法,功能分解自顶向下、逐步求精的过程模块分解的原则保证模块的相对独立性高聚合、低耦合模块的实现细节对外不可见外部:关心做什么内部:关心怎么做设计好模块接口接口是指罗列出一个模块的所有的与外部打交道的变量等 定义好后不要轻易改动在模块开头(文件的开头)进行函数声明,9,解析C程序设计第5章 模块化程序设
4、计,2023/3/30,模块化程序设计方法的基本原则,模块化程序设计方法的基本原则是:高聚合、低耦合及信息隐藏。高聚合是指一个模块只能完成单一的功能,不能“身兼数职”,在描述功能时不能出现“和”、“与”等连词。低耦合是指模块之间参数传递尽量少,还不能通过全局变量来实现数据传递。信息隐藏是指把不需要调用者知道的信息都包装在模块内部隐藏起来。只有实现了高聚合、低耦合,才可能最大程度的实现信息隐藏,从而实现真正意义上的模块化程序设计。,10,解析C程序设计第5章 模块化程序设计,2023/3/30,模块化程序设计的优点,每个模块都可以分配给不同的程序员完成,从而缩短开发周期。各个模块高聚合、模块之间
5、低耦合,只要模块之间确定了参数传递的接口,不管哪个模块内部的改动,均不会影响其它模块,从而使软件产品的生产更加灵活。系统细化到模块,条理清楚,系统更加容易理解和实现。容易维护、系统可靠。模块化程序设计的特点是:各模块相对独立、功能单一、结构清晰、接口简单;避免程序开发的重复劳动;易于维护和功能扩充;程序设计的复杂性得到了有效控制等。,11,解析C程序设计第5章 模块化程序设计,2023/3/30,C程序结构,C语言是模块化程序设计语言,每个模块都是由函数完成的,C语言是函数式的语言,函数就是模块。使用顺序结构、分支结构、循环结构三种基本结构设计的程序必然就是结构化程序。,12,解析C程序设计第
6、5章 模块化程序设计,2023/3/30,函数设计的原则,函数的功能要单一,不要设计多用途的函数 函数的规模要小,尽量控制在50行代码以内1986年IBM在OS/360的研究结果:大多数有错误的函数都大于500行1991年对148,000行代码的研究表明:小于143行的函数比更长的函数更容易维护参数和返回值的规则参数要书写完整,不要省略对函数的入口参数进行有效性检查没有参数和返回值时,用void填充每个函数只有一个入口和一个出口,尽量不使用全局变量尽量少用静态局部变量,以避免函数具有“记忆”功能,13,解析C程序设计第5章 模块化程序设计,2023/3/30,C语言中的函数与模块,在C语言中,
7、每个模块都是由函数完成的。一个小模块就是一个函数。在程序设计中,常将一些常用的功能模块编写成函数,放在函数库中供公共选用。程序员要善于利用库函数,以减少重复编写程序段的工作量。在编写某个函数时,遇到具有相对独立的功能的程序段,都应独立成另一个函数,而在一个函数中调用另一个函数;当某一个函数拥有较多的代码时(一般函数代码50行左右),也应将函数中相对独立的代码分成另一个函数。C语言就是模块化程序设计语言。,14,解析C程序设计第5章 模块化程序设计,2023/3/30,简化的模块化问题,实现前面“高校信息管理系统”,需要用到模块化程序设计、函数的定义、声明、调用(嵌套调用)、返回等,还需要用到数
8、组、指针、结构体、文件等知识,这些知识将在后续章节逐一介绍。这里另外提出一个稍微简单一点的问题,以便在本节中实现。,15,解析C程序设计第5章 模块化程序设计,2023/3/30,提出问题,例5-1:求三个数中最大数和最小数的差值。,16,解析C程序设计第5章 模块化程序设计,2023/3/30,【分析】,主函数可以调用其他函数,反之,不然。自定义函数之间能否调用呢?能。函数不能嵌套定义,但是函数能嵌套调用,即函数调用函数,前者称为调用函数,后者称为被调函数。这里可以定义3个函数:最大值、最小值、最大值与最小值的差,第三个函数将调用前两个函数。,17,解析C程序设计第5章 模块化程序设计,20
9、23/3/30,函数的嵌套调用,18,解析C程序设计第5章 模块化程序设计,2023/3/30,例5-1问题的实现,/*LI5_1.c*/#include int dif(int x,int y,int z);int max(int x,int y,int z);int min(int x,int y,int z);void main()int a,b,c,d;printf(Input Data:);scanf(%d%d%d,/*定义dif函数求三数的差值*/int dif(int x,int y,int z)int m1,m2;m1=max(x,y,z);m2=min(x,y,z);retu
10、rn m1-m2;/*定义max函数求三数的最大值*/int max(int x,int y,int z)int r1,r2;r1=(xy)?x:y;r2=(r1z)?r1:z;return(r2);/*定义min函数求三数的最小值*/int min(int x,int y,int z)int r;r=(xy)?x:y;return(rz?r:z);,19,解析C程序设计第5章 模块化程序设计,2023/3/30,课堂练习,用函数的嵌套调用方法计算:,20,解析C程序设计第5章 模块化程序设计,2023/3/30,举一反三,例5-2 用弦截法求方程的根,【分析】弦截法求方程的根的方法如下:取两
11、个不同点x1、x2,如果f(x1)与f(x2)符号相反,则(x1,x2)区间内必有一个根。否则改变x1、x2的值使得f(x1)与f(x2)异号为止。(注意:x1与x2的值不能相差太大,确保之间只有一个根)连接f(x1)与f(x2)两点,此线(即弦)交x轴于x点(计算见图)。再求出f(x)。若f(x)与f(x1)同号,则将x作为新的x1。若f(x)与f(x2)同号,则将x作为新的x2。重复第与第步,直到|f(x)|,其中是一个很小的正数,如0.0001,此时可以认为:f(x)0。,21,解析C程序设计第5章 模块化程序设计,2023/3/30,弦截法N-S图及程序,#include#includ
12、e float f(float x);float xpoint(float x1,float x2);float root(float x1,float x2);void main()float x1,x2,f1,f2,x;/*输入x1和x2并保证其 函数值反号*/do printf(Input x1,x2:n);scanf(%f,%f,22,解析C程序设计第5章 模块化程序设计,2023/3/30,弦截法求根程序,/*定义f函数,求f(x)的值*/float f(float x)float y;/*计算f(x)的值*/y=(x-5.0)*x+16.0)*x-80.0;return(y);/*
13、定义xpoint函数,求弦与x轴的交点*/float xpoint(float x1,float x2)float x;x=(x1*f(x2)-x2*f(x1)/(f(x2)-f(x1);return(x);,/*定义root函数,求近似根*/float root(float x1,float x2)float x,y,y1;y1=f(x1);do x=xpoint(x1,x2);y=f(x);/*新的f(x)与f(x1)同号时,用x替换x1,否则替换x2*/if(y*y10)y1=y;x1=x;else x2=x;while(fabs(y)=0.0001);/*当f(x)约等于0时退出循环*
14、/return(x);,23,解析C程序设计第5章 模块化程序设计,2023/3/30,函数调用关系,24,解析C程序设计第5章 模块化程序设计,2023/3/30,例5-3,求,的值。,【分析】从表达式中可以看出,每项都是一样的,不同的是起止数不同,因此每项的计算可以由一个相同的函数来完成。而每项中还有一个阶乘,因此还需要一个求阶乘的函数。,25,解析C程序设计第5章 模块化程序设计,2023/3/30,例5-3程序,#include/*求n的阶乘函数*/double fac(int n)double s=n;if(n=1)return 1;/*小于1的数的阶乘都返回1*/for(;-n;)
15、/*先将n值减1,再判断n值是否为非0(真)*/s*=n;/*计算阶乘s=s*n,计算的是:s=n*(n-1)*2*1*/return s;/*返回n!值*/*求项的值:n1和n2为起止数*/double sum(int n1,int n2)int i;double s=0;for(i=n1;i=n2;i+)s=s+1/fac(i);return s;,void main()double s;s=sum(1,3)+sum(6,9)+sum(12,15);printf(ns=%f,s);getch();/*暂停,按任意键继续*/,26,解析C程序设计第5章 模块化程序设计,2023/3/30,例
16、5-3函数调用关系,27,解析C程序设计第5章 模块化程序设计,2023/3/30,思考题,求n!可以使用123n形式。进一步思考:n!可以写成(n-1)!n,其中用到了(n-1)!的值。那么,能不能在求n!时调用自身函数求(n-1)!,只是改变参数值?以此类推。答:可以使用递归方式完成。,28,解析C程序设计第5章 模块化程序设计,2023/3/30,例5-5 用递归方法求n!,【分析】求n!除了可以使用例5-5递推方法外(即:123n),还可以使用递归方法。递推是用一个值推出另一个值,递归是通过函数的自身调用来推导结果。如计算5!可以用5!54!;4!43!;3!32!;2!21!;1!1
17、。其递归公式如下:,29,解析C程序设计第5章 模块化程序设计,2023/3/30,递归算法的执行过程分回推和递推两个阶段:在回推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解;在递推阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解。计算5!其递归过程中的“回推”和“递推”,如图5-10所示。,30,解析C程序设计第5章 模块化程序设计,2023/3/30,“回推”和“递推”,31,解析C程序设计第5章 模块化程序设计,2023/3/30,求解过程,对使用递归方法计算4!的结果如下:调用 递归调用 返回第1步 fac(4)fa=4*fac(4
18、-1)=4*fac(3)fa=4*3*2*1第2步 fac(3)fa=3*fac(3-1)=3*fac(2)fa=3*2*1第3步 fac(2)fa=2*fac(2-1)=2*fac(1)fa=2*1第4步 fac(1)fa=fac(1)=1,回推,递推,回推过程:计算fac(4)时要知道fac(3),计算fac(3)时要知道fac(2),计算fac(2)时要知道fac(1),而fac(1)为1。递推过程:知道fac(1)后可算fac(2),从而可算fac(3),最后计算fac(4)。,32,解析C程序设计第5章 模块化程序设计,2023/3/30,例5-5程序,/*LI5_5.c*/#inc
19、lude long fac(int n);void main()int n;long r;/*定义长整型变量存放n的阶乘的值*/printf(Input n:);scanf(%d,/*返回fac的函数值*/,33,解析C程序设计第5章 模块化程序设计,2023/3/30,函数的递归调用,在函数调用中,如果直接或间接地调用该函数本身,称为递归调用。递归有时也称为循环定义。递归又分为:直接递归调用,即函数直接调用自身。和间接调用,即函数互相调用对方。,int f(int x)int y,z;z=f(y);.return(2*z);,34,解析C程序设计第5章 模块化程序设计,2023/3/30,递
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模块化 程序设计
链接地址:https://www.desk33.com/p-259595.html