软件工程第5章软件详细设计终.docx

上传人:b****2 文档编号:17334953 上传时间:2023-07-24 格式:DOCX 页数:49 大小:811.19KB
下载 相关 举报
软件工程第5章软件详细设计终.docx_第1页
第1页 / 共49页
软件工程第5章软件详细设计终.docx_第2页
第2页 / 共49页
软件工程第5章软件详细设计终.docx_第3页
第3页 / 共49页
软件工程第5章软件详细设计终.docx_第4页
第4页 / 共49页
软件工程第5章软件详细设计终.docx_第5页
第5页 / 共49页
软件工程第5章软件详细设计终.docx_第6页
第6页 / 共49页
软件工程第5章软件详细设计终.docx_第7页
第7页 / 共49页
软件工程第5章软件详细设计终.docx_第8页
第8页 / 共49页
软件工程第5章软件详细设计终.docx_第9页
第9页 / 共49页
软件工程第5章软件详细设计终.docx_第10页
第10页 / 共49页
软件工程第5章软件详细设计终.docx_第11页
第11页 / 共49页
软件工程第5章软件详细设计终.docx_第12页
第12页 / 共49页
软件工程第5章软件详细设计终.docx_第13页
第13页 / 共49页
软件工程第5章软件详细设计终.docx_第14页
第14页 / 共49页
软件工程第5章软件详细设计终.docx_第15页
第15页 / 共49页
软件工程第5章软件详细设计终.docx_第16页
第16页 / 共49页
软件工程第5章软件详细设计终.docx_第17页
第17页 / 共49页
软件工程第5章软件详细设计终.docx_第18页
第18页 / 共49页
软件工程第5章软件详细设计终.docx_第19页
第19页 / 共49页
软件工程第5章软件详细设计终.docx_第20页
第20页 / 共49页
亲,该文档总共49页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

软件工程第5章软件详细设计终.docx

《软件工程第5章软件详细设计终.docx》由会员分享,可在线阅读,更多相关《软件工程第5章软件详细设计终.docx(49页珍藏版)》请在冰点文库上搜索。

软件工程第5章软件详细设计终.docx

软件工程第5章软件详细设计终

第5章软件详细设计

案例5在线考试系统

“在线考试系统”的详细设计中,需要考虑到其业务实际使用情况,在设计细节上考虑到实现时更好体现业务的特性。

在线考试系统有高用户量、高并发的特性,所以在详细设计时,阻塞锁的选择很重要,不能一个用户把后面所有用户都阻塞了。

大量并发同时也带来了磁盘IO的高负载,这时在设计上就可以考虑在考试这一端时间,使用内存数据库做中转存储,然后高峰期过后在转移到物理磁盘上。

在线考试系统还有在同一时间大量发生题目,这些题目的总量不大,可以通过直接缓存到内存中,加快进入在线考试系统的速度。

同时由于是在线考试系统,判题应由服务器端完成,而不是客户端,实际开发中,有出现判题由客户端完成的情况。

在线考试系统还有其它特性,在做软件详细设计时,必须详细考虑。

【知识导入】

详细设计又称过程设计。

在概要设计阶段,已经确定了软件系统的总体结构,给出系统中各元素组成模块的功能和模块间的联系,详细设计就是要在概念设计的基础上,考虑“如何实现”这个软件系统。

因此,详细设计要给出概要设计所确立的每个模块的足够详细的过程描述,当然描述还不是程序,不能够在计算机上直接运行。

详细设计的后继工作就是编码。

以此,详细设计所产生的设计文档(详细设计说明书)的质量,将直接影响编程的质量。

为了提高详细设计文档的质量和可读性,首先说明详细设计的目的、任务与表达工具,然后说明设计工具选择的原则,最后给出详细设计说明书以及评审的相关内容。

5.1结构化程序设计

对软件的描述应该从宏观的结构和微观的过程两个方面进行,而且最终把软件过程描述转换成程序代码。

总体设计侧重于定义软件的宏观结构、即进行模块的划分,表示出它们之间的层次关系,定义每个模块的功能和性能,以及模块之间的接口关系。

