结构程序设计经典定义:如果一个程序的代码块仅仅通过顺序、选择和循环这3种基本控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的。
结构程序设计更全面的定义:结构程序设计是尽可能少用GO TO语句的程序设计方法。最好仅在检测出错误时才使用GO TO语句,而且应该总是使用前向GO TO语句。
如果只允许使用顺序、IF-THEN-ELSE型分支和DO-WHILE型循环这3种基本控制结构,则称为经典的结构程序设计;
如果除了上述3种基本控制结构之外,还允许使用DO-CASE型多分支结构和DO-UNTIL型循环结构,则称为扩展的结构程序设计;
如果再允许使用LEAVE(或BREAK)结构,则称为修正的结构程序设计。
结构程序设计技术是进行详细设计的逻辑基础
系统响应时间:从用户完成某个控制动作(例如,按回车键或单击鼠标),到软件给出预期的响应(输出信息或做动作)之间的这段时间。
两个重要属性:长度、易变性
长度:时间过长,用户就会感到紧张,过短,加快用 户操作节奏,可能会犯错误
易变性:系统响应时间相对于平均响应时间的偏差 即使系统响应时间较长,响应时间易变性低也有助于用 户建立起稳定的工作节奏
用户帮助设施:常见的分为集成的和附加的两类
设计用户帮助设施要解决以下问题
1.在用户与系统交互期间,是否在任何时候都能获得关于系统任何功能的帮助信息?有两种选择:提供部分功能的帮助信息和提供全部功能的帮助信息。
2.用户怎样请求帮助?有3种选择:帮助菜单,特殊功能键和HELP命令。
3.怎样显示帮助信息?有3种选择:在独立的窗口中,指出参考某个文档(不理想)和在屏幕固定位置显示简短提示。
4.用户怎样返回到正常的交互方式中?有两种选择:屏幕上的返回按钮和功能键。
5.怎样组织帮助信息?有3种选择:平面结构,信息的层次结构和超文本结构
出错信息处理:出错信息和警告信息,是出现问题时交互式系统给出的“坏消息”。
命令交互:在越来越多的应用软件中,人机界面设计者都提供了“命令宏机制”。 在理想的情况下,所有应用软件都有一致的命令使用方法
用户界面设计是一个迭代的过程,通常先创建设计模型,再用原型实现这个设计模型,并由用户试用和评估,然后根据用户意见进行修改。
一般交互指南:涉及信息显示、数据输入和系统整体控制
信息显示指南:多种不同方式“显示”信息:用文字、图形和声音;按位置、移动和大小;使用颜色、分辨率和省略。
数据输入指南:用户的大部分时间用在选择命令、输入数据和向系统提供输入。
程序流程图又称为程序框图,它是使用最广泛的描述过程设计的方法
程序流程图中使用的符号(a) 选择(分支); (b) 注释; (c) 预先定义的处理; (d) 多分支; (e) 开始或停止; (f) 准备; (g) 循环上界限; (h) 循环下界限; (i) 虚线; (j) 省略符; (k) 并行方式; (l) 处理; (m) 输入输出; (n) 连接; (o) 换页连接; (p) 控制流
程序流程图的主要缺点如下
(1) 程序流程图本质上不是逐步求精的好工具,它诱使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构
(2) 程序流程图中用箭头代表控制流,因此程序员不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制
(3) 程序流程图不易表示数据结构
又称为N-S图,具有以下特点
(1) 功能域(即一个特定控制结构的作用域)明确,可以从盒图上一眼就看出来
(2) 不可能任意转移控制
(3) 很容易确定局部和全程数据的作用域
(4) 很容易表现嵌套关系,也可以表示模块的层次结构
PAD图的主要优点如下
(1) 使用表示结构化控制结构的PAD符号所设计出来的程序 必然是结构化程序
(2) PAD图所描绘的程序结构十分清晰
(3) 用PAD图表现程序逻辑,易读、易懂、易记
(4) 容易将PAD图转换成高级语言源程序,这种转换可用软件工具自动完成,从而可省去人工编码的工作,有利于提高 软件可靠性和软件生产率
(5) 即可用于表示程序逻辑,也可用于描绘数据结构
(6) PAD图的符号支持自顶向下、逐步求精方法的使用
判定表能够清晰地表示复杂的条件组合与应做的动作之间的对应关系
判定表由4部分组成
左上部列出所有条件
左下部是所有可能做的动作
右上部是表示各种条件组合的一个矩阵
右下部是和每种条件组合相对应的动作
判定表右半部的每一列实质上是一条规则,规定了与特定的条件组合相对应的动作
举例:2 该乘客是国内乘客,坐的是头等舱,非残疾乘客,行李重量>30kg,所要缴纳的行李费为(W-30)*4 下边的X代表对应动作要执行
过程设计语言(PDL)也称为伪码。是用正文形式表示数据和处理过程的设计工具
PDL有下述特点
(1)关键字的固定语法,它提供了结构化控制结构、数据说明和模块化的特点。如,if…fi(或endif)等 (2) 自然语言的自由语法,它描述处理特点
(3) 数据说明的手段。应该既包括简单的数据结构(例如纯量和数组),又包括复杂的数据结构(例如,链表或层次的数据结构)
(4) 模块定义和调用的技术,应该提供各种接口描述模式
PDL有下述优点
1.可以作为注释直接插在源程序中间
2.可以使用普通的正文编辑程序或文字处理系统,很方便地完成PDL的书写和编辑工作
3.已经有自动处理PDL的程序存在,而且可以自动由PDL生成程序代码
PDL的缺点是不如图形工具形象直观,描述复杂的条件组合与动作间的对应关系时,不如判定表清晰简单
Jackson结构程序设计方法基本上由下述5个步骤组成
(1) 分析并确定输入数据和输出数据的逻辑结构,并用Jackson图描绘这些数据结构
(2) 找出输入数据结构和输出数据结构中有对应关系的数据单元
(3) 用下述3条规则从描绘数据结构的Jackson图导出描绘程序结构的Jackson图
① 为每对有对应关系的数据单元,按照它们在数据结构图中的层次在程序结构图的相应层次画一个处理框
② 根据输入数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框
③ 根据输出数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框
(4) 列出所有操作和条件(包括分支条件和循环结束条件),并且把它们分配到程序结构图的适当位置
(5) 用伪码表示程序。 Jackson方法中使用的伪码和Jackson图是完全对应的
顺序结构 选择结构 重复结构
A seq A select cond1 A iter until(或while) cond
B B B
C A or cond2 A end
D C
A end A or cond3
D
A end
McCabe方法根据程序控制流的复杂程度定量度量程序的复杂程度,这样度量出的结果称为程序的环形复杂度
流图实质上是“退化了的”程序流程图,描绘程序的控制流程,不表现对数据的具体操作以及分支或循环的具体条件
下图a代表程序流程图,b代表由a转换的流图
a的上边应该有一个开始节点 最下边也应该还有一个结束节点
一共是8条边,7个节点 环形复杂度 = 8 - 7 + 2 = 3 = 判定节点数 + 1
计算环形复杂度的方法
(1) 流图中线性无关的区域数等于环形复杂度
(2) 流图G的环形复杂度V(G)=E-N+2,其中,E是流图中边的条数,N是结点数
(3) 流图G的环形复杂度V(G)=P+1,其中,P是流图中判定结点的数目
环形复杂度的用途
对测试难度的一种定量度量,也能对软件最终的可靠性给出某种预测。 实践表明,模块规模以V(G)≤10为宜
根据程序中运算符和操作数的总数来度量程序的复杂程度。令N1为程序中运算符出现的总次数,N2为操作数出现的总次数,程序长度N定义为:N=N1+N2
程序中使用的不同运算符(包括关键字)的个数n1,以及不同操作数(变量和常数)的个数n2。Halstead给出预测程序长度的公式如下:H=n1 log2 n1+n2 log2n2
多次验证都表明,预测的长度H与实际长度N非常接近。 Halstead还给出了预测程序中包含错误的个数的公式如下:E=N log2 (n1+n2)/3000