第五章详细设计讲解学习_第1页
第五章详细设计讲解学习_第2页
第五章详细设计讲解学习_第3页
第五章详细设计讲解学习_第4页
第五章详细设计讲解学习_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章、详细设计结构化程序设计详细设计的工具

Jackson程序设计方法详细设计阶段:根本目标是确定应该怎样具体地实现所要求的系统。详细设计的任务不是编写程序,而是要设计出程序的“蓝图”,便于以后根据这个蓝图写出实际的程序代码。结构程序设计结构化程序设计主要包括两方面:(1)在设计程序时,强调使用几种基本控制结构,通过组合嵌套,形成程序的控制结构。尽可能避免使用GOTO语句。(2)在程序设计过程中,尽量采用自顶向下和逐步细化的原则,由粗到细,一步步展开。结构化程序设计的主要原则

使用语言中的顺序、选择、重复等有限的基本控制结构表示程序逻辑。

选用的控制结构只准许有一个入口和一个出口。

程序语句组成容易识别的块,每块只有一个入口和一个出口。

复杂结构应该用基本控制结构进行组合嵌套来实现。结构化程序设计的主要原则例打印A,B,C三数中最小者的程序程序1

if(A<

B)

gotob12;

if(

B<

C)gotob11;b10:printf(“%d”,C);

gotob14;b11:printf(“%d”,B);

gotob14;b12:if(A

<

C)gotob13;

gotob10;b13:printf(“%d”,A);b14:…

程序2

if(A

<B

and

A<C)

printf(“%d”,A);

else{ if(A

B

and

B

<C)

printf(“%d”,

B);

else

printf(“%d”,

C);}自顶向下,逐步求精

在详细设计和编码阶段,应当采取自顶向下,逐步求精的方法。

把一个模块的功能逐步分解,细化为一系列具体的步骤,进而翻译成一系列用某种程序设计语言写成的程序。自顶向下,逐步求精例,用筛选法求100以内的素数

筛选法就是从2到100中去掉2,3,…,9,10的倍数,剩下的就是100以内的素数。

为了解决这个问题,可先按程序功能写出一个框架。main

(){//程序框架

建立2到100的数组A[],其中A[i]=i;

-----------------------------------1

建立2到10的素数表B[],其中存放2到10以内的素数;-----------2

若A[i]=i是B[]中任一数的倍数,则剔除A[i];---------------------3

输出A[]中所有没有被剔除的数;

-----------------------------------4}

main(){

/*建立2到100的数组A[],其中A[i]=i*/

for(i=2;i<=100;i++)A[i]=i;

/*建立2到10的素数表B[],其中存放2到10以内的素数*/

B[1]=2;B[2]=3;B[3]=5;B[4]=7;

/*若A[i]=i是B[]中任一数的倍数,则剔除A[i]*/

for(j=1;j<=4;j++)

检查A[]所有的数能否被B[j]整除并将能被整除的数从A[]中剔除;-----3.1

/*输出A[]中所有没有被剔除的数*/

for(i=2;i<=100;i++)

若A[i]没有被剔除,则输出之

---4.1}对框架中的局部再做细化,得到整个程序。main(){

/*建立2到100的数组A[],其中A[i]=i*/

for(i=2;i<=100;i++)A[i]=i;

/*建立2到10的素数表B[],其中存放2到10以内的素数*/

B[1]=2;B[2]=3;B[3]=5;B[4]=7;

/*若A[i]=i是B[]中任一数的倍数,则剔除A[i]*/

for(j=1;j<=4;j++)

/*检查A[]所有的数能否被B[j]整除并将能被整除的数从A[]中剔除*/for(i=2;i<=100;i++)

if(A[i]/B[j]*B[j]==A[i])

A[i]=0;

/*输出A[]中所有没有被剔除的数*/

for(i=2;i<=100;i++)

/*若A[i]没有被剔除,则输出之*/

if(A[i]!=0)

printf(

“A[%d]=%d\n”,i,A[i]);

}

