第四章 结构化设计
第一节 软件设计在开发阶段中的任务和地位
第二节 软件设计的概念和原则
第三节 结构化设计
第四节 人机界面设计
第五节 详细设计
第六节 面向数据结构的设计方法
在软件需求分析阶段确定了要让所开发的软
件 ? 做什么 ? 的问题,接下来就是实现软件的需
求,解决 ? 怎样做 ? 的问题。软件设计就是处理
? 怎样做 ? 的问题,它被定义为 ? 应用各种技术
和原理,对设备、过程或系统作出足够详细的描
述,使之能够在物理上的以实现 ? 。
第一节 软件设计在开发阶段中的任务和地位
开发阶段由设计、编码和测试三个互相关
联的基本活动组成,每个活动都按照某种方式
进行信息变换。软件设计是开发活动的第一步,
需求规格说明书中对将要实现系统的信息、功
能和行为方面的需求描述构成了软件设计的基
础。
从工程管理的角度看来,软件设计可划分
为 概要设计 和 详细设计 两个阶段。
首先做概要设计,将需求转化为软件系统
结构和数据结构。
然后详细设计,即过程设计
? 软件结构设计
? 数据设计
? 过程 (算法 )设计
? 一个独立的界面设计活动。
软件设计包括
软件结构设计 是确定软件系统各主要部件之
间的关系。
数据设计 是把信息描述转换为实现软件系统
所要求的数据结构。
过程 (算法 )设计 是把结构部件转换成软件系
统的过程性描述。
编码 是根据这种过程性描述编制代码。
然后把生成的程序代码交由测试人员 测试,
最终得到完整有效的软件产品。
软件设计是一个把软件需求逐步转换为软件
源代码的过程,它提供了软件的表示,使得软件
的质量评价成为可能。
软件设计还是将用户要求准确地转化为最终
软件产品的唯一途径,它也是后续开发活动及软
件维护的基础。
因而,软件设计是开发阶段最重要的活动。
第二节 软件设计的概念和原则
一、模块化
1,模块
模块 或组件是指具有一定功能的可以用名字
调用的程序语句集合 。
例如,过程、函数、子程序和宏等都可作为
模块。面向对象范型中的对象是模块,对象内的
方法也是模块。
2、模块化
模块化是将软件划分成若干个相对独立的模
块,而这些模块集成起来构成一个整体,可以完
成指定的功能满足用户的需求。
模块化可以化繁为简,减少成本,但如果模
块分得过多,会增加模块的接口成本,反而增加
软件的整体成本。所以模块化的程度应该是适量
的。
模块是由边界元素限定的相邻的程序元素
(例如,数据说明,可执行的语句 )的序列,而且
有一个总体标识符来代表它。像 Pascal或 Ada这
样的块结构语言中的 Begin…end对,或者 C,C++
和 Java语言中的{ …}对,都是边界元素的例
子。因此,过程、函数、子程序和宏等,都可作
为模块。面向对象范型中的对象 (见第 6章 )是模
块,对象内的方法也是模块。模块是构成程序的
模块化就是把程序划分成独立命名且可独立
访问的模块,每个模块完成一个子功能,把这些
模块集成起来构成一个整体,可以完成指定的功
能满足用户的需求
Meyer提出了五条标准,我们可以用这五条
标准来评价一种设计方法定义有效的模块系统的
(1)
如果一种设计方法提供了把问题分解为子问
题的系统化机制,它就能降低整个问题的复杂性,
(2)
如果一种设计方法能把现有的 (可重
用的 )设计构件组装成新系统,它就能提供一种
并非一切都从头开始做的模块化解决方案。
(3)
如果可以把一个模块作为一种独立单元 (无
需参考其他模块 )来理解,那么,这样的模块是
(4)
如果对系统需求的微小修改只导致对个别模
块,而不是对整个系统的修改,则修改所引起的
副作用将最小。
(5)
如果在一个模块内出现异常情况时,它的影
响局限在该模块内部,则由错误引起的副作用将
采用模块化原理可以使软件结构清晰,不仅
容易设计也容易阅读和理解。因为程序错误通常
局限在有关的模块及它们之间的接口中,所以模
块化使软件容易测试和调试,因而有助于提高软
件的可靠性。因为变动往往只涉及少数几个模块,
所以模块化能够提高软件的可修改性。模块化也
有助于软件开发工程的组织管理,一个复杂的大
型程序可以由许多程序员分工编写不同的模块,
并且可以进一步分配技术熟练的程序员编写困难
的模块。
二, 抽象
抽象就是抽出事物的本质特性而暂时不考虑
它们的细节 。
一个复杂的问题首先可以用一些高级的概念
构造和理解,这些高级的概念又可以用一些低级
概念构造和理解性,如此进行下去,直至最低层
次的具体元素。
这就是所谓的 层次思维,即用层次的方式考
虑和处理一个复杂的问题。
最高抽象
较低级抽象
较低级抽象
具体基本元素
低级概念
构造和理
解性
层次思维
软件工程的每一步都是对软件的较高一级抽
象层的解的一次具体化的描述。
在软件计划阶段,软件系统被描述为整个计
算机系统中的一个部分。
在软件需求分析阶段,软件用问题域约定的
大家所熟悉的习惯用语描述。
从概要设计向详细设计过度时,抽象级别再
次被降低。
编码完成后就达到最低的抽象层次。
产能核算
生产产品的消耗核算
辅料核算主料核算
优化分析用料统计 报表
其它核算
软件结构
·····
在这种从高级抽象到低级抽象的转换过程中,
始终伴随着一系列的 过程抽象 和 数据抽象 。
过程抽象 把完成一个特定功能的动作序列抽
象为一个过程名和参数表,并通过指定过程名和
实际参数调用此过程。
数据抽象 把一个数据对象的描述抽象为一个
数据类型名,用此类型名可以定义多个具有相同
性质的数据对象。
例, 开发一个能够实现绘图系统全部功能的
低级 CAD软件包。
抽象 1:用问题域约定的大家所熟悉的习惯用
语描述问题的解 。
该 CAD软件具有能进行可视化通信的图形界面,
能用鼠标代替绘图工具画出各种曲线和直线,能
完成几何计算、截面视图和辅助视图设计,能将
图形设计的结果存于图形文件中。
抽象 2:描述软件的任务, 所用语言与问题域
约定用语有所不同, 但不是实现用的语言 。
CAD 软件的任务:
用户界面任务;
创建二维图形任务;
显示图形任务;
管理图形任务 。
END CAD
抽象 3:给出初步过程性描述(以创建二维图形为例)
PROCEDURE创 建二维图形
REPEAT UNTIL 创建二维图形终止
DO WHILE 出现与数字仪交互时
数字仪接口任务;
判断作图请求;
线:画线任务;
园:画园任务;