对于模块内部,只是在模块说明书中进行了一些非常简单的功能描述,这些功能描述只是回答模块“做什么”而不涉及“怎么做”。

详细设计是对总体设计进行细化,将每个模块的功能处理成过程,回答“怎么做”,是编码和测试的基础。

5.1.1结构化程序设计的概念

什么叫程序设计?

对于初学者来说,往往把程序设计简单地理解为只是编写一个程序。

这是不全面的。

程序设计反映了利用计算机解决问题的全过程,包含多方面的内容,而编写程序只是其中的一个方面。

使用计算机解决实际问题,通常是先要对问题进行分析并建立数学模型,然后考虑数据的组织方式和算法,并用某一种程序设计语言编写程序,最后调试程序,使之运行后能产生预期的结果。

这个过程称为程序设计。

经典定义:

如果一个程序的代码块仅仅通过顺序、选择和循环这3种基本控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的。

更全面定义:

结构程序设计是尽可能少用GOTO语句的程序设计方法。

最好仅在检测出错误时才使用GOTO语句,而且应该总是使用前向GOTO语句。

在拿到一个实际问题之后,应对问题的性质与要求进行深入分析,从而确定求解问题的数学模型或方法,接下来进行算法设计,并画出流程图。

有了算法流程图,再来编写程序是很容易的事情。

有些初学者,在没有把所要解决的问题分析清楚之前就急于编写程序,结果编程思路紊乱,很难得到预想的结果。

5.1.2结构化程序设计的思想及流程图

结构化程序设计(StructuredProgramming)的核心是算法设计,基本思想是采用自顶向下和逐步细化的设计方法以及单入单出的控制结构。

即将一个复杂问题按照功能进行拆分,并逐层细化到便于理解和描述的程度,最终形成由多个小模块组成的树型结构。

其中每个模块都是单入单出的控制结构。

结构化程序设计包括三种基本结构:

顺序结构、选择结构和循环结构。

所有的算法都可以用这三种结构来描述。

描述结构化程序设计算法的方法,一般采用流程图的方法。

流程图可以分为两种:

传统流程图和N-S流程图,下面分别介绍这两种流程图。

(1)传统流程图

传统流程图是用一些图框表示各种操作,如图5-1所示。

由这些图框组成的流程图可以把解决问题的先后次序直观地描述出来。

图5-1ANSI规定的一些流程图常用符号

结构、选择结构和循环结构的传统流程图的示意如图5-2所示。

图5-2三种基本结构的传统流程图

传统流程图可以直观表示算法,易于理解,但是它对流程线即箭头的使用没有严格限制,很容易使流程图变得复杂而没有规律。

与传统流程图相比,N-S流程图更适合结构化设计。

 

(2)N-S流程图

上个世纪70年代提出了一种新的流程图——N-S流程图。

N-S流程图去掉了所有箭头,全部算法写在一个矩形框内,在该框内还可以包含从属于它的其它矩形框。

顺序结构、选择结构和循环结构的N-S流程图的示意如图5-3所示。

图5-3三种基本结构的N-S图

例如:

求5!

,将算法分别用传统流程图和N-S流程图表示出来。

结果见图。

图5-4分别以传统流程图和N-S图计算5!

5.1.3顺序结构

顺序结构是最简单的一种结构,程序中的语句按照书写的顺序,自上而下地执行。

其特点是程序总是从第1条语句开始执行,依次执行完所有的语句后结束程序。

如图5-5所示:

 

图5-5顺序结构图

图5-5顺序结构图

5.1.4选择结构

选择结构体现了程序的判断能力,即通过对条件的判断来选择执行不同的程序语句。

在C语言中是用if语句(又称条件语句)或switch语句(又称多路开关语句)来构成选择结构的。

if语句一般适用于两路选择,也可以通过嵌套形式来实现多路选择。

switch语句能方便地实现多路选择。

(1)if语句的3种形式

①简单选择结构

例如:

if(a>b)

printf(”%d”,a);

语句形式:

if(表达式)

语句

执行过程:

判断是否a>b,若是则输出a;若不是(即a<=b)则跳过该语句执行下一条语句。

流程图见图5-6。

图5-6IF语句的流程图

注意:

表达式可以是任何类型,如逻辑型、关系型、数值型等,语句序列可以是一个语句也可以是写成复合语句形式的多个语句。

【例5.1】输入一个三位整数,依次输出该数的正(负)号和百位、十位、个位数字。

图5-7所示为对应的N-S流程图。

图5-7例5.1的N-S流程图

【例5.2】输入一个学生的语文、数学和英语成绩,如果这三门课的平均成绩在90分以上,则在屏幕上显示“优秀”,算法如图5-8所示。

图5-8例5.2的N-S流程图

②.两路选择结构

例如:

if(a>b)

printf(”%d”,a);

语句形式:

if(表达式)

语句1

else

语句2

执行过程:

若a>b成立,则输出a;否则(即a<=b)输出b。

流程图如图5-9所示。

图5-9IF-ELSE的流程图

【例5.3】从键盘上输入三个数,输出较大的数。

流程图如图5-10所示。

图5-10例5.3流程图

③多路选择结构

语句形式:

if(表达式1)语句1

elseif(表达式2)语句2

[elseif(表达式3)语句3]

[elseif(表达式n)语句n]

[else语句n+1]

流程图如图5-11所示。

执行过程:

依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。

然后跳到整个if语句之外继续执行程序。

如果所有的表达式均为假,则执行语句n+1。

然后继续执行后续程序。

图5-11多分支语句结构图

注意:

(1)在if语句中,语句1至语句n+1可以是单个语句,也可以是由多个语句组成的复合

语句。

请记住哟:

复合语句必须是用一对花括号“{”和“}”把若干C语句括起来的语句,否则,编译时会出现语法错误。

(2)if语句本身可以嵌套使用,else总是与它上面最近的if配对。

如果要改变这种默认的配对关系,可以在相应的if语句上加上左、右花括号来确定新的配对关系。

请分析下面程序段中if语句的配对问题。

(3)条件表达式(?

:

)和if语句有时候可以互相替换。

例如下述两个程序的功能均是输出变量x、y中的最大值,且最大值存放在变量max中。

两个程序中加粗部分的语句功能都是用于找出变量x、y中的最大值。

如果一个if语句中,无论表达式的值是否满足,都只给同一个变量赋值,就可以用条件表达式将这个if语句替换。

④switch语句

switch语句是多分支选择语句。

前面用if语句也可以实现多分支选择结构,但会使if语句的嵌套层次太多,从而降低了程序的可读性。

switch语句则能更加方便、直接地实现多路选择结构。

语句形式:

switch(表达式)

{

case常量表达式1:

语句1

break;

case常量表达式2:

语句2

break;

case常量表达式n:

语句n

break;

default:

语句n+1

}

图5-12switch语句的流程图

switch语句的执行过程:

先计算switch语句中表达式的值,再依次与1~n个常量表达式的值进行比较,当

表达式的值与某个case后的常量表达式的值相等时,则执行该case后的语句,然后执行break语句跳出switch结构。

如果所有常量表达式的值都不等于switch中表达式的值,则执行default后的语句。

说明:

程序执行时,从匹配常量的相应case处入口,一直执行到break语句或到达switch结构的末尾为止。

在switch语句中,default和语句n+1可以同时省略。

注意:

(1)case后面常量表达式的值应与switch后面的表达式的值的类型一致。

(2)每个case的后面可以是一条语句,也可以是多条语句,还可以没有语句。

当是多条语句时可以不用花括号括起来。

(3)多个case的后面可以共用一组执行语句,比如例3.8中的case5到case0都共用语”grade='E';”。

(4)这点很重要:

break是用来结束switch语句的。

在执行完某个case后面的语句后,如果没有遇到break;将继续往下执行而不会再判断余下的常量表达式。

5.1.5循环结构

循环结构的主要功能是通过对条件的判断来重复执行某些语句或程序段。

在C语言中是用for语句或while语句或do…while语句来构成循环结构。