符合人们解决复杂问题的普遍规律。可提高软件开发的成功率和生产率

用先全局后局部,先整体后细节,先抽象后具体的逐步求精的过程开发出来的程序具有清晰的层次结构,程序容易阅读和理解自顶向下,逐步求精方法的优点:

程序自顶向下,逐步细化,分解成一个树形结构。在同一层的节点上的细化工作相互独立。有利于编码、测试和集成

程序清晰和模块化,使得在修改和重新设计一个软件时,可复用的代码量最大

每一步工作仅在上层节点的基础上做不多的设计扩展,便于检查

有利于设计的分工和组织工作。自顶向下,逐步求精方法的优点:

在详细设计阶段,要决定各个模块的实现算法,并精确地表达这些算法。表达过程规格说明的工具叫做详细设计工具,它可以分为以下三类:图形工具表格工具语言工具详细设计的工具

程序流程图也称为程序框图,程序流程图使用五种基本控制结构是:程序流程图示例程序流程图的标准符号循环的标准符号注解的使用多出口判断实例分析:在一个只能用2个字节表示整数的计算机上,求10000!是多少位数N-S图:1973年,Nassi和Shneiderman发表了题为“结构化程序的流程图技术”的文章,提出用方框图(blockdiagram)来代替传统的流程图,引起了人们的重视,根据这两位创始人的名字,许多人把它简称为N-S图(N-Schart)。N-S的主要特色,就是只能描述结构化程序所允许的标准结构,根本取消了表现诸如含有GOTO语句的非标准结构的手段。N-S图:优点是:(1)所有的程序结构均用方框来表示,无论并列或者嵌套,程序的结构清晰可见。(2).不可能任意转移控制。

(3).很容易确认局部和全局数据的作用域。

(4).很容易表示嵌套关系。

N-S图也叫做盒图。五种基本控制结构由五种图形构件表示。N-S图:示例N-S图的嵌套定义形式实例分析:在一个只能用2个字节表示整数的计算机上,求10000!是多少位数问题分析图(PAD)PAD图是日本日立公司于1979年提出的一种算法描述工具,它是一种由左往右展开的二维树型结构。PAD图的控制流程为自上而下,从左往右地执行。优点:(1)清晰地反映了程序的层次结构。(2)支持逐步求精的设计方法,左边层次中的内容可以抽象,然后由左到右逐步细化。(3)易读易写,使用方便。(4)支持结构化的程序设计原理。(5)可自动生成程序。问题分析图(PAD)

PAD也设置了五种基本控制结构的图式,并允许递归使用。PAD描述的示例

对应于增量型循环结构

for

i:=n1

to

n2

step

n3

do

在PAD中有相应的循环控制结构PAD的扩充控制结构

判定表用于表示程序的静态逻辑

在判定表中的条件部分给出所有的两分支判断的列表,动作部分给出相应的处理

要求将程序流程图中的多分支判断都改成两分支判断

能够清晰地表示复杂的条件组合与应做的动作之间的对应关系

判定表无多分支判断结构

列出与一个具体过程(或模块)有关的所有处理。

列出过程执行期间的所有条件(或所有判断)。

将特定条件取值组合与特定的处理相匹配,消去不可能发生的条件取值组合。

将右部每一纵列规定为一个处理规则,即对于某一条件取值组合将有什么动作。

建立判定表的步骤:判定树

判定树是判定表的变种,也能清晰地表示复杂的条件组合与应做的动作之间的对应关系。

优点在于,它的形式简单到不需要任何说明,一眼说可以看出其含义

易于掌握和理解