END;
DO WHILE 出现与键盘交互时
键盘接口任务;
选择分析或计算;
辅助视图:辅助视图任务

END

END PRODEDURE
在此抽象层次上, 所有的术语都面向软件,
模块结构也开始明朗, 求精过程可
以继续进行下去,直至获得源代码。
三,信息隐藏
软件设计应该降低模块与外部环境间的连接
的复杂性 。 为此, D.L.Parnas提出了信息隐藏的
基本原则 。
信息隐藏的基本思想:
1.模块内部的数据和过程, 对于那些不需要
这些信息的模块不可访问;
2.每一个模块只完成一个相对独立的特定的
功能;
3.模块之间仅仅交换那些完成系统功能必须
交换的信息 。
将信息隐藏作为模块化系统设计的标准, 为
软件测试和维护提供了极大的优点 。
1.每个模块只完成一个相对独立的特定功能,
模块之间只交换那些为完成软件功能必须交换的
信息 。
2.模块对数据和过程处理细节的隐藏可以减
少错误向外传播 。
3.当软件系统扩充功能时, 只需要插入新模
块, 原有的大多数模块不必改动 。
四、模块独立性
模块独立性 是指软件系统中的每个模块只涉
及软件要求的具体子功能, 而与软件系统中其他
的模块的接口是简单的 。
模块化, 首先要考虑模块如何划分, 模块独
立性是模块划分的一个标准 。
模块独立性较高的模块至少在两个优点:
第一,具有独立性模块的软件比较容易
开发。
第二,独立的模块容易测试和维护。
模块独立性的概念是模块化、抽象和信
息隐藏等概念的直接结果,也是完成有效的
模块设计的基本标准。
模块的独立程度可以由两个定性标准来度量,
这两个标准分别称为 内聚 和 耦合 。
耦合 衡量不同模块彼此间互相依赖 (连接 )的
紧密程度。
内聚 衡量一个模块内部各个元素彼此结合的
紧密程度。
1,
耦合强弱取决于模块间接口的复杂程度, 进
入或访问一个模块的点, 以及通过接口的数据 。
一般模块之间可能的连接方式有 7种, 构成耦
合的 7种类型, 不同类型耦合强弱关系为:
非直接耦合 数据耦合 标记耦合 控制耦合 外部耦合 公共耦合 内容耦合


耦合性 高
弱模块独立性
1)非直接耦合 是指两个模块中的每一个都能
独立的工作而不依赖另一个模块的存在,它们之
间的联系完全是通过主模块的控制和调用实现。
2) 数据耦合 是指一个模块访问另一模块时,
彼此之间通过参数表来交换输入、输出信息,而
且交换的信息仅限于数据。
3)标记耦合 是指一组模块通过参数表传递记
录信息。
4) 控制耦合 是指一个模块通过传送开关、标
志、名字等控制信息,明显地控制选择另一模块
的功能。如下图所示。
A
F l a g
f 1 f 2 f n
… …
F l a g
B
控制耦合
5)外部耦合 是指一组模块都访问同一全局简
单变量而不是同一全局数据结构,而且不是通过
参数表传递该全局变量的信息。
6) 公共耦合 是指多个模块都访问同一个公共
数据环境。如下图所示。
A B
C o m m o n 公 共 数 据 区
A B
C o m m o n 公 共 数 据 区
(a)松散公共耦合 (b)紧密公共耦合
公共耦合
? 一个模块直接访问另一模块的内部数据;
? 一个模块不通过正常入口转到另一模块内部;
? 两个模块有一部分程序代码重叠;
? 一个模块有多个入口。
7)内容耦 合 是指下列情形之一
A B
A
B
E n t y 1
    … …
e n t y 2
    … …
内容耦合
(a)进入另一模块内部 ( b)模块代码重叠 ( c)多入口模块
非直接耦合 的耦合程度最低,它表明模块之
间无任何连接。但是,在一个软件系统不可能所
有之间没有任何联系。
数据耦合 是低耦合,软件系统必须存在这种
耦合,因为只有当某些模块的输出数据作为另一
些模块的输入数据时,系统才能完成有价值的功
能。
标记耦合 表明一组模块共享了一个记录信息,
这个记录是某一数据结构的子结构,而不是简单
变量。
控制耦合 是中等程度的耦合,它实质上是在
单一接口上选择多功能模块中的某项功能;控制
耦合增加了系统的复杂程度,通常把适当模块分
解之后,可以用数据耦合代替它。
公共耦合 的公共数据环境可以是全程变量、
共享通信区、内存的公共覆盖区、任何存储介质
上的文件以及物理设备等;公共耦合的复杂程度
随耦合的模块个数而变化,当模块个数增加时复
杂程度也增加。
内容耦合 的耦合度最高,许多高级程序设计
设计语言已经设计成不允许在程序中出现任何形
式的内容耦合。
耦合是影响软件复杂程度的一个重要因素 。
在软件设计中应该采取下述设计原则:
尽量使用数据耦合, 少用控制耦合, 限制外
部耦合和公共耦合的范围, 完全不用内容耦合 。
2、
内聚是一个模块内各个元素彼此结合的紧密
程度, 好内聚的模块只做一件事情 。 不同类型内
聚的强弱关系为下图所示 。
功能内聚 顺序内聚 通信内聚 过程内聚 时间内聚 逻辑内聚 偶然内聚


内聚性 低
弱模块独立性
功能单一 功能分散
1)功能内聚 是指一个模块内所有处理元素属
于一个整体,完成一个单一的功能。
2)顺序内聚 是指一个模块内的处理元素与同
一个功能密切相关,且这些处理必须顺序执行。
3)通信内聚 是指一个模块 内各功能部分都使
用了相同的输入数据或产生了相同的输出数据,
如下图所示。
打 印 检
验 结 果
修 改
文 件
合 并
读 文 件
读 卡 片
文 件
计 算
B
计 算
A
加 工 记 录
获 得 打 印 结 果
A 结 果
B 结 果
A / B 数 据



文 件
A / B 卡 片
4)过程内聚 是指一个模块内的处理元素是相
关的,而且必须以特定的次序执行。
5)时间内聚 是指一个模块包含的任务必须在
同一时间内执行。
6)逻辑内聚 是指一个模块完成逻辑上相同或
相似的一组任务,如下图所示。
7)偶然内聚 是指一个模块完成一组任务,这
组任务彼此间即使有关系,其关系也是很松散的,
如下图所示。
A B C
M S T O R E R E C ( ) T O N
R E A D M A S T E R F I L
A D D 1 T O X
… …
判 断
调 用 模 块















