第4章 结构化设计方法
- 格式:doc
- 大小:183.00 KB
- 文档页数:11
第1章软件与软件工程的概念1、1 举出您所知道的应用软件的例子。
办公软件、游戏软件、财务软件、银行软件、人事管理软件、工资管理软件、学籍管理软件等。
1、2 认为“软件就就是程序,软件开发就就是编程序。
”这种观点就是否正确?为什么?认为“软件就就是程序,软件开发就就是编程序。
”这种观点就是错误的。
首先,软件就是计算机系统中与硬件相互依存的另一部分,它就是包括程序,数据及其相关文档的完整集合,程序只就是软件的组成部分之一;其次,在软件开发中,编程只就是软件开发过程的一个阶段。
1、3 如果将软件开发比作高楼大厦的建造,可以将软件的设计比作什么?可以将软件的设计比作建筑设计,软件设计的成果相当于建筑设计的设计图纸。
1、4 什么就是软件危机?它有哪些典型表现?为什么会出现软件危机?软件危机:软件危机就是指在计算机软件的开发与维护过程中所遇到的一系列严重问题。
典型表现:(1)对软件开发成本与进度的估计常常很不准确。
(2)用户对“已完成的”软件系统不满意的现象经常发生。
(3)软件产品的质量往往靠不住。
(4)软件常常就是不可维护的。
(5)软件通常没有适当的文档资料。
(6)软件成本在计算机系统总成本中所占的比例逐年上升。
(7)软件开发生产率提高的速度,既跟不上硬件的发展速度,也远远跟不上计算机应用迅速普及深入的趋势。
产生软件危机的原因:除了软件本身的特点,其原因主要有以下几个方面:(1) 缺乏软件开发的经验与有关软件开发数据的积累,使得开发工作计划很难制定。
(2) 软件人员与用户的交流存在障碍,使得获取的需求不充分或存在错误。
(3) 软件开发过程不规范。
如,没有真正了解用户的需求就开始编程序。
(4) 随着软件规模的增大,其复杂性往往会呈指数级升高。
需要很多人分工协作,不仅涉及技术问题,更重要的就是必须有科学严格的管理。
(5) 缺少有效的软件评测手段,提交给用户的软件的质量不能完全保证。
1、5 什么就是软件工程?软件工程就是指导计算机软件开发与维护的工程学科。
第四章结构化程序设计的三种结构4.1 顺序结构程序设计一、结构化程序设计的程序结构顺序结构、分支结构/选择结构、循环结构二、C语言语句1、9种控制语句2、表达式语句3、特殊语句三、格式化输出--printf()函数printf()函数的作用:向计算机系统默认的输出设备(一般指终端或显示器)输出一个或多个任意类型的数据。
printf()函数的一般格式printf("格式字符串" [,输出项表]);1、"格式字符串"也称"转换控制字符串",可以包含三种字符(1)格式指示符。
格式指示符的一般形式如下:%[标志][宽度][.精度][F|N|h|L][类型]常用的标志字符如表3-1所示,常用的宽度指示符如表3-2所示,常用的精度指示符如表3-3所示,长度修饰符如表3-4所示,类型转换字符如表3-5所示。
(2)转义字符'\n'就是转义字符,输出时产生一个"换行"操作。
转义字符通常起控制作用(3)普通字符──除格式指示符和转义字符之外的其它字符。
格式字符串中的普通字符,原样输出。
例如printf("radius=%f\n", radius);语句中的"radius="是普通字符。
2.输出项表输出项表是可选的。
如果要输出的数据不止1个,相邻2个之间用逗号分开。
下面的printf()函数都是合法的:(1)printf("I am a student.\n");(2)printf("%d",3+2);(3)printf("a=%f b=%5d\n", a, a+3);必须强调:"格式字符串"中的格式指示符,必须与"输出项表"中、输出项的数据类型一致,否则会引起输出错误3、格式指示符输出不同类型的数据,要使用不同的类型转换字符。
第4章结构化设计方法4.1 当你“编写”程序时你设计软件吗?软件设计和编码有什么不同吗?在“编写”程序时并没有设计软件。
软件设计包括概要设计和详细设计,编码是将详细设计中的过程描述转换成用程序设计语言来描述。
4.2 举出3个数据抽象的例子和可以用来操作这些数据抽象的过程抽象的一个例子。
抽象是忽略事物的细节,获取其本质特征的过程。
抽象是一种重要的机制,使人们能够对复杂系统能够很好地理解、交流和推理。
在软件领域,可以将抽象分为两类,即数据抽象和过程抽象。
在传统的结构化程序设计语言中,就提供了这两种抽象机制。
(1) 数据抽象:在所有的结构化程序设计语言中,用户都可以自定义抽象数据类型。
如定义抽象数据类型Student(学生)、Course(课程)、ClassScoreList(班级成绩单)。
(2) 过程抽象:过程抽象也称为是基于方法的抽象。
过程抽象使我们关心处理过程的名字和它能做什么,而无需知道如何完成所有实现细节。
如求班级总平均分average(ClassScoreList)就是一个过程抽象。
在面向对象的程序设计语言中,抽象与封装的概念密切相关,数据抽象和相关的过程抽象被封装在类中,不同类中相似的过程抽象(方法)又可以进一步抽象,放在接口中。
封装是保证事物有明确内外界限的机制。
内部是受保护的,与外部事物相隔离。
4.3 应在什么时候把模块设计实现为单块集成软件?如何实现?性能是实现单块集成软件的唯一理由吗?由于模块之间的调用降低了系统的运行速度,可能会导致满足不了用户的性能要求,这时就需要将软件设计为单块集成软件。
但是在设计时,最好按照模块化的原则进行设计,只是没有显式的模块定义而已。
这样的程序也具有模块化的优点。
性能是实现单块集成软件的唯一理由。
4.4 是否存在一种情况:复杂问题需要较少的工作去解决?这样的情况对模块化观点有什么影响?通过对复杂的问题进行合理分解,分解为若干个相对简单及独立的子问题,就可以用较少的工作去解决。
第4章结构化设计方法4.1 当你“编写”程序时你设计软件吗?软件设计和编码有什么不同吗?在“编写”程序时并没有设计软件。
软件设计包括概要设计和详细设计,编码是将详细设计中的过程描述转换成用程序设计语言来描述。
4.2 举出3个数据抽象的例子和可以用来操作这些数据抽象的过程抽象的一个例子。
抽象是忽略事物的细节,获取其本质特征的过程。
抽象是一种重要的机制,使人们能够对复杂系统能够很好地理解、交流和推理。
在软件领域,可以将抽象分为两类,即数据抽象和过程抽象。
在传统的结构化程序设计语言中,就提供了这两种抽象机制。
(1) 数据抽象:在所有的结构化程序设计语言中,用户都可以自定义抽象数据类型。
如定义抽象数据类型Student(学生)、Course(课程)、ClassScoreList(班级成绩单)。
(2) 过程抽象:过程抽象也称为是基于方法的抽象。
过程抽象使我们关心处理过程的名字和它能做什么,而无需知道如何完成所有实现细节。
如求班级总平均分average(ClassScoreList)就是一个过程抽象。
在面向对象的程序设计语言中,抽象与封装的概念密切相关,数据抽象和相关的过程抽象被封装在类中,不同类中相似的过程抽象(方法)又可以进一步抽象,放在接口中。
封装是保证事物有明确内外界限的机制。
内部是受保护的,与外部事物相隔离。
4.3 应在什么时候把模块设计实现为单块集成软件?如何实现?性能是实现单块集成软件的唯一理由吗?由于模块之间的调用降低了系统的运行速度,可能会导致满足不了用户的性能要求,这时就需要将软件设计为单块集成软件。
但是在设计时,最好按照模块化的原则进行设计,只是没有显式的模块定义而已。
这样的程序也具有模块化的优点。
性能是实现单块集成软件的唯一理由。
4.4 是否存在一种情况:复杂问题需要较少的工作去解决?这样的情况对模块化观点有什么影响?通过对复杂的问题进行合理分解,分解为若干个相对简单及独立的子问题,就可以用较少的工作去解决。
这种情况能够较好地支持模块化的观点,每个子问题用单独的模块去解决,模块之间应该是高内聚、低耦合的,这样才能减少工作量,否则,虽然每个模块的工作简单了,但模块之间的联系很复杂,也增加了问题解决的难度和工作量。
4.5 使用数据流程图和处理叙述,描述一个具有明显事务流特性的计算机系统。
使用本章所介绍的技术定义数据流的边界,并将DFD 映射成软件结构。
略。
4.6 一些设计人员认为所有的数据流都可以当做是变换流。
试讨论当事务流被当成变换流时,会对导出的软件体系结构有什么影响。
请使用例子来说明要点。
当事务流被当成变换流时,首先按变换流导出软件结构,之后再将位于中间的“变换模块”替换成事物中心。
所不同的是,其输入数据不是来自下属的输入模块,而是从最顶层的主控模块传入的,输出数据也是传给主控模块,之后再由主控模块传给输出模块。
这样会增加模块层次及数据的传送次数。
例如,对于下面的事务型数据流,如果按照事务型数据流进行处理,得到的初始模块结构如右图所示。
事务型数据流 按事务型得到的软件结构 如果按变换型处理,得到的初始结构图如下图所示。
初始结构图 再对中间部分进一步分解,得到下面的结构图。
第4章 习题与思考题参考答案3如果想缩短数据传递的路径,就需要对上图进行改进,可以将“调度”模块合到“事务中心”模块中。
4.7 什么是持久的数据源?对于应用系统来说,持久的数据源是指应用系统关闭再重新启动后,关闭之前的数据依然存在。
这些数据一般要存储在文件或数据库中。
4.8 用面向数据流的方法设计第3章习题3.4所描述的银行存款业务的软件结构,并使用改进方法对模块结构进行精化。
(1) 对第3章习题3.4给出的数据流图进行精化,确定其边界,如下图所示。
(2) 对上图按事务型数据流进行处理,完成第一级分解,得到顶层和一层模块结构图。
第一级分解后的结构图(3) 完成第二级分解。
对上图所示的“输入数据”、“输出数据”和“调度”模块进行分解,得到未经精化的输入结构、输出结构和事务结构。
未经精化的输入结构未经精化的输出结构第4章习题与思考题参考答案未经精化的事务结构将上面的三部分合在一起,得到初始的软件结构,如下图所示。
初始软件结构图(4) 对软件结构进行精化。
1) 由于调度模块下只有两种事务,因此,可以将调度模块合并到上级模块中,如图所示。
将调度模块合并到上级模块后的软件结构2) “记录密码”模块的作用范围不在其控制范围之内(即“输入密码”模块不在“记录密码”模块的控制范围之内),需对其进行调整,如图所示。
3) 提高模块独立性,对模块结构进行调整,如下图所示。
调整后的模块结构图4.9 将大的软件划分成模块有什么好处?是不是模块划分得越小越好?划分模块的依据是什么?将大的软件划分成独立命名且可独立访问的模块,不同的模块通常具有不同的功能或职责。
这种方法有利于将复杂的问题简单化,是分而治之策略的具体表现。
尽管模块分解可以简化要解决的问题,但模块分解并不是越小越好。
当模块数目增加时,每个模块的规模将减小,开发单个模块的成本确实减少了;但是,随着模块数目增加,模块之间关系的复杂程度也会增加,设计模块间接口所需要的工作量也将增加。
划分模块的依据是,模块只具有单一的功能且与其他模块没有太多的联系。
4.10 什么叫“自顶向下、逐步细化”?自顶向下、逐步细化的设计过程,主要包括两个方面:一是将复杂问题的解法分解和细化成由若干个模块组成的层次结构;二是将每个模块的功能逐步分解细化为一系列的处理。
在处理较大的复杂任务时,常采取“模块化”的方法,即在程序设计时不是将全部内容都放在同一个模块中,而是分成若干个模块,每个模块实现一个功能。
划分模块的过程可以使用自顶向下的方法实现。
模块分解完成后,下一步的任务就是将每个模块的功能逐步分解细化为一系列的处理。
这个过程是对问题求解,并由抽象逐步具体化的过程。
使用这种方法便于检查程序的正确性。
在每一步细化之前,应仔细检查当前的设计是否正确。
如果每一步细化、设计都没有问题,则整个程序的算法是正确的。
由于每一次向下细化都不太复杂,因此容易保证整个算法的正确性。
第4章 习题与思考题参考答案74.11 结构化程序设计禁止使用goto 语句吗?如果程序中使用了goto 语句,是否就可以断定它是非结构化的?结构化程序设计并不禁止使用goto 语句。
如果程序中使用了goto 语句,并不能断定它是非结构化的。
4.12 对于给定的算法,如何判断它是否是结构化的?对于给定的算法,如果符合以下三条原则,就可以判断它是结构化的。
(1) 使用语言中的顺序、选择、重复等有限的基本控制结构表示程序逻辑。
(2) 选用的控制结构只准许有一个入口和一个出口。
(3) 程序语句组成容易识别的块(Block ),每块只有一个入口和一个出口。
4.13 对于图4-49所示的流程图,试分别用N-S 图和PAD 表示之。
图4-49 流程图对应的N-S 图如下:对应的PAD 如下:4.14 图4-50所示的流程图完成的功能是使用二分查找方法在table 数组中找出值为item 的数是否存在。
(1) 判断此算法是否是结构化的,说明理由。
(2) 若算法是非结构化的,设计一个等价的结构化算法,并用N-S 图表示。
图4-50 二分查找算法的流程图(1) 不是结构化的,最上面的循环有两个出口,最下面的分支有三个入口。
第4章习题与思考题参考答案(2) 等价的结构化算法如下:或者9或者4.15 使用自顶向下、逐步细化方法设计算法,完成下列任务:产生一个10⨯10的二维随机整数方阵,先求出每一行的最大值和每一列的最小值;然后求10个最大值中的最小者,10个最小值中的最大者;最后求这两个数之差的平方。
(1) 首先写出下面的程序框架:main (){定义10⨯10的二维整数数组A,长度为10的一维数组B, C;建立10⨯10的二维随机整数数组A;- - - - - - -- -- - - - - - - - - - - - 1求A中每一行的最大值→数组B;- - - - - - - - -- - - - - - - - - - - - 2求A中每一列的最小值→数组C;- - - - - - - - -- - - - - - - - - - - - 3求数组B中的最小值→minOfB; - - - - - - - - -- - - - - - - - - - - - 4求数组C中的最大值→maxOfC; - - - - - - - - -- - - - - - - - - - - - 5(minOfB- maxOfC)^2 →result;}(2) 对后面加标记的部分进行细化main (){定义10⨯10的二维整数数组A,长度为10的一维数组B, C;/*建立10⨯10的二维随机整数数组A*/ - - - - - -- -- - - - - - - - - - - - 1for (i=0; i<=9; i++)for (j=0; j<=9; j++)产生随机整数→ A[i,j];/*求A中每一行的最大值→数组B*/ - - - - - - - - -- - - - - - - - - - - - 2for (i=0; i<=9; i++) {求数组A第i行的最大值→B[i]; --------------------------------------2.1}/*求A中每一列的最小值→数组C*/ - - - - - - - - -- - - - - - - - - - - - 3for (j=0; j<=9; j++) {求数组A第j列的最小值→C[j]; --------------------------------------3.1}第4章习题与思考题参考答案/*求数组B中的最小值→minOfB*/ - - - - - - - - -- - - - - - - - - - - - 4minOfB = B[0];for (i=1; i<=9; i++) {if (minOfB < B[i]) {minOfB = B[i];}}/*求数组C中的最大值→maxOfC*/ - - - - - - - - -- - - - - - - - - - - - 5maxOfC = C[0];for ( i=1; i<=9; i++) {if (maxOfC>C[i]) {maxOfC = C[i];}}(minOfB- maxOfC)^2 →result;}(3) 下一步可以继续对2.1和3.1进行细化。
具体略。
4.16 设计算法完成下列任务:输入一段英文后,无论输入的文字都是大写,还是小写,或大小写任意混合,都能将其整理成除每个句子开头字母是大写外,其他都是小写的文字。