判定树实例分析:假设某航空公司规定,乘客可以免费托运重量不超过30公斤的行李。当行李重量超过30公斤时,对头等仓的国内乘客超重部分每公斤收费4元,对其他仓的国内乘客超重部分每公斤收费6元,国外乘客加收1倍,残疾乘客减半行李费算法行李重量W>30行李重量W<=30免费国内乘客国外乘客头等舱其他舱头等舱其他舱残疾乘客正常乘客(w-30)*2(w-30)*4残疾乘客正常乘客(w-30)*3(w-30)*6残疾乘客正常乘客(w-30)*4(w-30)*8残疾乘客正常乘客(w-30)*6(w-30)*12PDL(ProgramDesignLanguage)也称程序描述语言(ProgramDescriptionLanguage,PDL),又称为伪码(pseudocode)。属于文字形式的表达工具。它并非真正的代码,也不能在计算机上执行,但形式上与代码相似。它是一种用于描述模块算法设计和处理细节的语言。PDL具有严格的关键字外层语法,用于定义控制结构、数据结构和模块接口,而它表示实际操作和条件的内层语法又是灵活自由的,使用自然语言的词汇。

PDL是一种用于描述功能模块的算法设计和加工细节的语言。称为设计程序用语言。它是一种伪码。

伪码的语法规则分为“外语法”和“内语法”。

PDL具有严格的关键字外语法,用于定义控制结构和数据结构,同时它的表示实际操作和条件的内语法又是灵活自由的,可使用自然语言的词汇。

PDL(ProgramDesignLanguage)PROCEDURE

spellcheck

IS

BEGIN

splitdocumentintosinglewords

loodupwordsindictionary

displaywordswhicharenotindictionary

createanewdictionary

END

spellcheck

示例:拼词检查程序

提供全部结构化控制结构、数据说明和模块特征。能对PDL正文进行结构分割,使之变得易于理解。

为了区别关键字,规定关键字一律大写,其它单词一律小写。或者规定关键字加下划线,或者规定它们为黑体字。PDL的特点:

内语法使用自然语言来描述处理特性。内语法比较灵活,只要写清楚就可以,不必考虑语法错,以利于人们可把主要精力放在描述算法的逻辑上。

有数据说明机制,包括简单的(如标量和数组)与复杂的(如链表和层次结构)的数据结构。

有子程序定义与调用机制,用以表达各种方式的接口说明。PDL的特点:PROCEDUREspellcheckBEGIN

--*splitdocumentintosinglewords

LOOP

getnextword

addwordtowordlistinsortorder

EXITWHEN

allwordsprocessed

ENDLOOP

--*lookupwordsindictionary

LOOP

getwordfromwordlist

使用PDL语言,逐步求精:

IF

wordnotindictionary

THEN

--*displaywordsnotindictionary

displayword

promptonuserterminal

IF

userresponsesayswordOK

THEN

addwordtogoodwordlist

ELSE

addwordtobadwordlist

ENDIF

ENDIF

EXITWHEN

allwordsprocessed

ENDLOOP

使用PDL语言,逐步求精:--*createanewwordsdictionary

dictionary:=

mergedictionaryandgoodwordlistEND

spellcheck使用PDL语言,逐步求精:模块开发文件夹是组织和保存在软件开发过程中不断产生出来的文档资料的一种有效方法,用这种方法保存和管理文档既方便又容易查阅。文件夹名(1)文件夹说明(工程项目名称、模块名称、程序人员、完成日期、源程序、模块的描述、设计、编码、测试文档名)(2).文档:模块详细设计、程序清单、测试方案、测试分析报告

概要设计中面向数据流的设计方法与之对应的详细设计还可以采用面向数据结构的设计方法

Jackson方法的主要工具-Jackson图

Jackson图表示数据结构的三种逻辑关系(顺序,选择,循环)。Jackson程序设计方法ABCDAB。.C。AB*顺序,选择,循环D。顺序选择循环改进的JACKSON顺序,选择,循环ABCDAB。.C。D。顺序结构选择结构S(i)AB。._。AB*循环I(i)

无论数据结构还是程序结构,都限于三种基本结构及它们的组合,因此他给出了三种基本结构的表示。这三种基本结构不仅可以表示数据结构,还可以表示程序结构。

便于表示层次结构,而且是对结构进行自顶向下分解的有力工具