偶然内聚 逻辑内聚
设计时应该力求做到高内聚, 通常中等程度
的内聚也是可以采用的, 而且效果和高内聚相差
不多;但是, 低内聚很坏, 不要使用 。
内聚和耦合是密切相关的,模块内的高内聚
往往意味着模块间的松耦合。
内聚和耦合都是进行模块化设计的有力工具,
但是实践表明内聚更重要,应该把更多注意力集
中到提高模块的内聚程度上。
事实上,没有必要精确确定内聚的级别。
重要的是设计时力争做到高内聚,并且能够
辨认出低内聚的模块,有能力通过修改设计提高
模块的内聚程度降低模块间的耦合程度,从而获
得较高的模块独立性。它是信息隐蔽概念的自然
扩展。
人们在开发计算机软件的长期实践中积累了
丰富的经验, 总结这些经验得出了一些启发式规
则 。 这些规则往往能帮助人们找到改进软件设计,
提高软件质量的途径, 从而实现有效的模块化 。
下面介绍几条常用的启发规则 。
五、模块设计原则
1.提高模块独立性
设计出软件初步结构之后,为了降低模块间
的偶合度、提高模块内聚度,应该进一步分解或
合并模块。例如,多个模块共有的一个子功能就
可以单独做成一个模块,由这些模块调用。
2.模块规模应该适中
通常一个模块以 30~ 60个语句行为宜。一个
模块包含的语句行数过多,模块的可理解程度将
迅速下降。
3.深度, 宽度, 扇出和扇入都应适当
1)深度是指软件结构中控制的层数。
2)宽度是指软件结构中同一个层次上的模块
总数的最大值。
3)模块的扇出是指这个模块直接调用的下级
模块数目。
4)模块的扇入是指直接调用这个模块的上级
模块数目。
4.模块的作用域应该在控制域之内
模块的作用域 是指受该模块内一个判定影响
的所有模块的集合。
模块的控制域 是指模块本身以及直接或间接
从属于该模块的所有模块的集合。
模块的作用域 含于 模块的控制域 内
如果一个模块调用另一模块,则称前者为主
控模块,后者为从属模块。
如下图中模块 M是主控模块,模块 A,G是从
属模块,模块 M主控模块 A,G。模块 B从属模块 A,
因此也从属模块 M。模块 A的控制域是 A,B,C、
D,E,F等模块的集合。
M
A G
B C
D E F

在一个设计得很好的系统中,所有受判定影
响的模块应该都从属于作出判定的哪个模块,最
好是局限于做出判定的那个模块本身及它的直属
下级模块。上图中模块 A作出的判定只影响模块 B。
如果模块 A作出的判定同时还影响模块 G中的处理
过程,那么,这种结构的软件是难于理解的。
为了使模块 A中的判定能影响模块 G中的处理
过程,通常需要在 A中给一个标记设臵状态指示
判定的结果,并且把这个标记传递给 A和 G的公共
上级模块 M,再由 M把它传给 G。由于这个标记是
控制信息而不是数据,因此模块间将出现控制偶
合。使作用域是控制域的子集的方法是把判断点
上移或把那些在作用域内但不在控制域内的模块
移到控制域内。例如,把判定从模块 A中移到模
块 M中或把模块 G移到模块 A的下面。
M
B S◇
X A DC
(其中 X受 A的影响 )
M
B S◇
X
A DC
解决作用域超出控制域常见的方法有如下
两种:
1、适当提高判断所在层次,但最好不要将
判断放到 top层。
2、把控制不住的模块拉进控制范围内。
5.尽可能降低模块接口的复杂程度
模块接口复杂或不一致是高偶合或低内聚的
征兆,也是软件发生错误的主要原因之一,应该
仔细分析模块的独立性和设计模块接口,使得信
息传递简单并且与模块的功能一致。
例如, 求一元二次方程的根的模块
QUAD_ROOT(CTAL,X),其中用数组 CTAL传送方程
的系数, 用 X数组回送求得的根 。 这样的传输信
息的方式不利于对这个模块的理解, 下面这种接
口就可能简单些 。
QUAD_ROOT(A,B,C,R!,R2),
其中 A,B,C是方程的系数,R1和 R2是解方程求
出的两个根。
6.设计单入口单出口的模块
在软件设计中, 不要使模块间出现内容偶
合 。 当信息是从顶部进入模块并且是从底部推
出来的时, 软件就比较容易理解, 也比较容易
维护 。
7, 模块功能应该可以预测
模块功能可以预测是指对相同的输入数
据能产生相同的输出 。
第三节 结构化设计
结构化设计是在模块化,自顶向下细化,结
构化程序设计等程序设计技术基础上发展起来的,
其 特点 是面向软件系统结构,在比模块更高级别
上研究结构问题,采用结构图来描述程序的结构。
结构化设计方法是根据需求阶段对数据流的
分析来设计软件结构,它可以把数据流图变换成
程序结构。
由于任何软件系统都可以用数据流图表示,
因此,结构化设计方法理论上可以用于任何软件
系统的开发。
由于结构化设计的工作与需求分析阶段的结
构化分析相衔接,所以又说它是一种面向数据流
的设计方法。
一, 结构化设计的的基本概念
结构化设计 (SD)的概念源于 70年代,它认为
程序或系统是由一组功能操作构成的,软件设计
者首先应该将需要实现的系统看作是逻辑功能
(功能模块)的抽象集合,只分析模块之间关系,
? 无视 ? 模块内部的情况。
模块本身可以供其他程序使用,也可以是其
他程序已编好的模块,模块按一定的层次结构组
织起来就是软件结构。
结构化设计的 目标 是将软件设计为结构简单,
功能单一、相互独立的模块组织。它重视 ? 模块
度 ? 概念,即软件系统中的模块数目。这是因为
模块的大小与模块的复杂性成正比。模块划分过
小,虽然模块自身复杂度下降了,但又增加了模
块间的接口复杂性,所以每个问题都有一个最佳
模块度问题,即最佳模块数问题。如果存在一个
适当的模块数目使得程序的整个复杂性最小,那
么开发成本将被大大降低,
结构化设计中为评价软件设计质量提供了两
种方法:
一种方法是评价模块本身质量 (内聚 )的相对
效果。
另一种方法是评价模块间关系 (偶合 )的相对
效果,这里的 ? 相对 ? 是为了强调模块的简单性
或关系的复杂性。
二, 软件结构
软件结构是指软件的整体结构和这种结构提
供系统在概念上的整体性方式。是由程序构件
(模块 )的层次结构、构件之间交互的方式及构件
使用的数据结构。
软件设计的目标之一是导出系统结构,通常
用结构图表示。
软件结构是软件系统中元素之间的关系表示,
它包括两个部分:
1.关系层次结构 是指软件系统中过程性部件
(模块)的组织情况,并蕴涵了在程序控制上的
的层次关系。
在软件开发实践中,表达这种结构工具很多,
但最常用的是下图所示的类树图。
M
A G
B C
D E F

