• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
软件工程 第六章
 

软件工程 第六章

on

  • 252 views

 

Statistics

Views

Total Views
252
Views on SlideShare
231
Embed Views
21

Actions

Likes
0
Downloads
0
Comments
0

1 Embed 21

http://www.ggit.info 21

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • 逻辑设计:设计数据库的逻辑结构,与具体的 DBMS 无关,主要反映业务逻辑。     物理设计:设计数据库的物理结构,就是根据数据库的逻辑结构,结合选定的 DBMS ,设计数据库的存储结构、存取方式等。   代码设计是一项重要的工作,合理的编码结构是使管理信息系统具有生命力的重要因素。 系统的详细 设计 过程是根据管理和用户的需要先进行 输出设计 ,然后反过来根据 输出 所要求获得信息来进行 输入设计 。 输出 信息的使用者是用户,故 输出 的内容与 格式 等是用户最
  • (单入单出:一个模块只有 一个入口 以及 一个出口 )
  • (单入单出:一个模块只有 一个入口 以及 一个出口 )
  • 为 方便 起见
  • xerox 是富士施乐, 2000 年被日本富士收购了。主要做打印机,复印机之类的买卖。
  • 程序流程图中使用的符号: (a) 选择(分支); (b) 注释; (c) 预先定义的处理; (d) 多分支; (e) 开始或停止; (f) 准备; (g) 循环上界限; (h) 循环下界限; (i) 虚线; (j) 省略符; (k) 并行方式; (l) 处理; (m) 输入输出; (n) 连接; (o) 换页连接; (p) 控制流
  • 程序流程图不易表示层次结构 ; · 程序流程图不易表示数据结构 和模块调用关系
  • 基本过程结构清晰、易懂; 数据的处理与变换不清楚且不易修改;
  • 不允许违背结构程序设计精神的图形工具 没有箭头,因此不允许随意转移控制。
  • 使用表示结构化控制结构的 PAD 符号所设计出来的程序必然是结构化程序。
  • Jackson 方法的 目标是获得简单清晰的设计方案 ,因为这样的方案易于理解、易于修改。为了达到这个目标, Jackson 方法的设计原则是:使程序结构同数据结构相对应。
  • 第三个: A 或者是元素 B ,或者不出现 i :条件的编号
  • 层次图中的一个方框通常代表一个模块;而 Jackson 图即使在描绘程序结构时 ,一个方框也并不代表一个模块,通常一个方框只代表几个语句。
  • (注意:在导出程序结构图的过程中,由于改进的 Jackson 图规定在构成 顺序结构的元素 中不能有 重复出现或选择出现的元素 ,因此可能需要增加 中间层次的处理框 。)
  • 第三个: A 或者是元素 B ,或者不出现 i :条件的编号
  • 第三个: A 或者是元素 B ,或者不出现 i :条件的编号
  • 第三个: A 或者是元素 B ,或者不出现 i :条件的编号
  • 结构冲突:输入数据与输出数据找不到对应关系的情况就称为 结构冲突 。解决的办法就是 引入中间数据结构或中间文件 , 将冲突部分隔离开来 ,建立多个程序结构,再利用中间文件把它们联系起来,构成一个系统的整体。
  •    利用 McCabe 环复杂度度量值时,有几点说明。     ( 1 ) 环路复杂度取决于程序控制结构的复杂度。当程序的分支数目或循环数目时其复杂度也增加。环路复杂度与程序中覆盖的路径条数有关。     ( 2 ) 环路复杂度是可增加的。例如,模块 A 的复杂度为 3 ,模块 B 的复杂度为 4 ,则模块 A 与模块 B 的复杂度是 7 。     ( 3 ) McCabe 建议,对于复杂度超过 10 的程序,应分成几个小程序,以减少程序中的错误。
  • 当程序内分支数或循环个数增加时, 环形复杂度 也随之增加,因此它 是对测试难度的一种定量度量 ,也能对软件最终的可靠性给出某种预测
  • 算术运算符、逻辑运算符、关系运算符