例如:

while(x>0)

x--;

/*当x>0时,就循环执行x--*/

(1)while语句

语句形式:

while(循环表达式)

语句;

执行过程:

先判断循环表达式(x>0)的值,如果为真,执行循环体(即x--;)一次,再判断循环表达式(x>0)的值,并重复上述操作过程,直到x>0为假时(即x<=0)才结束循环,然后转去执行循环的后续语句。

流程图如图5-13所示。

图5-13while语句流程图

注意:

(1)while中的语句即循环体,可以是单个语句,也可以是多个语句。

当循环体为多个语句时必须写成复合语句的形式,即用{}括起来。

(2)while语句的特点是先判断表达式的值,再执行循环体,所以,循环次数可能为0。

(3)循环体中必须包含改变循环表达式值的语句,使循环能正常结束

例如:

do

x--;

while(x>0)

/*循环执行x--,直到x<=0*/

(2)do…while语句

语句形式:

do

语句;

while(循环表达式);

执行过程:

先执行循环体x--一次,然后判断循环表达式(x>0)的值,如果为真,则再去执行循环体一次,重复上述操作过程,直到表达式(x>0)的值为假时(即x<=0)才结束循环,然后转去执行循环的后续语句。

执行过程的控制流程图如图5-14所示。

图5-14do-while流程图

注意:

(1)do…while语句的特点是先执行循环体,然后再判断表达式的值,所以,循环体至少被执行一次。

(2)循环体中必须包含改变表达式值的语句,使循环能正常结束。

(3)do…while语句结束后的“;”不能省略,否则语法会出错。

(3)for语句

语句形式:

for(表达式1;表达式2;表达式3)

语句;

【说明】

for语句比较适合用于循环次数为已知的情况。

其中:

表达式1:

一般为赋值表达式,为循环控制变量赋初值。

表达式2:

一般为关系表达式或逻辑表达式,作为控制循环结束的条件。

表达式3:

一般为赋值表达式,为循环控制变量增量或减量。

例如:

for(i=1;i<=10;i++)

sum=sum+i;/*求解1+2+3+…+10的和,结果存入sum中*/。

执行过程:

(1)求解表达式1(i=1;),

(2)求解表达式2(i<=10;),

若其值为真则执行循环体(sum=sum+i;)一次,

接着求解表达式3(i++),再重复第

(2)步。

若为假转向第(3)步。

(3)结束for循环

流程图如图5-15所示。

图5-15for循环流程图

注意:

(1)for循环中的“表达式1”即循环变量赋初值、“表达式2”即循环条件、“表达式3”即循环变量增量,三者都是可选项,可以缺省,但是中间的两个分号“;”不能缺省。

例如:

for(;;)语句;相当于while

(1)语句;

也就是说,在for语句中既不设定循环变量初值,也不判断循环条件,此时默认表达式2为真。

此时,循环变量的初值一般在for语句的前面给出,条件判断与循环增量在循环中给出相应的语句,否则很容易成为死循环。

(2)省略“表达式1”,表示不对循环控制变量赋初值。

这种情况在C语言中也是允许的,但是,必须在for语句之前给循环变量赋初值。

例如:

i=1;mul=1;

for(;i<=10;i++)

mul=mul*i;

(3)省略“表达式2”,即省略循环条件,此时不判断循环条件,如果在循环体没有使循环结束的语句,那么循环将无终止地进行下去,即出现所谓的死循环。

例如:

mul=1;i=1;

for(i=1;;i++)mul=1;

{相当于while

(1)

if(i>10)break;{if(i>10)break;

mul=mul*i;mul=mul*i;i++;

}}

(4)省略“表达式3”,则不能对循环控制变量进行操作,此时为了保证循环正常结束,需要在语句中加入修改循环控制变量的语句。

例如:

mul=1;

for(i=1;i<=10;)

{mul=mul*i;

i++;

/*i++本来是for语句中的表达式3,可以放到循环体中*/

}

(5)可以省略“表达式1”和“表达式3”,只有表达式2,即只给出循环条件。