2.数据结构 是指数据的各个元素之间的逻辑
关系的一种表示。
在软件结构设计中,数据结构与程序结构一
样,可以在不同的抽象层次上表示。
例如,一个是一种线性结构的逻辑模型,它
可以用向量实现,也可以用链表实现。
数据结构的组织方法和复杂程度多种多样,
但典型的数据结构种类是有限的。
关系层次结构和数据结构都是一个 ? 逐步求
精、分而治之 ? 的结果,软件设计总是从需求定
义开始,逐步分层导出关系层次结构和数据结构,
当需求定义中所述的每个部分最终都能由一个或
几个软件元素实现时,求解过程即告结束。下图
表明了从需求定义到软件设计的转变。
S 1 S 2
S 3
S 4 S 5
软 件 解




P 1
P 2
P 3
P 4
结构变化
S 4
S 1 S 2
S 3
S 5
S 1 S 4 S 5
S 2
S 3S 3 S 4
S 5
S 2S 1
问 题
结 构 1
结 构 2 结 构 3













软件结构的设计应该遵循模块设计原则, 数
据结构对软件结构和过程的复杂性有直接影响,
它在很大程度上决定了软件质量 。 不管采用何种
软件设计技术, 没有良好的数据结构就不会导出
良好的程序结构设计, 因此数据结构设计在某种
意义上讲是设计阶段中最重要的一个环节 。
1.
结构图是描绘系统结构的图形工具, 它描述
了系统由哪些模块组成, 程序中模块之间的调用
关系, 每个模块 ? 做什么 ? 以及每个模块输入和
输出 。 结构图是结构化设计中的一个十分重要的
结果 。
三、图形工具
作为结构设计的重要工具, 结构图的基本成
分有模块, 调用和数据 。 结构图中方框代表一个
模块, 框内注明模块的名字或主要功能;方框之
间的箭头 (或直线 )表示模块的调用关系 。
在结构图中带注释的箭头表示模块调用过程
中来回传递的信息。箭头尾部是空心圆表示传递
的是数据,箭头尾部是实心圆表示传递的是控制
信息。
模块
调用
数据信息
控制信息
A
B
模块 A调
用模块 B
子程序已定义的模块
结构图的基本成分
B
A
B
A 查找学生成绩
查找学生记录
模块间的调用关系和接口表示
结构图描述了模块间的调用关系, 它通过组
织功能单一相互独立的模块来实现目标软件系统
这样一个整体目标 。
结构图所显示的模块结构的偶合和内聚关系
代表了系统的一种静态结构, 它指出了模块间是
否有关系, 是否相互发生影响, 但没有说明如何
发生影响 。
结构图最主要的质量指标是模块内聚度和偶
合度 。
产 生 最 隹 解
得 到 最 好 输 入 计 算 最 隹 解 输 出 结 果
读 输 入
编 辑 输 入
结 果 格 式 化 显 示 结 果
好 输 入
原 始 输 入
编 辑 结 果
格 式 化 解





原 始 输 入

格 式 化 解
产生最佳解的一般结构图
2,层次图和 HIPO
层次图 (H图 )用于描绘软件的层次结构, 层次
图中一个矩形框代表一个模块,
框间的连线表示调用关系, 位于上方的矩形
框所代表的模块调用位于下方的矩形框
所代表的模块,下图是一个层次图的例子。
层次图很适于在自顶向下设计软件的过程中使用。
层次图
HIPO图 是美国 IBM公司发明的 ? 层次图加输入
/处理 /输出图 ? 的英文缩写 。 为了使 HIPO图具有
可追踪性, 在 H图里除了顶层的方框之外, 每个
方框都加了编号 。 例如, 把上图加了编号之后得
到下图 。
与 H图中的每个方框相对应,应该有一张 IPO
图描述这个方框代表的模块的处理过程,每张
IPO图内都应该明显地标出它所描绘的模块在 H图
中中的编号,以便确定这个模块在软件结构中的
位臵。 ?
正 文 加 工 系 统
输 入
1, 0
输 出
2, 0
编 辑
3, 0
加 标 题
4, 0
存 储
5, 0
检 索
6, 0
编 目 录
7, 0
格 式 化
8, 0
添 加
3, 1
删 除
3, 2
插 入
3, 3
修 改
3, 4
合 并
3, 5
列 表
3, 6
正文加工系统的 H图
四、概要设计
软件的概要设计, 又称总体设计, 它的主要
任务是确定一个模块化的 程序结构, 确定每个模
块的 功能, 定义 界面, 明确模块间的 相互关系 以
及系统的 全局数据结构 。
传统的软件工程方法学采用结构化设计方法
来完成该项软件设计阶段的工作 。
概要设计需要完成的工作包括以下几个方面:
1,制定规范
为软件开发组制定在设计时应该共同遵守的
标准, 以协调组内各成员的工作 。
2.软件系统结构的总体设计
在需求分析分阶段,系统按功能被逐次分割
成层次结构,使每一部分完成简单的功能且各个
部分之间又有一定的关系。
设计阶段,在这个功能的层次结构的基础上
把各个部分组合起来成为系统,它包括:
( 1) 采用结构化设计方法, 将一个复杂的系统
按功能划分成模块的层次结构;
( 2) 确定每个模块的功能, 并建立与已确定的
软件需求的对应关系;
( 3) 确定模块间的对应关系;
( 4) 确定模块间的接口;
( 5)评估模块划分的质量及导出模块结构的规
则。
3.处理方式设计
( 1) 确定为实现软件系统的功能需求所必须
的算法, 评估算法的性能;
( 2) 确定为满足软件系统的性能需求所必须
的算法和模块间的控制方式即性能设计 。 性能设
计包括周转时间响应时间吞吐量精度 4个指标;
( 3)确定外部信号的接受和发送方式。
4.数据结构设计
确定软件涉及的文件系统的结构, 数据库模
式, 子模式 。 进行数据完整性和性设计, 它包括:
( 1) 确定输入输出文件的数据结构;
( 2) 确定算法所必需的逻辑数据结构及其操
作;
( 3) 确定对逻辑数据结构所必须的的程序模
块;
( 4) 确定和限制各个数据设计决策的影响范
围;
(5)如果需要与操作系统或调度接口所必须
的控制表等数据时,确定其详细的数据结构及使
用规则。
5.制定测试计划
为了保证软件的可测试性, 应指定测试计划,
例如, 黑盒测试计划 。
6,概要设计文档评审
概要设计阶段的输出是设计规格说明书,各
条款内容是在设计求精过程中逐步确定的。为了
确保文档质量,还必须对文档进行复审。复审的
目的就是及早发现设计中的缺陷和错误,并纠正
错误。
复审的内容包括软件 系统结构, 数据结构,
结构之间的界面 三个方面, 重点考虑:
? 软件结构能否满足要求?
? 结构形态是否合理?
? 层次是否清晰?
? 模块划分是否遵循模型化和信息隐藏思想?
? 人机界面, 各模块的接口以及出错处理是否
合适?
? 模块设计能否满足功能和性能要求?
在数据流图中, 从系统的输入数据流到系统
的输出数据流的一系列变换形
成了一条信息流, 这种信息流大体可分为两
种类型, 一种是变换流, 一种是事务流 。
结构化设计方法就是根据数据流图的这种特
性定义了两种 ? 映射 ?, 这两种映射可以机械地
把数据流图变换成程序结构 。
五、信息流的类型
1,变换流:在基本系统模型(顶级数据流
图)中信息通常以 ? 外部世界 ? 的形式进入软件
系统,经过处理以后再以 ? 外部世界 ? 的形式离
开系统,如图 4-21所示。输入信息流沿传入路径
进入系统,同时由外部形式变换为内部形式,经
过系统变换中心加工处理再沿输出通道变换成外
部形式离开系统。如果数据流图所描述的信息流
具有这些特性,则称这种信息流是变换流。
变换流型数据流图有明显的输入、加工或变
换、输出三部分。
变换型程序的功能是从某处获得数据,再对
这些数据处理 (变换 ),然后将结果输出。由三个
部分组成:输入、处理、输出。
变换分析与设计过程:
1)区分输入流、变换中心和输出流,标出界
线
2)设计顶层和第一层
顶层是主模块设计,第一层是输入、输出及
处理设计。
3)设计中下层
A
FD
E
C
B
a
kh
f
e
d
c
b
j
物理
输入
物理
输出
逻辑
输出
逻辑
输入
信息处理中心
变换型数据流图
(加工或变换 )
System
Get b b in to j Out j
In a a in to b B C D E j in to k Out k
b b j j
baa kb h,fe,fcc,d hd,e kjj
变换流映射成软件结构图
2、事务流
信息沿传入路径(输入通道)进入系统,由
外部形式变换为内部形式后到达一个事务中心,
事务中心根据输入信息(事务)的类型,在若干
个动作序列或活动流中选择一个来执行。
这种信息流称为事务流事务流有明显的事务
中心,活动流以事务中心为起点表现为辐射状流
出,
事务型程序的功能是接受一项事务,然后根
据事务的不同类型,选择某一类事务进行处理。
事务分析与设计过程,
1)分析并确定事务中心、多条动作路径的起
点、数据接受部分和发送部分;
2)设计主要模块;
3)为每一个事务处理设计一个事务处理模块;
4)为每一个事务处理模块设计操作模块;
5)为每一个操作模块设计细节模块。
T
T1
T2
Tn
B
a a1
a2
an
b1
b2
bn
b
事务型数据流图
T
T1 T2 Tn
a
b
a1 a2 an
b1 b2
bn