形象直观JACKSON的优点:Jackson方法一般通过以下五个步骤来完成设计:

分析并确定输入数据和输出数据的逻辑结构,并用Jackson结构图表示这些数据结构。

找出输入数据结构和输出数据结构中有对应关系的数据单元。“对应关系”指这些数据单元在数据内容上、数量上和顺序上有直接的因果关系,对于重复的数据单元,重复的次序和次数都相同才有对应关系。

按一定的规则由输入、输出的数据结构导出程序结构。

列出基本操作与条件,并把它们分配到程序结构图的适当位置。

用伪代码写出程序。改进的JACKSON顺序,选择,循环及伪码ABCD顺序结构AseqBCDAendKeywordsAB。.C。D。选择结构Aselectcond1BAorcond2CAorcond3DAendSelectorandend为keywords,cond1、cond2、cond3为条件AB*循环I(i)Aiteruntil(或while)condBAendIteruntilwhileend是关键词Cond为条件实例分析一个正文文件有若干记录组成。每个记录是一个字符串。要求统计每个记录中的空格个数,以及文件中空格字符的总数。要求的输入数据的格式是:每复制一行字符串之后,另起一行打印出这个串中的空格数,最后打印出字符的总数。正文文件字符串*字符*空格。非空格。输出表格表格体空格总数串信息*字符串空格数IISI输入数据结构输出数据结构步骤1+2统计空格程序体印总数处理字符串*印字符串分析字符串印空格数分析字符*处理空格*处理非空格*IIS步骤3步骤4(1).停止(2).打开文件(3).关闭文件(4)印字符串(5).印出空格数目(6)印空格总数(7).Sum:=Sum+1(8).Totalsum:=Totalsum+Sum(9)读入字符串(10).Sum:=0(11).Totalsum:=0(12).Pointer:=1(13).Pointer:=Pointer+1I(1)文件结束I(2)字符串结束S(3)字符是空格程序复杂性度量程序复杂性主要指模块内程序的复杂性。它直接关联到软件开发费用的多少,开发周期的长短和软件内部潜伏错误的多少。减少程序复杂性,可提高软件的简单性和可理解性,并使软件开发费用减少,开发周期缩短,软件内部潜藏错误减少。复杂性度量需要满足的假设为了度量程序复杂性,要求:它可以用来计算任何一个程序的复杂性;对于不合理的程序,例如对于长度动态增长的程序,或者对于原则上无法排错的程序,不应当使用它进行复杂性计算;如果程序中指令条数、附加存储量、计算时间增多,不会减少程序的复杂性。

三种程序复杂度度量方法代码行度量法McCabe度量法Halstead的软件科学代码行度量法源代码行数度量法基于两个前提:

程序复杂性随着程序规模的增加不均衡地增长;控制程序规模的方法最好是采用分而治之的办法。将一个大程序分解成若干个简单的可理解的程序段。方法的基本考虑是统计一个程序模块的源代码行数目,并以源代码行数做为程序复杂性的度量。设每行代码的出错率为每100行源程序中可能有的错误数目。Thayer曾指出,程序出错率的估算范围是从0.04%~7%之间,即每100行源程序中可能存在0.04~7个错误。他还指出,每行代码的出错率与源程序行数之间不存在简单的线性关系。

Lipow指出,对于小程序,每行代码出错率为1.3%~1.8%;对于大程序,每行代码的出错率增加到2.7%~3.2%之间,这只是考虑了程序的可执行部分,没有包括程序中的说明部分。Lipow及其他研究者得出一个结论:对于少于100个语句的小程序,源代码行数与出错率是线性相关的。随着程序的增大,出错率以非线性方式增长。

McCabe度量法McCabe度量法,又称环路复杂性度量,是一种基于程序控制流的复杂性度量方法。它基于一个程序模块的程序图中环路的个数,因此计算它先要画出程序图。程序图是退化的程序流程图。流程图中每个处理都退化成一个结点,流线变成连接不同结点的有向弧。程序图仅描述程序内部的控制流程,完全不表现对数据的具体操作,以及分支和循环的具体条件。计算环路复杂性的方法:根据图论,在一个强连通的有向图G中,环的个数由以下公式给出:

V(G)=m-n+p

其中,V(G)是有向图G中环路个数,m是图G中弧数,n是图G中结点数,p是图G中的强连通分量个数。为使图成为强连通图,从图的入口点到出口点加一条用虚线表示的有向边,使图成为强连通图。这样就可以使用上式计算环路复杂性。在例示中,结点数n=11,弧数m=13,p=1,则有

V(G)=m-n+p=13-11+1=3.等于程序图中弧所封闭的区域数。

几点说明环路复杂度取决于程序控制结构的复杂度。当程序的分支数目或循环数目增加时其复杂度也增加。环路复杂度与程序中覆盖的路径条数有关。环路复杂度是可加的。例如,模块A的复杂度为3,模块B的复杂度为4,则模块A与模块B的复杂度是7。

McCabe建议,对于复杂度超过10的程序,应分成几个小程序,以减少程序中的错误。Walsh用实例证实了这个建议的正确性。在McCabe复杂度为10的附近,存在出错率的间断跃变。McCabe环路复杂度隐含的前提是:错误与程序的判定加上例行子程序的调用数目成正比。加工复杂性、数据结构、录入与打乱输入卡片的错误可以忽略不计。这种度量的缺点是:对于不同种类的控制流的复杂性不能区分

简单IF语句与循环语句的复杂性同等看待

嵌套IF语句与简单CASE语句的复杂性是一样的

模块间接口当成一个简单分支一样处理一个具有1000行的顺序程序与一行语句的复杂性相同

Halstead的软件科学Halstead软件科学研究确定计算机软件开发中的一些定量规律,它采用以下一组基本的度量值。这些度量值通常在程序产生之后得出,或者在设计完成之后估算出。程序长度(预测的Halstead长度)

令n1表示程序中不同运算符(包括保留字)的个数,令n2表示程序中不同运算对象的个数,令H表示“程序长度”,则有

H=n1

log2n1+n2

log2n2这里,H是程序长度的预测值,它不等于程序中语句个数。

在定义中,运算符包括:算术运算符赋值符(=或:=)逻辑运算符分界符(,或;或:)关系运算符括号运算符子程序调用符数组操作符循环操作符等。特别地,成对的运算符,例如

“BEGIN…END”、“FOR…TO”、“REPEAT…UNTIL”、“WHILE…DO”、“IF…THEN…ELSE”、“(…)”等都当做单一运算符。

运算对象包括变量名和常数。实际的Halstead长度

设N1为程序中实际出现的运算符总个数,N2为程序中实际出现的运算对象总个数,N为实际的Halstead长度,则有

N=

N1+

N2

程序的词汇表

Halstead定义程序的词汇表为不同的运算符种类数n1和不同的运算对象种类数n2的总和。若令n为程序的词汇表,则有

n=

n1+n2

例如,用FORTRAN语言写出的交换排序的例子

SUBROUTINESORT(X,N)

DIMENSIONX(N)

IF(N.LT.2)RETURN

DO20I=2,N

DO10J=1,I

IF(X(I).GE.X(J))GOTO10

SAVE=X(I)

X(I)=X(J)

X(J)=SAVE

10CONTINE

20CONTINE

RETURN

END

程序量程序量

V可用下式得到

V

=

N

log2n

它表明了程序在词汇上的复杂性。其最小值为

V*=(2+n2*)

log2(2+n2*)V

这里,2表明程序中至少有两个运算符:赋值符=和函数调用符

f(),n2*表示输入/输出变量个数。

对于上面的例子,利用n1,N1,n2,N2,可以计算得

H=10

log210+7

log27=52.87N=28+22=50

V=(28+22)

log2(10+7)=204等效的汇编语言程序的V=328。这说明汇编语言比FO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论