此种情况下,完全等同于while语句,例如:

i=1;mul=1;i=1;mul=1;

for(;i<=10;)相当于while(i<=10)

{mul=mul*i;{mul=mul*i;

i++;}i++;}

(6)表达式1可以是设置循环变量初值的赋值表达式,也可以是其他表达式。

例如:

i=0;

for(mul=1;i<=10;i++)mul=mul*i;

(7)表达式2可以是任何类型的,但一般是关系表达式或逻辑表达式,只要其值非零,就继续执行循环体。

例如:

charch;

for(;(ch=getchar())!

='$';)

putchar(ch);

相当于:

charch;

while((ch=getchar())!

='$)

putchar(ch);

(4)循环嵌套

如果在一个循环体中又含有另一个完整的循环结构,则称为循环嵌套。

当内嵌的循环中含有另一个嵌套的循环时,称为多重循环。

while循环、do…while循环和for循环三种结构可以相互嵌套。

例如:

while()

{…

do

{…

for(;;)

{…

}

}while();

}

注意:

循环嵌套时,内层循环必须被完全包含于外层循环内,不允许循环结构交叉。

5.1.6结构化程序设计方法

结构化程序设计采用自顶向下、逐步求精和模块化的分析方法。

自顶向下是指对设计的系统要有一个全面的理解,从问题的全局入手,把一个复杂问题分解成若干个相互独立的子问题,然后对每个子问题再作进一步的分解,如此重复,直到每个问题都容易解决为止。

逐步求精是指程序设计的过程是一个渐进的过程,先把一个子问题用一个程序模块来描述,再把每个模块的功能逐步分解细化为一系列的具体步骤,以致能用某种程序设计语言的基本控制语句来实现。

逐步求精总是和自顶向下结合使用,一般把逐步求精看作自顶向下设计的具体体现。

模块化是结构化程序的重要原则。

所谓模块化就是把大程序按照功能分为较小的程序。

1.采用自顶向下,逐步求精的程序设计方法。

2.在需求分析,概要设计中,都采用了自顶向下,逐层细化的方法。

3.使用三种基本控制结构构造程序任何程序都可由顺序、选择、重复三种基本控

制结构构造。

(1)用顺序方式对过程分解,确定各部分的执行顺序。

(2)用选择方式对过程分解,确定某个部分的执行条件。

(3)用循环方式对过程分解,确定某个部分进行重复的开始和结束的条件。

(4)对处理过程仍然模糊的部分反复使用以上分解方法,最终可将所有细节确定下来。

3.主程序员组的组织形式指开发程序的人员组织方式应采用由一个主程序员(负责全部技术活动)、一个后备程序员(协调、支持主程序员)和一个程序管理员(负责事务性工作,如收集、记录数据,文档资料管理等)三个为核心,再加上一些专家(如通信专家、数据库专家)、其他技术人员组成小组。

5.2详细设计任务

详细设计的目的是为软件结构中的每一个模块确定使用的算法和快内数据结构,并选用一种合适的表达工具给出清楚的描述。

表达工具可以有开发单位或设计人员自由选择,但是必须具有描述过程细节的能力,进而在编码阶段能够直接将其翻译为用程序设计语言书写的程序。

具体来说该阶段的主要任务容下:

1为模块确定算法,并选择某种表达工具精确地表示算法。

2确定模块使用的数据结构。

3确定模块接口的细节,包括对系统外部的接口和用户界面,对系统内部其他模块的

接口,以及模块输入数据、输出数据及局部数据的全部细节。

④要为每一个模块设计测试用例,一边在编码阶段对模块进行预定测试,模块的测试用例是软件测试计划的重要组成部分,通常应包括输入数据、期望输出等内容,负责详细设计的软件人员对模块的情况了解的最清楚,有他们在完成详细设计后接着提出对各个模块的测试要求是最合适的。

⑤在详细设计结束时,应该把上述结果写入详细设计说明书中,并且通过复审形成正式文档。

并交付给程序员作为编码的依据。

5.3详细设计工具

在理想的情况下,算法过程描述应采用自然语言来表达,这样使得不懂软件的人较易理解这些规则说明,但是,自然语言容易产生二义性。

常常要参考上下文能够把握问题的求解过程,因此,必须用严密的描述工具来表达过程细节。

详细设计的工具只要有以下几种:

①图形工具:

利用图形工具可以把过程的细节用图形描述出来。

②表格工具:

可以用一张表来描述过程的细节,在这张表中列出了各种可能的操作和相应的条件。

4语言工具:

用某种语言来描述过程的细节。

5.3.1程序流程图

在40年代末到70年代中期,程序流程图一直是软件设计的工具。

它以对控制流程的描绘直观、易于掌握而被设计人员青睐。

程序流程图又称为程序框图,它是历史最悠久、使用最广泛的描述过程设计的方法。

它的主要优点是对控制流程的描绘很直观,便于初学者掌握。

程序流程图历史悠久,至今仍在广泛使用着。

程序流程图的基本符号如图5-16所示:

图5-16程序流程图的基本符号

程序流程图也称为程序框图,程序流程图使用五种基本控制结构如图5-17所示:

:

图5-17程序流程图使用五种基本控制结构

图5-18循环的标准符号注解的使用

图5-19多出口的判断

程序流程图的优点:

容易掌握,且历史“悠久”,使用广泛。

缺点:

本质上不具备逐步求精的特点,对于提高大型系统的可理解性作用甚微;不易表示数据结构;转移控制太方便.程序流程图本质上不是逐步求精的好工具,它诱使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构。

程序流程图中用箭头代表控制流,因此程序员不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制,程序流程图不易表示数据结构。

5.3.2盒图(N-S图)

N-S图是Nassi和Shneiderman提出来的,它体现了结构程序设计精神,是目前过程设计中广泛使用的一种图形工具。

基本符号如图5-20所示:

图5-20盒图的基本符号

图5-21盒图转换

图5-22N-S图的嵌套定义形式

N-S图的特点

优点

(1)功能域明确,可以很直观的从盒图上直接看出来。

(2)不可能任意转移控制,确保了程序的良好结构。

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

(4)很容易表现嵌套关系,也可以表示模块的层次结构。

缺点

随着程序内嵌套的层数增多时,内层方框越来越小,这样不仅会增加画图的难度,同时还会影响图形的清晰度。

5.3.3.PAD图

PPAD是问题分析图(problemanalysisdiagram)的英文缩写,由日本日立公司在1973发明以后,现在已经得到一定程度的推广。

它用二维树形结构的图来表示程序的控制流,将这种图翻译成程序代码比较容易。

PAD图的优点:

程序一定是结构化的,PAD图中竖线的总条数就是程序中的层次数,既表示程序逻辑,也描绘数据结构

图5-23PAD图的基本符号表示

图5-24PAD图的转换

图5-25N-S图与PAD的转换

PAD图的主要优点如下:

(1)使用表示结构化控制结构的PAD符号设计出来的程序必然也是结构化程序。

(2)PAD图所描绘的程序结构是十分清晰。

(3)PAD图很好的表现了程序逻辑易读、易懂、易记。

 

(4)可以很容易将PAD图转换成高级语言源程序,而且这种转换可以通过软件工具自动完成。

(5)PAD图即可表示程序逻辑,也可描绘数据结构。

(6)PAD图的符号支持自顶向下、逐步求精方法的使用。

5.3.4判定表

当算法中包含多重嵌套的条件选择时,用程序流程图、盒图、PAD图或后面即将介绍的过程设计语言(PDL)都不易清楚地描述。

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

一张判定表由四部分组成:

(1)左上部列出所有的条件Ⅰ

(2)左下部是所有可能的操作Ⅲ

(3)右上部是各种条件的组合矩阵Ⅱ

(4)右下部是每种条件组合对应的动作Ⅳ

图5-26判定表的组成图

例:

某航空公司规定,乘客可以免费托运重量不超过30公斤的行李。

当行李重量超过30公斤时,头等舱国内乘客超重部分每公斤收费4元,其他舱的国内乘客超重部分

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2