事务流映射成软件结构图
在开发大型软件系统的活动中,数
据流图中的变换流与事务流常常是交
织在一起的。
3,结构化设计方法的设计过程 下图描绘了
结构化设计方法的逐步设计过程 。
特别需要指出的是:任何设计过程都不应该
也不可能一成不变的, 人的判断力和创造性往往
会凌驾于方法的规则之上 。
精化数据流
流类
区分事务中心和数据接受选路 区分输入和输出分支
映射成事务结构 映射成变换结构
用启发式设计规则精化软件
导出接口描述和全局数据结
复查
详细设计
事务分析 变换分析
结构化设计方法的设计过程
接口又解释为界面。接口设计主要包括有 3
个方面的描述:
1.软件构件与构件之间的接口设计 。如,构
件之间的参数传递;
2.软件内部与协作系统之间的接口 设计。如
构件与其他外部实体的接口;
3.软件与使用者之间的通信方式。如,用户
界面设计等。
六、接口设计
七,设计优化
考虑设计优化问题时应该记住,? 一个不能工
作的 ‘ 最佳设计 ’ 的价值是值得怀疑的 ? 。软件
设计人员应该致力于开发能够满足所有功能和性
能要求,而且按照设计原理和启发式设计规则衡
量是值得接收的软件。应该在设计的早期阶段尽
量对软件结构进行精化。可以导出不同的软件结
构,然后对它们进行评价和比较,力求得到 ? 最
好 ? 的结果。
这种优化的可能,是把软件结构设计和过程设
计分开的真正优点之一。
第四节 人机界面设计
人机界面设计是接口设计的一个组成部分。
对于交互式系统来说,人机界面设计和数据设计、
体系结构设计、过程设计一样重要。近年来,人
机界面在系统中所占的比例越来越大,在个别系
统中人机界面的设计工作量甚至占设计总量的一
半以上。
人机界面的设计质量,直接影响用户对软件
产品的评价,从而影响软件产品的竞争力和寿命,
因此,必须对人机界面设计给以足够重视。
一,
在设计用户界面的过程中,几乎总会遇到下
述四个问题:
? 系统响应时间
? 用户帮助设施
? 出错信息处理
? 命令交互
1.
系统响应时间是许多交互式系统用户经常抱
怨的问题。
一般说来,系统响应时间指从用户完成某个
控制动作 (例如,按回车键或点击鼠标 ),到软件
给出预期的响应 (输出或做动作 )之间的这段时间。
系统响应时间有两个重要属性,分别是 长度
和 易变性 。
2,用户帮助设施
几乎交互式系统的每个用户都需要帮助,当
遇到复杂问题时甚至需要查看用户手册以寻找答
案。
大多数现代软件都提供联机帮助设施,这使
得用户可以不离开用户界面就解决自己的问题。
常见的帮助设施有 集成的 和 附加的 两类。
3,出错信息处理
出错信息和警告信息,是出现问题时交互式
系统给出的 ? 坏消息 ? 。出错信息设计得不好,
将向用户提供无用的或误导的信息,反而增加了
用户的挫折感。
4,命令交互
命令行曾经是用户和系统软件交互的最常用
方式,而且也曾经广泛地用于各种应用软件中。
现在,面向窗口的、点击和拾取方式的界面已经
减少了用户对命令行的依赖,但是,许多高级用
户仍然偏爱面向命令的交互方式。
在多数情况下,用户既可以从菜单中选择软
件功能也可以通过键盘命令序列调用软件功能。
二, 人机界面设计过程
用户界面设计是一个迭代的过程, 也就是说,
通常先创建设计模型, 再用原型实现这个设计模
型, 并由用户试用和评估, 然后根据用户的意见
进行修改 。
用户界面设计主要依靠设计者的经验。总结
众多设计者的经验而得出的设计指南,有助于设
计者设计出友好、高效的人机界面。
本节介绍三类人机界面设计指南。
1.
一般交互指南涉及信息显示、数据输入和整
体系统控制,因此,这些指南是全局性的,忽略
它们将承担较大风险。下面叙述一般交互指南。
1)保持一致性。为人机界面中的菜单选择、
命令输入、数据显示以及众多的其他功能,使用
一致的格式。提供有意义的反馈。向用户提供视
觉的和听觉的反馈,以保证在用户和界面之间建
2)在执行有较大破坏性的动作之前要求用户
确认。如果用户要删除一个文件,或覆盖一些重
要信息,或请求终止一个程序运行,应该给出
? 您是否确实要 ? 的信息,以请求用户确认他的
3)允许取消绝大多数操作。 UNDO或 REVERSE
功能使众多终端用户避免了大量时间浪费。每个
交互式应用系统都应该能方便地取消已完成的操
作。
4)减少在两次操作之间必须记忆的信息量。
不应该期望用户能记住一大串数字或名字,以便
在下一步操作中使用它们。应该尽量减少记忆量。
提高对话、移动和思考的效率。应该尽量减少击
键次数,设计屏幕布局时应该考虑尽量减少鼠标
移动的距离,应该尽量避免出现用户问,? 这是
什么意思 ?
5)允许犯错误。系统应该保护自己不受致命
6) 按功能对动作分类,并据此设计屏幕布局。
下拉菜单的一个主要优点就是能按动作类型组织
命令。实际上,设计者应该尽力提高命令和动作
组织的 ? 内聚性 ? 。
7) 提供对工作内容敏感的帮助设施。
8) 用简单动词或动词短语作为命令名。过长
的命令名难于识别和记忆,也会占据过多的菜单
空间
2,信息显示
如果人机界面显示的信息是不完整的, 含糊
的或难于理解的, 则应用软件显然不能满足用户
的需求 。 可以用多种不同方式 ? 显示 ? 信息:用
文字, 图片和声音;按位臵, 移动和大小;使用
颜色, 分辨率和省略 。 下面是关于信息显示的设
计指南 。
1) 只显示与当前工作内容有关的信息。用户
在获得有关系统的特定功能的信息时,不必看到
与之无关的数据、菜单和图形。
2) 不要用数据淹没用户,应该用便于用户迅
速地吸取信息的方式来表示数据。例如,可以用
图形或图表来取代巨大的表格。使用一致的标记、
标准的缩写和可预知的颜色。显示的含义应该非
常明确,用户不必参照其他信息源就能理解。
3)允许用户保持可视化的语境。如果对图形
显示进行缩放,原始的图像应该一直显示着 (以
缩小的形式放在显示屏的一角 ),以使用户知道
当前观察的图像部分在原图中所处的相对位臵。
4)产生有意义的出错信息。
5)使用大小写、缩进和文本分组以帮助理解。
人机界面显示的信息大部分是文字,文字的布局
和形式对用户从中吸取信息的难易程度有很大影
响。
6)使用窗口分隔不同类型的信息。利用窗口
用户能够方便地 ? 保存 ? 多种不同类型的信息。
7)使用 ? 模拟 ? 显示方式表示信息,以使信
息更容易被用户吸取。例如,显示炼油厂储油罐
的压力时,如果使用简单的数字表示压力,则不
易引起用户注意。但是,如果用类似温度计的形
式来表示压力,用垂直移动和颜色变化来指示危
险的压力状况,就能引起用户的警觉,因为这样
做为用户提供了绝对和相对两方面的信息。
8)高效率地使用显示屏。当使用多窗口时,
应该有足够的空间使得每个窗口至少都能显示出
一部分。此外,屏幕大小应该选得和应用系统的
类型相配套 (这实际上是一个系统工程问题 )。
3,数据输入
用户的大部分时间用在选择命令, 键入数据
和向系统提供输入 。 在许多应用系统中, 键盘仍
然是主要的输入介质, 但是, 鼠标, 数字化仪和
语音识别系统正迅速地成为重要的输入手段 。 下
面是关于数据输入的设计指南 。
1)尽量减少用户的输入动作。最重要的是减
少击键次数,这可以用下列方法实现:用鼠标从
预定义的一组输入中选一个;用 ? 滑动标尺 ? 在
给定的值域中指定输入值;利用宏把一次击键转
变成更复杂的输入数据集合。
2)保持信息显示和数据输入之间的一致性。
显示的视觉特征 (例如,文字大小、颜色和位臵 )
应该与输入域一致。
3) 允许用户自定义输入。专家级的用户可能
希望定义自己专用的命令或略去某些类型的警告
信息和动作确认,人机界面应该允许用户这样做。
4) 交互应该是灵活的,并且可调整成用户最
喜欢的输入方式。用户类型与喜欢的输入方式有
关,秘书可能非常喜欢键盘输入,而经理可能更
喜欢使用鼠标之类的点击设备。
5) 使在当前动作语境中不适用的命令不起
作用。这可使用户不去做那些肯定会导致错误的
动作。
让用户控制交互流 。 用户应该能够跳过不必
要的动作, 改变所需做的动作的顺序 (在应用环
境允许的前提下 ),以及在不退出程序的情况下
从错误状态中恢复正常 。 对所有输入动作都提供
帮助 。 消除冗余的输入 。 尽可能提供缺省值;绝
对不要要求用户提供程序可以自动获得或计算出
来的信息 。
第五节 详细设计
软件的概要设计已经明确了软件系统的结构,
给出了组成系统的各个模块的功能和模块之间控
制分层关系, 但它不关心模块内部的细节 。
软件的详细设计, 又称过程设计是在数据设
计, 关系层次结构设计和接口设计完成之后进行,
它的基本任务就是要在概要设计的基础上, 对系
统中的每个模块给出足够详细的过程性描述, 以
及局部数据结构的设计 。
这里过程是指有关处理的精确说明, 诸如事
件的顺序, 确切的判断位臵, 循环操作以及数据
的组成等等 。
关系层次结构与软件过程相互关联, 关系层
次结构中的任何模块的所有从属模块肯定被引用
出现在该模块的过程说明之中, 因而, 软件过程
对应的程序结构也是一个层次结构 。
过程设计的主要任务是为软件结构
中的每一个模块确定采用的算法和块内
数据结构, 明确接口细节, 设计测试用
例 。
一, 结构化程序设计
结构化程序设计的概念最早由 E.W.Dijkstra
提出, 1966年 Bohm和 Jacopini证明了只用 ? 顺
序 ?, ? 选择 ? 和 ? 循环 ? 这三种基本控制结构
就能实现任何单入口单出口的程序 。
(a)顺序结构, 先执行 A再执行 B;
(b)IF-THEN-ELSE型选择 (分支 )
(c)DO-WHILE型循环结构
三种基本的控制结构
Bohm和 Jacopini证明为结构程序设计奠定了
理论基础。那么,什么是结构程序设计?目前尚
无定论,一个比较流行的定义是,
结构程序设计是一种设计程序技术,它采用自
顶向下逐步求精的设计方法和单入口单出口的控
制结构。
在概要设计阶段采用自顶向下逐步求精的设
计方法,可以把一个复杂问题的解分解和细化为
一个由若干模块组成的层次结构的软件系统 ; 在
详细设计阶段采用自顶向下逐步求精的设计方法,
可以把一个模块的功能逐步分解和细化为一系列
具体的处理步骤。
如果只允许使用顺序,IF-THEN-ELSE型分支
和 DO-WHILE型循环这三种基本控制结构,则称为
经典的结构程序设计 ;
如果除了上述三种基本控制结构之外,还允
许使用 DO-CASE型多分支结构和 DO-UNTIL型循环
结构,则称为 扩展的结构程序设计,其流程图如
图( a)和图( b)所示;
如果再加上允许使用 LEAVE(或 BREAK)结构,
则称为 修正的结构程序设计 。
(a)DO -UNTIL型循环结构;
(b)多分支结构
其他常用的控制结构
二, 过程设计的工具
描述程序处理过程的工具称为过程设计的工
具, 它们可以分为图形, 表格和语言三类 。
1.
程序流程图又称为程序框图,它是历史最悠
久使用最广泛的一种图形描述工具。程序流程图
大家太熟悉了,此处不讲了。
2.盒图 (N-S图 )
出于要有一种不允许违背结构程序设计精神
的图形工具的考虑, Nassi和 Shneiderman提出了
盒图, 又称为 N-S图 。 下图给出了结构化控制结
构的盒图表示, 也给出了调用子程序的盒图表示
方法 。
盒图没有箭头,因此不允许随意转移控制。
坚持使用盒图作为详细设计的工具,可以使程序
员逐步养成用结构化的方式思考问题和解决问题
的习惯。
(a) 顺序
(b) IF-THEN-ELSE型分支
(c) CASE型多分支;
(d) 循环
(e) 调用子程序 A
盒图的基本符号
3,PAD图
(a) 顺序 (先执行 P1后执行 P2)
(b) 选择 (IF C THEN P1 ELSE P2)
(c) CASE型多分支; (d) WHILE型循环 (WHILE C DO P);
(e) UNTIL型循环 (REPEAT P UNTIL C); (f) 语句标号; (g) 定义
PAD图的基本符号
PAD是问题分析图 (Problem Analysis Diagram)的英
文缩写, 自 1973年由日本日立公司发明以后, 已得到一
定程度的推广 。 它用二维树形结构的图来表示程序的控
制流, 将这种图翻译成程序代码比较容易 。
(a) 初始的 PAD图; (b) 使用 def符号细化处理框 P2
使用 PAD图提供的定义功能来逐步求精的例子
4.
当算法中包含多重嵌套的条件选择时, 用程
序流程图, 盒图, PAD图或后面即将介绍的过程
设计语言 (PDL)都不易清楚地描述 。 然而判定表
却能够清晰地表示复杂的条件组合与应做的动作
之间的对应关系 。
一张判定表由四部分组成,左上部列出所有
条件,左下部是所有可能做的动作,右上部是表
示各种条件组合的一个矩阵,右下部是和每种条
件组合相对应的动作。判定表右半部的每一列实
质上是一条规则,规定了与特定的条件组合相对
应的动作。
5.
判定表虽然能清晰地表示复杂的条件组合与
应做的动作之间的对应关系,但其含义却不是一
眼就能看出来的,初次接触这种工具的人要理解
它需要有一个简短的学习过程。此外,当数据元
素的值多于两个时判定表的简洁程度也将下降。
判定树是判定表的变种,也能清晰地表示复
杂的条件组合与应做的动作之间的对应关系。
1 2 3 4 5 6 7 8 9
国内乘客 T T T T F F F F
头等舱 T F T F T F T F
残疾乘客 F F T T F F T T
行李重量 ≤ 30 F F F F F F F F
免费 √
(W-30)× 2 √
(W-30)× 3 √
(W-30)× 4 √ √
(W-30)× 6 √ √
(W-30)× 8 √
(W-30)× 12 √