软件工程 第六章 软件工程 第六章 Presentation Transcript

  • 详细设计的目标详细设计的根本目标是:
  • 详细设计的基本任务 为每个模块进行详细的算法设计; 为模块内的数据结构进行设计; 对数据库进行物理设计; 其他设计: 确定程序模块间的详细接口,根据软件 系统的类型,还可能要进行代码设计、输入 输出格式设计、人机界面设计等设计; 编写详细设计说明书; 对详细设计进行评审。
  • 第 6 章详细设计(模块设计)
  • 第 6 章 详细设计(模块设计) 6.1 结构化程序设计(S P) 6.2 人机界面设计 6.3 过程设计工具 6.4 面向数据结构的设计方法 6.5 程序复杂程度的定量度量
  • 6.1 结构化程序设计 一 . 结构化程序设计 (S P) 的主要思想 需求分析阶段 总体设计阶段 详细设计阶段 S A 方法 S D 方法 S P 方法 主要思想 设计方法:自顶向下、逐步求精 结构化程序设计:指导人们用良好的思想方法 开发出易理解、易验证的程序。
  • 6.1 结构化程序设计一 . 结构化程序设计 (S P) 的主要思想
  • 6.1 结构化程序设计 二 . 结构化程序设计 (S P) 的三种基本控制结构 1966 年, C . B o hm 和 G . J a c o p ini 证明:只 用三种基本控制结构就能实现任何单入口单出口的 程序。 结构化程序设计的三种基本控制结构 exp F A T F exp T A B A B 顺序结构 分支结构 循环结构
  • 图 6.2 其他常用的控制结构
  • 6.1 结构化程序设计 开始 P141 习题 4 p 右侧程序流程图是 g 一个非结构化的程 序 q 停止
  • 6.1 结构化程序设计 开始 开始 p p g g q q 停止 停止 当型循环? 直到型循环?
  • 6.1 结构化程序设计 三 . 结构化程序设计 (S P) 的设计准则 一个程序模块内的基本结构(即顺序、选 择和循环)应尽量少; 将一个基本结构组成一个容易识别的程序 块; 程序块的入 / 出口都只有一个
  • 6.1 结构化程序设计 四 . 如何把非结构化的程序 转化成结构化的程序1. 重复编码法: 1 1 2 4 2 4 goto 语句 3 3 4 非结构化程序 结构化程序
  • 6.1 结构化程序设计 四 . 如何把非结构化的程序 转化成结构化的程序 2. 布尔标识法:WHILE p DO p F BEGIN   T  … F q T IF q THEN GOTO L1; A; A B B  END; L1L1: … 非结构化程序
  • 6.1 结构化程序设计 四 . 如何把非结构化的程序 转化成结构化的程序 b:=Truebool := true;WHILE (p and bool) DO BEGIN   p&b F   … T IF q THEN bool := false F q T ELSE BEGIN A; A b:=False B END B END; L1 … 结构
  • 6.1 结构化程序设计 四 . 如何把非结构化的程序 转化成结构化的程序 b:=True p F p&b F T TF q T F q T A b:=False A B B L1 L1
  • 五、结构化程序设计 经典的结构程序设计:只允许使用顺序 、 IF-THEN-ELSE 型分支和 DO-WHILE 型 循环这 3 种基本控制结构。 扩展的结构程序设计:还允许使用 DO- CASE 型多分支结构和 DO-UNTIL 型循环结 构; 修正的结构程序设计:再加上允许在循 环体中使用 LEAVE( 或 BREAK) 结构。
  • 6.1 结构化程序设计 六 . 结构化程序设计 (S P) 的优点 自顶向下、逐步求精:采用先整体后局部、先抽象 后具体的方法开发出来的软件具有良好的结构,且 开发出的程序易于理解; 单入口单出口:良好的结构特征,降低复杂度,增 强可读性,可维护性,可验证性等,从而提高软件 开发工程的成功率和生产率; 有利于程序正确性的证明。
  • 6.2 人机界面设计 人机界面概述 人机界面( Huma n- C o mp ute r Inte rfa c e ,简称 HC I )又称人 - 机 接口或用户界面,它是用户与计算机 系统交换信息的媒介,更是用户使用 计算机系统的综合操作环境。 设计用户界面不仅需要计算机科学的 理论和知识,而且需要认知心理学以 及人 - 机工程学、语言学等学科的知 识。
  • 最有影响的事件和成果 1963 年发明鼠标器的美国斯坦福研究所的 D.Engelbart ,他预言鼠标器比其他输入设备 都好,并在超文本系统、导航工具方面做了 杰出的成果 (Augmented Human Intellect project ) ,而获 1997 年 ACM 图灵奖。 10 年 后鼠标器经不断改进,成为影响当代计算机 使用的最重要成果。
  • 最有影响的事件和成果 70 年代 Xerox 研究中心 的 Alan Kay 提出了 Smalltalk 面向对象程 序设计等思想,并发明 了重叠式多窗口系统。 1989 年 Tim Berners- Lee 在日内瓦的 CERN 用 HTML 及 HTTP 开发了 WWW 网,随后出现了各种浏 览器(网络用户界面) ,使互联网飞速发展起 来。
  • 最有影响的事件和成果 90 年代美国麻省理工学 院 N.Negroponte 领导 的媒体实验室在新一代 多通道用户界面方面 (包括语音、手势、智 能体等),做了大量开 创性的工作。 90 年代美国 Xerox 公司 PARC 的首席科学家 Mark Weiser 首先提出 “无所不在计算 ( Ubiquitous
  • 6.2 人机界面设计 人机界面概述 人机界面的风格 — — 四代。 第一代界面 — — 命令和询问方式。 通信完全以正文形式并通过用户命令和用户对 系统询问的响应来完成。例如:D > run p ro g 1. e xe /d e b ug = o n /o ut=p l /in=t1 /a llo c =1000kRUN A L L O C A TIO N TO B E Q UE UE D ? > > ye sA UTO MA TIC C HE C K PO INTING INTE RVA L ? >>5
  • 6.2 人机界面设计 人机界面概述 第二代界面 — — 简单的菜单式,例如: c ho o s e p ro g ra m o p tio n tha t is d e s ire d : 1=inp ut d a ta ma nua lly 2=inp ut d a ta fro m e xis ting d a ta file 3=p e rfo rm s imp lifie d a na lys is 4=p e rfo rm d e ta ile d a na lys is 5=p ro d uc e ta b ula r o utp ut 6=p ro d uc e g ra p hic a l o utp ut 7=o the r o p tio ns c la s s e s s e le c t o p tio n? _ 这种方式与命令行方式相比不易出错,但使用起 来仍然乏味。
  • 6.2 人机界面设计 人机界面概述 第三代界面 — — 面向窗口的点选界面 ( p o int a nd p ic k inte rfa c e ) 亦称为 WIMP 界面,即:窗口( wind o ws )、 四位一体, 图标( ic o ns )、 形成桌面 ( d e s kto p ) 菜单( me nus )、 指示器( p o inting d e vic e )
  • 人机界面技术的进展1. 自然、高效的多通道交互2. 移动手持设备的人机交互3. 智能用户界面
  • 6.2 人机界面设计 一 . 设计问题 设计人机界面,必须考虑四个方面: 系统的响应时间; 用户帮助设施; 出错信息处理; 命令方式。1 )系统响应时间指当用户执行了某个控制动作后 (如,点击鼠标器等),系统做出反应的时间 (指输出信息或执行对应的动作)。 系统响应时间过长、不同命令在响应时间上的 差别过于悬殊,用户将难以接受。
  • 6.2 人机界面设计 一 . 设计问题2 )用户都希望得到联机帮助。 联机帮助设施有两类:集成式和附加式。① 集成式帮助一般都与软件设计同时考虑,上下文 敏感,整个帮助过程快捷而友好;② 附加式帮助一般是在软件完成后附上一个受限的 联机用户手册。 此外,还要考虑诸如帮助范围(仅考虑部分还是 全部功能)、用户求助的途径、帮助信息的显示 、用户如何返回正常交互工作及帮助信息本身如 何组织等一系列问题。
  • 6.2 人机界面设计 一 . 设计问题3 )出错信息处理 出错信息应选用用户明了、含义准确的 术语描述,同时还应尽可能提供一些有关 错误恢复的建议。此外,显示出错信息时 ,若辅以听觉(如铃声)、视觉(专用颜 色)刺激,则效果更佳。
  • 6.2 人机界面设计 一 . 设计问题4 )命令交互 键盘命令曾经一度是用户与软件系统之 间最通用的交互方式,随着面向窗口的界 面的出现,键盘命令虽不再是唯一的交互 形式,但许多有经验的熟练的软件人员仍 喜爱这一方式,更多的情形是菜单与键盘 命令并存,供用户自由选用。
  • 6.2 人机界面设计 二 . 设计过程 用户界面设计是一个迭代 初步设计 过程,直至与用户模型和 系统假想一致为止。创建界面 创建新界面 原型 1 原型 用户评审界面 修改设计 设计人员分析 用户评审意见 界面设计 完毕 图 12-3-1 界面设计演进过程
  • 6.3 过程设计工具 一 . 过程设计工具分类 详细设计 编码实现 •程序流程图 基于某种程序设 •盒图( N - S 图) 计语言的源程序图形 代码 •问题分析图( PAD 图) •判定树 要求:无二义性描表格 •判定表 述语言 •过程设计语言 PDL 或伪码( Psudo- code )
  • 6.3 过程设计工 具 二 . 程序流程图 历史最悠久 , 使用最广泛 ; 但使用最混乱 . 程序流程图中使用的符号
  •  程序流程图也称为程序框图,它使用五种基本控制结 构:
  • 6.3 过程设计工 具 二 . 程序流程图 优点: • 简单易用、容易修改; • 对控制流程直观、易于理解、易于复审,便于初 学者掌握。 缺点: • 诱使程序员过早考虑控制流程,而不考虑程序的 全局结构;不是逐步求精的过程。 • 采用箭头表示控制流,随意转移控制 , 导致破坏 结构程序设计的精神; • 不易表示数据结构,数据的处理与变换不清楚;
  • 6.3 过程设计工 具 三 . 盒图( N - S 图) 不允许违背结构化程序设计精神  没有箭头,因此不允许随意转移控制。 由美国 I.Nassi 和 B.Shneiderman,1973 年提出。  功能域(即一个结构的作用域)明确  不可能任意转移控制  易于确定局部和全局数据的作用域  易于表现嵌套关系和模块的层次结构 坚持使用盒图作为详细设计的工具,可以使程 序员逐步养成用结构化的方式思考问题和解决问题 的习惯。
  • 6.3 过程设计工 具 三 . 盒图( N - S 图) N - S 图的基本符号 循环条件 任务 F 条 T F 条件 T 1 2 任务 else件 then then do-while 部分 部分 部分 部分 任务 3 if-then-else 结构 if-then 结构 do-while 结构顺序结构 case 条件 do-until 值1 值2 值n 部分 子程序 case1 case2 casen 循环条件 P 调用子程序 部分 部分 部分 do-until 结构 case 结构
  • 6.3 过程设计工 具 三 . 盒图( N - S 图)例 a b k:T x1 F x2 f x4 1 2 3T F i g k Do-While x3 d eDo-Until x5 h c Do-Until x6 j
  • 6.3 过程设计工 具 四 . 问题分析图( Problem Analysis Diagram 图) PAD 图 日立公司, 1973 年发明 采用二维树形结构来表示程序的控制流。 它即克服了传统的流程图不能清晰表现程序 结构的缺点,又不像 N- S 图那样受到把全 部程序约束在一个方框内的限制,这就是其 优势所在。
  • 6.3 过程设计工 具 四 . 问题分析图( Problem Analysis Diagram 图) P1 P1 def C P1 P2 P2 L1 L2 P2 P11顺序结构 选择结构 X= ( if C the n P 1 e ls e P 2) Ln PnWHILE C P Case 分支 While 型循环结构 与分层结构 ( 用 def 细化处理框 )UNTIL C P 连接 ( 语句标号 )Until 型循环结构
  • 6.3 过程设计工 四. 问题分析图 具 ( Problem Analysis Diagram 图)开始 始 f a Until x5 i b Until x6 x4 x1 g j k结束 束 h While x3 c 1 k def x2 2 d 3 e
  • 6.3 过程设计工 具 四 . 问题分析图( Problem Analysis Diagram 图) 主要优点:  ( 1 )由该图设计出的程序必为结构化的  ( 2 )结构非常清晰,竖线的条数即程序的层次 数  ( 3 )所表现的程序逻辑易读、易懂、易记  ( 4 )可利用软件工具自动转换为高级语言源程 序  ( 5 )既可表示程序逻辑,也可描绘数据结构  ( 6 )支持自顶向下、逐步求精(利用 def ) 面向高级语言: FORTRAN , PASCAL 等都有相应
  • 6.3 过程设计工 具 五. 判 定 表 判定表 复杂的条件组合 应做的动作 : 条件 条件组合项 (所有条件) (条件组合的矩阵) 操作 操作执行项 (所有可能的动作) (与每种条件组合相应的动作)
  • 6.3 过程设计工 具 五. 判 定 表 建立判定表的步骤
  • 6.3 过程设计工 具 五. 判 定 表 判定表的分析过程
  • 6.3 过程设计工 具 五. 判 定 表 步骤 1 :求出各种判定条件可能的取 值;
  • 6.3 过程设计工 具 五. 判 定 表 步骤 2 :根据条件取值数,计算条件 组合数
  • 6.3 过程设计工 具 五. 判 定 表 步骤 3 :在判定表中列出所有条件组 合,求出各组合的操作判定值
  • 6.3 过程设计工 具五. 判 定 表
  • 6.3 过程设计工 具五. 判 定 表
  • 6.3 过程设计工 具五. 判 定 表
  • 6.3 过程设计工 具五. 判 定 表
  • 6.3 过程设计工 具五. 判 定 表
  • 6.3 过程设计工 具五. 判 定 表
  • 6.3 过程设计工 具五. 判 定 表
  • 6.3 过程设计工 具 五. 判 定 表 下面以行李托运费的算法为例说明判定表的 组织方法。假设某航空公司规定,乘客可以 免费托运重量不超过 30kg 的行李。当行李 重量超过 30kg 时,对头等舱的国内乘客超 重部分每公斤收费 4 元,对其他舱的国内乘 客超重部分每公斤收费 6 元,对外国乘客超 重部分每公斤收费比国内乘客多一倍,对残 疾乘客超重部分每公斤收费比正常乘客少一 半。
  • Rules Rule 五 .1 判 定 4 5 2 3 表 6 7 8 9Condition rows 国内乘客 T T T T F F F F 头等舱 T F T F T F T F 残疾乘客 F F T T F F T T 行李重量 W ≤30 T F F F F F F F F 免费 × (W-30) ×2 ×Action rows (W-30) ×3 × (W-30) ×4 × × (W-30) ×6 × × (W-30) ×8 × (W-30) ×12 × 用判定表表示计算行李费的算法
  • 判定表 适合描述:包含复杂的条件组合,并要根据 这些条件选择动作执行的模块; 缺点:  不能表示:循环、顺序和选择。  当条件为多值条件时(如机票分为头等舱、二 等舱、经济舱等多种级别),判定表的简洁程 度也下降。  其含义不能一眼看出,初用者需要一个简短的 学习过程
  • 六. 判 定 树 6.3 过程设计工 具判定树:判定表的变种;形式简单,但简洁性不如判 定表 残疾乘 (W-30) × 2 头等舱 客 国内 正常乘 (W-30) × 4 乘客 客 残疾乘 (W-30) × 3 其他舱 客 行李重 正常乘 (W-30) × 6 量 W> 客 残疾乘 (W-30) × 4行 30 头等舱 客李 外国 正常乘 (W-30) × 8费 乘客 客算 残疾乘 (W-30) × 6法 其他舱 客 行李重量 正常乘 (W-30) × 12 免费 客 W ≤ 30
  • 判定树 形式简单: 不用任何说明,一眼可看出 含义;易学易用。 缺点:  简洁性较差: 同一个数据元素的值往 往要要重复写多遍。  分支的次序:对判定树的简洁程度有较 大影响
  • 6.3 过程设计工 具 七 . 过程设计语言 PDL (伪码 ) 伪码:一种以正文形式表示数据和处理过程的设 计工具,是一种混合语言。伪码=严格的关键字外部语法+自然语言的词汇 C 、 PAS C AL ,借用 英语 / 汉语 某种结构化的程序设 ,某种自然语 计语言的语法控制框 言 架。 灵活表示实际 用于定义控制结 操作和条件 构和数据结构
  • (1) 、数据说明 : 其功能是定义数据的类型和作用域 格式 : TYPE < 变量名 > AS < 限定词 1> < 限定词 2>说明 : 1. 变量名 : 是一个模块内部使用的变量或模块间共用 的全局变量名。 2. 限定词 1 : 标明数据类型 3. 限定词 2 : 标明该变量的作用域 TYPE number AS STRING LENGTH (12) (2) 、程序块 : 的过程成分是由块结构构成的,而块将作为 PDL 一个单个的实体来执行。 BEGIN < 块名 > < 一组伪代码语句 > END
  • 把 :(3) 、子程序结构 PDL 中的过程称为子程序。 PROCEDURE < 子程序名 > < 一组属性 > INTERFACE < 参数表 > < 程序块或一组伪代码语句 > END(4) 、基本控制结构 : READ/WRITE TO < 设备 > <I/O 表 > --- 输入 / 输出结构 IF < 条件 > THEN < 程序块 / 伪代码语句组 > ; ELSE < 程序块 / 伪代码语句组 > ; ENDIF --- 选择型结构
  • DO LOOP < 条件描述 >DO WHILE < 条件描述 > < 程序块 / 伪代码语句组 > ; < 程序块 / 伪代码语句组 > ; EXIT WHENENDDO ENDLOOP REPEAT UNTIL < 条件描述 > DO FOR < 下标 = 下标表,表达式 > < 程序块 / 伪代码语句组 > ; < 程序块 / 伪代码语句组 > ; ENDREP ENDFOR --- 重复型结构 --- 重复型结构 CASE OF <case 变量名 > ; WHEN < case 条件 1> SELECT < 程序块 / 伪代码语句组 > ; WHEN < case 条件 2> SELECT < 程序块 / 伪代码语句组 > ; ---- 多路选择结构 … … DEFAULT: < 缺省或错误 case: < 程序块 / 伪代码语句组 > ; ENDCASE
  • 6.3 过程设计工 具 七 . 过程设计语言 PDL (伪码 ) PDL 的特性
  • 6.3 过程设计工 具 七 . 过程设计语言 PDL (伪码 ) 示例:拼写检查程序
  • 6.3 过程设计工 具 七 . 过程设计语言 PDL (伪码 ) 使用 PDL 语言逐步求精
  • 6.3 过程设计工 具 七 . 过程设计语言 PDL (伪码 ) 使用 PDL 语言逐步求精
  • 6.3 过程设计工 具 七 . 过程设计语言 PDL (伪码 ) PDL 的优点
  • 6.3 过程设计工 具 八. 总 结 要求掌握:  程序流程图  N - S 图  PA D 图 相互转换  PD L 语言(伪码)  判定树  判定表
  • 6.4 面向数据结构设计方 法 面向数据结构的设计方法 原理:重复出现的数据通常由循环控制结构处理 ;选择数据通常由分支控制结构。 缺点:没有足够重视和体现模块独立原理 适用范围:详细设计阶段 面向数据结构的设计方法:  Jackson 方法:英国人 M.Jackson 在 1973 年 提出  Warnier 方法:法国人 J.D.Warnier 在 1973 年提出
  • 6.4 面向数据结构设计方 法 面向数据结构的设计方法 映射 程序过程表示 数据结构 程序结构 (Jackson 伪代码(Jackson 图 ) (Jackson 图 ) ) 程序分析 程序设
  • 6.4 面向数据结构设计方 法 一 . Jac ks o n 图 Jackson 图描述数据结构 A A A B C D B° C° D° B* 顺序结构 选择 结构 重复 结构A 由 B 、 C 、 D 3 个元素顺序 根据条件, A 由 B 出现 N 次 (N≥0) 组成 组成 A 是 B 或 C 或 D 中的某一个每个元素只出现一次,出现的次序依次为 B 、 C 、 D 小圈表示选择结构,星号表示重复结构。
  • 6.4 面向数据结构设计方 法 一 . Jac ks o n 图Jackson 图有下述优点:1. 便于表示层次结构,而且是对结构进行自顶向下分解的有力工具;2. 形象直观可读性好;3. 既能表示数据结构也能表示程序结构( 因为结构程序设计也只使用上述 3 种基本控制结构 ) 。
  • 6.4 面向数据结构设计方 法 二 . 改进的 Jac ks o n 图 改进:  选择条件或循环结束条件直接在图上表示 出来,增强图的表达能力,容易直接把图 翻译成程序  框间连线为直线而不是斜线,从而容易在 行式打印机上输出。
  • 6.4 面向数据结构设计方法 二 . 改进的 Jac ks o n 图 A A A A S(i) S(i) I(i)B C D B° C° D° B° —° B* 顺序 选择 可选 重复在构成顺序结构的元素中不能有重复出现或选择出现的元素 即:第一个图中的BCD不能是在右上角有小圆圈或星
  • 6.4 面向数据结构设计方 法 J a c ks o n 图、层次图和层次方框图的区别: 图名 方框 连线 用途 阶段 设计模块内部 详细Jackson 图 数据或程序 组成 处理过程 设计 描绘软件总体 总体 层次图 模块 调用 结构 设计 分析用户需要 需求层次方框图 数据 抽象 的数据结构 分析
  • 6.4 面向数据结构设计方法三 . Jackson 方法
  • 6.4 面向数据结构设计方法三 . Jac ks o n 方法 1 . 五个基本步骤
  • 6.4 面向数据结构设计方法三 . Jac ks o n 方法 1 . 五个基本步骤
  • 6.4 面向数据结构设计方法 三 . Jac ks o n 方法 1 . 五个基本步骤总之,描绘程序结构的 J a c ks o n 图应该综合输入数 据结构和输出数据结构的层次关系而导出来。步骤 4 :列出所有操作和条件 ( 包括分支条件和循环结 束条件 ) ,并分配到程序结构图的适当位置。步骤 5 :用伪码表示程序 。 伪码和 J a c ks o n 图是完全对应的。
  • 6.4 面向数据结构设计方法 三 . Jac ks o n 方法 1 . 五个基本步骤3 种基本结构对应的伪码 A A seq B C B C D D A end 顺序
  • 6.4 面向数据结构设计方法 三 . Jackson 方法 1. 五个基本步骤 A A select cond1 B S(i) A or cond2 CB° C° D° A or cond3 D 选择 A end
  • 6.4 面向数据结构设计方法 三 . Jackson 方法 1. 五个基本步骤 A iter until condA B A end I(i)B* A iter while cond重复 B A end
  • 6.4 面向数据结构设计方法三 . Jackson 方法 2. 实例分析
  • 6.4 面向数据结构设计方法 三 . Jac ks o n 方法 2. 实例分析输入、输出的数据结构及对应关系分别为: 输出表 正文文件 格 I 字符串 空格总 * 表格体 数 I I 字 符 * 串信息 * S 空 格 ° 非空格 ° 字符串 空格数 输入数据结构 输出数据结构
  • 6.4 面向数据结构设计方 法 三 . Jac ks o n 方法 2. 实例分析 统计空格 输出表格 程序体 印总数 表格体 空格总数 I I 处理字符串 * 串信息 *字符串 空格数 印字符串 分析字符串 印空格数 I 分析字符 *3 导出程序 S J a c kS o n 结构图 处理非空格 处理空格 ° °
  • 6.4 面向数据结构设计方 法 三 . Jac ks o n 方法 统计空 2. 实例分析 格3 导出程序 程序体 印总数 J a c kS o n 结构图 I 处理字符串 正文文件 * I 印字符 印空格 字符串 * 分析字符串 串 数 I I 字 符 * 分析字符 * S S空 格 ° 非空格 ° 处理非空格 处理空格 ° °
  • 6.4 面向数据结构设计方法 三 . Jackson 方法 2. 实例分析1. 列出所有操作和条件,并且把它们分配到程 序结构图的适当位置。 ( 1 )停止 ( 2 )打开文件 ( 3 )关闭文件 ( 4 )印出字符串 ( 5 )印出空格数目 ( 6 )印出空格总数 ( 7 ) sum:=sum + 1 // sum 是保存空格个数的变量 ( 8 ) totalsum:=totalsum + sum// totalsum 保存空格总 数 ( 9 )读入字符串 ( 10 ) sum:=0 ( 11 ) totalsum:=0 ( 12 ) pointer:=1 // 指示当前分析的字符在字符串中 的位置 ( 13 ) pointer:=pointer + 1 I(1) 文件结束、 I(2) 字符串结束
  • 6.4 面向数据结构设计方法 三 . Jackson 方法 2. 实例分析 经过简单分 析不难把这 些操作和条 件分配到程 序结构图的 适当位置。
  • 5 、写出伪码。统计空格 seq 打开文件 读入字符串 totalsum∶=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
  • totalsum∶=totalsum+sum 读入字符串 处理字符串 end 程序体 end 印总数 seq 印出空格总数 印总数 end 关闭文件 停止统计空格 end
  • 6.4 面向数据结构设计方法三 . Jac ks o n 方法3. Jac ks o n 方法小结
  • 6.5 程序复杂度定量度 量 程序复杂度 程序复杂度主要指模块内程序的复杂性。它直 接关联到软件开发费用的多少,开发周期的长 短和软件内部潜伏错误的多少。 减少程序复杂度,可提高软件的简单性和可理 解性,并使软件开发费用减少,开发周期缩短 ,软件内部潜藏错误减少。
  • 6.5 程序复杂度定量度 量 程序复杂度 定量度量程序复杂程度的用处:  程序的复杂程度乘以适当常数估算出软件 中错误的数量以及所需的开发工作量,可 用于比较两个不同的设计或两个不同算法 的优劣;  可以作为模块规模的精确限度。
  • 为了度量程序复杂性,要求复杂性 度量应满足以下假设:● 它可以用来计算任何一个程序的复杂性;● 对于不合理的程序,例如对于长度动态增长的程序,或者对于原则上无法排错的程序,不应当使用它进行复杂性计算;
  • 6.5 程序复杂度定量度 量一. McCabe 方 法
  • 6.5 程序复杂度定量度 量 一. McCabe 方 法什么是程序图?
  • 6.5 程序复杂度定量度 量 一. McCabe 方 法程序图的基本元素
  • 6.5 程序复杂度定量度 量一. McCabe 方 法
  • 6.5 程序复杂度定量度量程序流程图与对应的流图
  • 6.5 程序复杂度定量度量 一 . Mc C ab e 方 法 流图中的结点可能具有以下的含义:  过程块:一组连续执行的无分支的语句。在过程块 中,如果块中的某个语句被执行,那么块中的所 有其它语句也将会被执行。 例如:结点 2 和 3 、 4 和 5 。反例: 3 和 4 不 是过程块;  汇聚点:程序中控制流的结合点(如果程序流程图 中这个结合点没有对应的处理框应该在流图中补上)。 例如:结点 9 和 10  判定点(谓词结点):程序中控制流的分叉点。
  • 图 由 PDL 翻译成的流图
  • 6.5 程序复杂度定量度 量 一 . Mc C ab e 方 法 环形复杂度 V(G): 强连通图 G 中线性无 关的有向环的个数。三种计算方法:  V(G) = 图中平面区域的个数  V(G) = P (判定结点的个数) + 1  V(G) = E( 边数 )–N( 结点数 )+2
  • 6.5 程序复杂度定量度量环形复杂性的计算方法
  • 6.5 程序复杂度定量度量环形复杂性的计算方法
  • 6.5 程序复杂度定量度量环形复杂性的计算方法
  • 6.5 程序复杂度定量度量 一 . Mc C ab e 方法 1 23 54 6程序流程图
  • 6.5 程序复杂度定量度量 一 . Mc C ab e 方法例: 1,2 结点数: 1 N= 5 边数: 2 5 E= 6 3 3,4 5 判定结点数: 4 6 6 P= 2 程序 7 区域数: 3 流程图 流图 环型复杂度:
  • 6.5 程序复杂度定量度量 二 . Mc C ab e 方 法 将复合条件分解成若干简单条件。 a 复合条件:在条件中包含了一个或多个布尔运算符 ( 逻 False True辑OR , AND , NAND , NOR) 。 a or b b True If False X Then X Else Y Y End If
  • 6.5 程序复杂度定量度量 二. McCabe 方 法McCabe 的缺点是:  对于不同种类的控制流的复杂性不能区分  简单 IF 语句与循环语句的复杂性同等看待  模块间接口当成一个简单分支一样处理
  • 6.5 程序复杂度定量度 量 一 . Mc C ab e 方 法 环形复杂度的用途:  环形复杂度是对测试难度的一种定量 度量  对软件最终的可靠性给出一种预测  模块规模以 V(G)≤10 为宜
  • 6.5 程序复杂度定量度量 二. Halstead 方法 Halstead 方法是另一个著名的 方法,它根据程序中运算符和操 作数的总数来度量程序的复杂程 度。令 : N1 为程序中运算符出现的总次数, N2 为操作数出现的总次数,程序实际长度 N 定义为: N = N1 + N2
  • 6.5 程序复杂度定量度量 二. Halstead 方法 详细设计完成之后,可以知道程序中 使用的不同运算符 ( 包括关键字 ) 的 个数 n1 ,以及不同操作数 ( 变量和常 数 ) 的个数 n2 。 Halstead 给出预测 程序长度 H 的公式如下: H = n1 log 2 n1 + n2 log 2 n2 这里, H 是程序长度的预测值,并 不等于程序中语句个数。
  • 6.5 程序复杂度定量度量 二. Halstead 方法 Halstead 的重要 结论 : 程序的实际 Halstead 长度 N 可以由运算符、操作 数 n 算出。即使程序还未编制完成,也能预先算出 程序的实际 Halstead 长度 H , 虽然它没有明确 指出程序中到底有多少个语句。 经过多次验证,预测的 Halstead 长度与实际的 Halstead 长度是非常接近的。
  • 6.5 程序复杂度定量度量 二. Halstead 方法程序的潜在错误 Halstead 度量还可以用来预测程序中可能 存在的错误 E 。预测公式为 E = ( N 1+ N 2) ∗ log 2 ( n 1+ n 2) / 3000 例如,一个程序对 150 个运算符共使用了 1200 次,对 75 个数据库项共访问 1300 次 ,那么预测该程序的错误数: E = (1200+1300) ∗ log 2 (150+75)/3000 ≈ 6.5 即预测该程序中可能包含 6 ~ 7 个错误
  • 6.5 程序复杂度定量度量 二. Halstead 方法 有人曾对从 300 条到 12000 条语句范围内的程序核实了上述公式,发现预测的错误数与实际错误数相比误差在 8% 之内。
  • 6.5 程序复杂度定量度量 二. Halstead 方法 没有注意调用的深度。 Halstead 公式应当 对调用子程序的不同深度区别对待。在计算 嵌套调用的运算符和操作数时,应乘上一个 调用深度因子。这样可以增大嵌套调用时的 错误预测率。 没有把不同类型的运算符,操作数与不同的 错误发生率联系起来,而是把它们同等看待。 例如,对简单 if 语句与 while 语句就没有 区别。