遇到的问题,都有解决方案,希望我的博客能为你提供一点帮助。
教材参考《软件工程导论(第六版)》
七、 层次图(H图)与HIPO图
1、概述
1.1、层次图(Hierarchy Chart / H图)
核心定义
- 目的:描述软件系统的层次结构,体现模块的从属关系。
- 适用阶段:自顶向下设计(Top-Down Design)的核心工具。
- 形态特征:
- 树状结构,根节点为系统顶层模块。
- 每个父模块分解为多个子模块。
- 不展示模块间数据流或控制流。
1.2、HIPO图(Hierarchy + Input-Process-Output)
核心组成
- H图(层次图):模块分解结构,附加追踪编号。
- IPO图:为每个模块定义输入、处理逻辑、输出三要素。
关键特征
- 可追踪性:模块编号体系(如
1.2.3
)明确层级关系。 - 设计完整性:H图描述结构,IPO图补充行为。
- IBM标准格式:常用于传统结构化方法,与数据字典配合使用。
1.3、层次图 vs. HIPO图对比
维度 | 层次图 | HIPO图 |
---|---|---|
核心目标 | 模块结构分解 | 模块结构+行为设计 |
信息维度 | 仅层次关系 | 层次+输入/处理/输出细节 |
可追溯性 | 无编号体系 | 严格编号支持模块追踪 |
设计深度 | 宏观架构 | 宏观到微观的完整设计 |
适用阶段 | 初步设计 | 详细设计阶段 |
2、符号
H图
HIPO图
3、例子
H图
HIOP图
八、 结构图
1、概述
步骤1:确定系统边界。步骤2:构建模块层次树。步骤3:定义调用关系。步骤4:标注数据流。步骤5:处理特殊逻辑。步骤6:连接数据存储。步骤7:验证与优化
2、符号
图形符号 | 名称 | 含义说明 | 应用场景示例 |
---|---|---|---|
▢ | 模块框 | 表示独立功能单元,通常以"动词+名词"命名 | 用户管理模块 订单处理模块 |
──── | 调用关系线 | 表示模块间的单向调用关系 | 订单模块 → 支付模块 |
⭯──→ (空心圆箭头) | 数据流箭头 | 表示模块间传递数据结构,通常伴随数据元素说明 | 传递订单数据:{订单ID, 金额, 商品列表} |
●──→ (实心圆箭头) | 控制信息箭头 | 表示传递控制标志或状态码,影响程序执行流程 | 传递支付验证状态:{状态码: 200, 错误信息: null} |
3、例子
九、面向数据流的设计方法
面向数据流的设计(Data Flow-Oriented Design)是一种基于数据流图(DFD)的结构化设计方法,旨在将系统的数据流程转换为模块化的软件结构。
1、步骤
1.1.绘制数据流图(DFD)
使用加工(Process)、数据流(Data Flow)、数据存储(Data Store)和外部实体(External Entity)表示系统的逻辑模型。
1.2.识别数据流类型
变换流(Transform Flow):数据经历“输入→核心处理→输出”的线性流程(如计算账单)。
事务流(Transaction Flow):数据根据类型触发不同处理分支(如订单处理)。
1.3.映射到结构图(Structure Chart)
变换分析:针对变换流,识别核心处理(变换中心),将DFD转换为分层模块结构。
事务分析:针对事务流,设计主模块调度不同事务处理分支。
1.4.优化与细化
合并冗余模块、简化接口、调整模块层次,确保高内聚低耦合。
补充模块的详细逻辑(如伪代码或流程图)。
2、变换分析步骤
2.1、第一级分解
- 顶层结构:
- Cm(主控模块):协调输入、变换中心、输出。
- Ca(输入控制模块):管理数据接收。
- Ct(变换中心控制模块):处理核心逻辑。
- Ce(输出控制模块):管理结果输出(如生成报告)。
2.2、第二级分解
- 输入通路:将输入流中的每个处理映射为Ca下的模块(如“验证数据”→“格式化数据”)。
- 变换中心:将核心处理映射为Ct下的模块(如“计算总价”→“检查库存”)。
- 输出通路:将输出流中的处理映射为Ce下的模块(如“生成确认”→“发送邮件”)。
模块
第二级分解结果:
3.事务分析步骤
步骤1:复查基本系统模型与数据流图
确保数据流图中存在明确的事务中心(N),并识别:
接收通路(输入流):L、M。
发送通路(分支流):A、B、C三条通路。
步骤2:确定事务中心与边界
事务中心:图中 N节点,负责接收输入并决定分支路径(如根据输入数据选择A、B、C通路)。
接收分支边界:从外部输入到事务中心的路径(如L→M)。
发送分支边界:从事务中心到各分支模块的路径(如J→K)。
步骤3:第一级分解
顶层模块(Cm):协调接收分支(ML)、事务中心(N)、发ABC)。
接收分支(Ca):处理输入数据。
事务中心(Ct):作为调度核心,不处理具体逻辑,仅决定调用哪个分支模块。
发送分支(Ce):可能包含公共输出处理。
步骤4:第二级分解(关键步骤)
(1) 接收分支的映射
从事务中心(N)反向沿接收通路,将每个处理映射为 接收分支的子模块
(2) 发送分支的映射
调度模块(N):不直接处理数据,而是调用下级活动模块。
活动模块:每个分支路径映射为一个独立模块,
(3) 输出分支的映射
步骤5:优化与验证
高内聚:每个活动模块(如Q、R)仅处理单一功能。
低耦合:模块间通过事务中心(Ct)调度,避免直接依赖。
执行顺序:由Ct控制
完整例子:
十、程序流程图
1、概述程序流程图
程序流程图(Program Flowchart)是一种用图形化方式描述算法或程序逻辑的工具,通过标准化的符号和箭头连接,直观展示程序的执行流程。以下是其核心要点:
1.1.绘制规则
自上而下:流程方向通常从顶部开始,向下延伸。
单一出口/入口:除判断框外,每个符号只有一个入口箭头;处理框只有一个出口,判断框有两个(分支)。
避免交叉:通过合理布局或连接点减少交叉线。
注释:可添加文字说明增强可读性。
2、符号
2.1.核心符号解释
起止框(椭圆形):表示程序的开始或结束。
处理框(矩形):代表计算、赋值等操作(如
x = x + 1
)。输入/输出框(平行四边形):标注数据的输入或输出(如
打印结果
)。判断框(菱形):用于条件分支(如
x > 0?
),出口标注“是/否”或“Y/N”。流向箭头:指示程序执行的顺序方向。
连接点(圆形):简化复杂流程,标记跨页或远距离流程的衔接。
3.程序结构
4.例子(身份证号验证模块的流程图)
4.1基于描述画流程图 (旅客信息核验)
4.2基于伪码画流程图
#include <stdio.h>
void main()
{
int i, Sum;
Sum = 0;
for(i = 1; i <= 100; i++)
Sum += i;
printf("总和为 %d\n", Sum);
}
十一、盒图 (N-S图)
1、N-S图概述
盒图(N-S图,又称Nassi-Shneiderman图)是一种结构化程序设计的图形化工具,通过矩形框的嵌套严格表示程序的控制结构,避免传统流程图的随意跳转,确保逻辑清晰。
2、符号
(a) 顺序;(b) 选择;(c) CASE 多分支;(d) 循环;(e) 调用子程序 A
3.盒图绘制步骤
3.1. 确定程序的基本结构
盒图的核心是顺序、分支、循环和调用四种基本结构,需先明确程序的逻辑类型:
- 顺序结构(图a):任务按步骤依次执行。
- 分支结构(图b/c):根据条件选择不同路径。
- 循环结构(图d):重复执行某段代码直到条件不满足。
- 调用(图e)
3.2.按顺序绘制盒图
如下:
顺序:
分支:IF ELSE
循环:
调用:无
盒图绘制如下:
4.例子
十二、PAD图
1、PAD图简述
PAD图以树形结构向右展开,通过纵向分层和横向分支表示逻辑关系:
- 纵向:表示顺序执行(如任务1→任务2→任务3)。
- 横向:表示条件分支或循环嵌套(如IF-THEN-ELSE、CASE分支)。
2.符号
3.PAD图绘制例子
4.例子
十三、判定表
1.概述
组成部分 | 说明 |
---|---|
左上部 | 列出所有条件 |
左下部 | 所有可能做的动作 |
右上部 | 表示各种条件组合的一个矩阵 |
右下部 | 和每种条件组合相对应的动作 |
判定表的优点:
能清晰地表示复杂的条件组合与应做的动作之间的对应关系。
判定表的缺点:
判定表的含义不是一眼就能看出来的,初次接触这种工具的人理解它需要有一个简短的学习过程。
当数据元素的值多于两个时,判定表的简洁程度也将下降。
2、例子
判定表如下:
十四、判定树
1、判定树概述
判定树是一种树形结构模型,通过节点和分支表示条件判断与执行逻辑,广泛用于分类、决策和算法设计。图中展示了其核心组成:
- 根节点:起始判断条件(如“条件”框)。
- 内部节点:中间判断或操作(如“CASE条件”“循环条件”)。
- 叶节点:最终操作或结果(如“部分”“第三个任务”)。
- 分支:连接节点的路径,标注条件取值(如
T/F
、值1~值n
)。
2、例子
十五、McCabe环形复杂度方法
1. 基本概念
流图(Control Flow Graph)
- 简化的控制流模型,忽略具体操作细节,聚焦分支与循环结构:
- 结点:代码块或控制点,用圆表示,一个圆代表一条或多条语句。
- 边:无条件或有条件跳转路径,箭头线称为边,代表控制流。在流图中一条边必须终止于一个结点,即使这个结点并不代表任何语句。
- 区域:边与结点围成的闭合区域(含图外部区域)
复合条件分解
若条件中含布尔运算符(如 if (A && B)
),需拆分为多个简单条件结点:
// 原始复合条件 → 分解为多个简单条件
if (A && B) { ... }
// 分解后流图:
// 结点1: if (A)
// 结点2: if (B) → 分支语句
// 结点3: else → 结束
2.流图映射
对于顺序结构,一个顺序处理序列和下一个选择或循环的开始语句,可以映射成流图中的一个结点。
对于选择结构,开始语句映射成一个结点;两条分支至少各映射成一个结点;结束映射成一个结点。
对于循环结构,开始和结束语句各映射成一个结点。
复合条件映射
3. 环形复杂度计算
通过流图计算控制流复杂度(三种等效公式):
公式 | 示例说明 |
---|---|
V(G) = 区域数 | 流图分为4个区域 → V(G)=4 |
V(G) = E - N + 2(E边数,N结点数) | E=11,N=8 → V(G)=11-8+2=5 |
V(G) = P + 1(P判定节点数) | 判定节点数4 → V(G)=4+1=5 |