用判定树表示计算行李费的算法
6,过程设计语言
过程设计语言也叫结构化英语或伪码, 简记
为 PDL,它是所有正文形式的过程设计工具的统
称 。
PDL通常允许自然语言(例如英语)的词汇与
某种结构化程序设计语言的语法结构混合在一起,
现今大多数 PDL都以某种流行的高级程序设计语
言作为基础,一般来讲,PDL描述不能够直接编
译。
结构化英语应具有下述特性:
1)关键字采用固定语法并支持并支持结构化
构件、数据说明机制和模块化。
2)加工部分采用自然语言描述。
3)允许说明数据结构。
4)子程序的定义与调度规则不受具体接口方
式的影响。
例 商店业务处理系统中的 ? 检查发货单 ?
IF the invoice exceeds $500 THEN ( 发货单金额超过 500元 )
IF the account has any invoice more than 60 days overdueTHEN( 欠款超过
60天 )
The confirmation pending resolution of the debt( 在偿还欠款前不予批准 )
ELSE(account is in good standing) ( 欠款没有超期 )
Issue confirmation and invoice( 发行批准书和发货单 )
ENDIF
ELSE(invoice $500 or less)( 发货单金额没有超过 500元 )
IF the account has any invoice and more than 60 days overdue THEN( 欠款超
过 60天 )
Issue confirrmation,invoice and write messagy on credit action report( 发
行批准书, 发货单和赊欠报告 )
ELSE(account is in good standing) ( 欠款没有超期 )
Issue confirmation and invoice( 发行批准书和发货单 )
ENDIF
ENDIF
三,详细设计规格说明与复审
1.详细设计说明书规范
详细设计说明书是详细设计阶段的文档, 它
是程序运行过程的详细描述 。
2,复审
复审是指对设计文档的复审 。
1)复审原则 复审的目的是为了及早程序中的
错误,一般不请用户和其他领域的代表参加。复
审中提出的问题应做详细记录,但不谋求当场解
决。复审结束前,应做出本次复审能否通过的结
论。
2) 复审的主要内容 审查模块的设计是否满足功能
和性能要求,选择的算法和数据结构是否合理、是否符
合编码语言特性,设计描述是否简单清晰等。
3) 复审的方式 复审分正式和非正式两种方式,非
正式复审的特点是参加人员少,均为同行,方便灵活。
? 走查 ? 就是一种非正式复审,复审时有一名设计人员
逐行宣读设计资料,由到会同行跟随他指出的次序一行
行的往下审查,发现问题就做好记录,然后根据多数参
加者的意见,决定是否通过该设计资料。正式复审除软
件开发人员外,还邀请用户代表和领域专家参加,通常
采用答辩方式,回答与会者的问题并记录各种重要的评
审意见。
第六节 面向数据结构的设计方法
在诸多应用领域中,信息都有清楚的层次结
构、输入数据、存储的信息 (数据库或文件 )以及
输出数据都可能有独特的结构。数据结构既影响
程序的结构又影响程序的处理过程,重复出现的
数据通常由具有循环控制结构的程序来处理,选
择数据 (即,可能出现也可能不出现的信息 )要用
带有分支控制结构的程序来处理。层次的数据组
织通常和使用这些数据的程序的层次结构十分相
似。
面向数据结构的设计方法就是根据数据结构
的表示获取软件的表示,它的最终目标是得出对
程序处理过程的描述。
这种设计方法并不明显地使用软件结构的概
念,模块是设计过程的副产品,对于模块独立原
理也没有给予应有的强调。因此,这种方法最适
合于在详细设计阶段使用,也就是说,在完成了
软件结构设计之后,可以使用面向数据结构的方
法来设计每个模块的处理过程。
使用面向数据结构的设计方法, 首先必须分
析和确定数据结构 。 本节先介绍描绘数据结构的
工具 Jackson图, 然后介绍 Jackson程序设计的基
本过程 。
一, Jackson图
虽然程序中实际使用的数据结构种类繁多,
但是它们的数据元素彼此间的逻辑关系却只有顺
序、选择和重复三类,因此,逻辑数据结构也只
有这三类。
1.
顺序结构的数据由一个或多个数据元素组成,
每个元素按确定次序出现一次。图是表示顺序结
构的 Jackson图的一个例子。
A
B C D
A由 B,C,D三个元素顺序组成 (每个元素只出现一次, 出
现的次序依次是 B,C和 D)
顺序结构
2,选择结构
选择结构的数据包含两个或多个数据元素, 每次使
用这个数据时按一定条件从这些数据元素中选择一个 。
A
Bo Co Do
根据条件 A是 B或 C或 D中的某一个 (注意:在 B,C和 D
的右上角有小圆圈做标记 )
选择结构
3,重复结构
重复结构的数据,根据使用时的条件由一个数据元素
出现零次或多次构成。
A
B*
A由 B出现 N次 (N≥ 0) (注意:在 B的右上角
有星号标记 )
重复结构
二, Jackson方法
Jackson结构程序设计方法基本上由下述五个
步骤组成 。
(1) 分析并确定输入数据和输出数据的逻辑
结构, 并用 Jackson图描绘这些数据结构 。
( 2) 找出输入数据结构和输出数据结构中有
对应关系的数据单元。所谓有对应关系是指有直
接的因果关系,在程序中可以同时处理的数据单
元 (对于重复出现的数据单元必须重复的次序和
次数都相同才可能有对应关系 )。
( 3) 用下述三条规则从描绘数据结构的
Jackson图导出描绘程序结构的 Jackson 图。
第一,为每对有对应关系的数据单元,按照
它们在数据结构图中的层次在程序结构图的相应
层次画一个处理框 (注意,如果这对数据单元在
输入数据结构和输出数据结构中所处的层次不同,
则和它们对应的处理框在程序结构图中所处的层
次与它们之中在数据结构图中层次低的那个对
应 )。
第二, 根据输入数据结构中剩余的每个数据
单元所处的层次, 在程序结构图的相应层次分别
为它们画上对应的处理框 。
第三, 根据输出数据结构中剩余的每个数据
单元所处的层次, 在程序结构图的相应层次分别
为它们画上对应的处理框 。
总之,描绘程序结构的 Jackson图应该综合输
入数据结构和输出数据结构的层次关系而导出来。
在导出程序结构图的过程中,由于改进的
Jackson图规定在构成顺序结构的元素中不能有
重复出现或选择出现的元素,因此可能需要增加
中间层次的处理框。
( 4) 列出所有操作和条件 (包括分支条件和
循环结束条件 ),并且把它们分配到程序结构图
的适当位臵 。
( 5) 开发软件过程性描述 。
例 一个正文文件由若干个记录组成,每个
记录是一个字符串。要求统计每个记录中空格字
符的个数,以及文件中空格字符的总个数。要求
的输出数据格式是,每复制一行输入字符串之后,
另起一行印出这个字符串中的空格数,最后印出
文件中空格的总个数。
用 Jackson图描绘的输入 /输出数据结构的,并用一对
虚线箭头把有对应关系的数据单元连接起来,以突出这
种对应关系。接下来根据相应规则,从数据结构图导出
程序结构图,
正 文 文 件
字 符 串

