详细设计阶段的任务还不是具体地编写程序,而是要设计出程序的“蓝图”,以后程序员将根据这个“蓝图”写出实际的程序代码。
结构程序设计 (master)
如果一个程序的代码块仅仅通过顺序、选择和循环这三种控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的。
三种基本控制结构
关于GOTO语句
- 上面关于结构化程序经典定义过于狭隘,结构程序设计本质上并不是无GO TO语句的编程方法,而是一种使程序代码容易阅读、容易理解的编程方法
- 大多数情况下,无GO TO的代码确实是容易阅读、容易理解,但在某些情况下,为达到容易阅读和容易理解的目的,需要使用GO TO语句
- 结构程序设计是尽可能少用GO TO语句的程序设计方法。最好仅在检测出错误时才使用GO TO语句,而且应该总是使用前向GO TO语句
- 但是一般题目中问一段代码为什么不是结构化程序,很大可能是使用了GOTO语句
经典的结构程序设计
- 如果只允许使用顺序、IF-THEN-ELSE型分支和DO-WHILE型循环这三种基本控制结构,则称为经典的结构程序设计
扩展的结构程序设计
- 如果除了上述三种基本控制结构之外,还允许使用DO-CASE型多分支结构和DO-UNTIL型循环结构,则称为扩展的结构程序设计
修正的结构程序设计
- 如果再加上允许使用LEAVE(或BREAK)结构,则称为修正的结构程序设计。
人机界面设计 (cut)
人机界面设计是接口设计的一个组成部分
设计问题
- 系统响应时间
- 用户帮助设施
- 出错信息处理
- 命令交互
设计过程
- 用户界面设计是一个迭代的过程,也就是说,通常先创建设计模型,再用原型实现这个设计模型,并由用户试用和评估,然后根据用户的意见进行修改
界面设计指南
一般交互指南
- 保持一致性
- 提供有意义的反馈
- 在执行有较大破坏性动作之前要求用户确认
- 允许取消大多数操作
- 减少在两次操作之间必须记忆的信息量
- 提高对话、移动和思考的效率
- 允许犯错误
- 按功能对动作分类,并据此设计屏幕布局
- 提供对用户工作内容敏感的帮助设施
- 用简单动词或名词短语作为命令名
信息显示指南
- 只显示与当前工作内容有关的信息。
- 用户在获得有关系统的特定功能的信息时,不必看到与之无关的数据、菜单和图形。
- 不要用数据淹没用户
- 使用一致的标记、标准的缩写和可预知的颜色
- 允许用户保持可视化的语境
- 产生有意义的出错信息
- 使用大小写、缩进和文本分组以帮助理解
- 使用窗口分隔不同类型的信息
- 使用“模拟”显示方式表示信息
- 高效率地使用显示屏
数据输入指南
- 尽量减少用户的输入动作
- 保持信息显示和数据输入之间的一致性
- 允许用户自定义输入
- 交互应该是灵活的
- 使在当前动作语境中不适用的命令不起作用
- 让用户控制交互流
- 对所有输入动作都提供帮助
- 消除冗余的输入
过程设计的工具 (master)
图形、表格、语言
程序流程图
- 程序流程图又称为程序框图,是历史最悠久使用最广泛的描述过程设计的方法,然而也是用得最混乱的一种方法
- 缺点:
- 绘制随意,容易只考虑流程控制而不考虑全局结构,而破坏结构化程序设计
- 不容易表示数据结构
- 程序流程图中使用的符号
盒图(N-S图)
盒图没有箭头,因此不允许随意转移控制。坚持使用盒图作为详细设计的工具,可使程序员逐步养成用结构化的方式思考问题和解决问题的习惯
能保证设计出的程序一定是结构化的
但是绘制的时候受空间限制,难以扩充
- 盒图的基本符号
PAD图(Problem Analysis Diagram)
它用二维树形结构的图来表示程序的控制流,将这种图翻译成程序代码比较容易
与盒图相比,不受空间限制,易于扩充
可保证设计出来的程序一定是结构化的
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提供的定义功能来逐步求精
判定表
- 当算法中包含多重嵌套的条件选择时,判定表能够清晰地表示复杂的条件组合与应做的动作之间的对应关系
判定树
- 比判定表直观,包含判定的先后顺序
- 父节点:判定条件
- 叶子节点:一个动作
过程设计语言(PDL: Process Design Language)
- 伪代码
程序复杂度的定量度量 (master)
常用的方法有McCabe方法(采用流图)、Halstead方法,下面仅介绍第一种
McCabe 方法
流图
为了突出表示程序的控制流,可以使用流图(也称为程序图)
流图仅描绘程序的控制流程,完全不表现对数据的具体操作以及分支或循环的具体条件。
流图用圆表示节点,一个圆代表一条或多条语句(如果多条语句在一个顺序结构上,可以省略中间,只画两边的节点)
流图中的箭头线称为边,和程序流程图中的箭头线类似,代表控制流
由边和节点围成的面积称为区域,区域数应该包括图外部未被围起来的区域。
基本结构:
- 把程序流程图映射成流图(a)程序流程图;(b)流图
PDL翻译成流图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15procedure: sort
do while records remain
read record;
if record field1 = 0
then process record;
store in buffer;
incremert counter;
elseif record filed2 = 0
then reset counter;
else process record;
store in file;
endif
endif
enddo
end- 由包含复合条件的PDL映射成的流图
流图环形复杂度的计算
- 流图中的区域数等于环形复杂度
- 流图G的环形复杂度V(G)=E-N+2,其中E是流图中边的条数,N是流图中节点数
- 流图G的环形复杂度V(G)=P+1,其中P是流图中判定节点的数目
- 举个栗子:
- 上图中共有四个区域,故环形复杂度为4
- 上图中共有11条边,9个点,所以环形复杂度位:11 - 9 + 2 = 4
- 上图中共有三个判定节点,分别为”1”, “2,3”, “6”,所以环形复杂度为:3 + 1 = 4
PS:
- 在计算区域数的时候别忘了包括最外围的区域
- 在计算判定节点的时候,不仅包括条件分支的判断,循环判定的节点也算