字 符

空 格
0
非 空 格
0
输 出 表 格
表 格 体 空 格 总 数
串 信 息

字 符 串 空 格 数
I I
I
S
(a) 输入数据结构; (b) 输出数据结构
列出所有操作和条件,统计空格个数需要的操作
和和条件如下:
( 1) 停止 ( 2) 打开文件
( 3) 关闭文件 ( 4) 印出字符数
( 5) 印出空格数 ( 6) 印出空格总数
( 7) sum:=sum+1 ( 8) totals:=totals+sum
( 9)读入字符数 ( 10) sum:=0
( 11) totals:=0 ( 12) pointer:=0
( 13) pointer:=pointer+1 I(1)文件结束
I (2)字符串结束 S (3)字符是空子符
Sum:保存空格个数变量;
Totals:保存空格总数变量;
pointer:指示当前分析的字符在字符串中的位臵变量。
把这些操作和条件分配到程序结构图的适当位臵后
统 计 空 格
印 总 数程 序 体
处 理 字 符 串

分 析 字 符 串印 字 符 串 印 空 格 数
分 析 字 符

处 理 空 格
0
处 理 空 格
0
I
I
S
描绘统计空格程序结构的 Jackson图
统 计 空 格
印 总 数程 序 体
处 理 字 符 串

分 析 字 符 串印 字 符 串 印 空 格 数
分 析 字 符

处 理 空 格
0
处 理 空 格
0
I
I
S
9
1 1
2 3 1
6
1 2
4
1 0
8 9
5
1 31 3
7
( 1 )
( 3 )
( 2 )
统计空格数 seq
打开文件
读入字符串
totals:=0
程序体 iter until文件结束
处理字符串 seq
印字符串 seq
印出字符串
印字符串 end
sum:=0
pointer:=1
分析字符串 iter until字符串结束
分析字符串 select字符是空格
处理空格 seq
sum:=sum+1
pointer:=pointer+1
处理空格 end
分析字符 or字符不是空格
处理非空格 seq
pointer:=pointer+1
处理非空格 end
分析字符 end
分析字符串 end
印空格数 seq
印出空格数
印空格数 end
totals:=totals+sum
读入字符串
处理字符串 end
程序体 end
印总数 seq
印出空格总数
印总数 end
关闭文件
停止
统计空格数 end
写出“图书管理系统”的软件设计书