软件设计与编程基础(C语言版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.3 任务三:“小学生数学选题系统”的设计

在进行系统设计时,要关注软件的质量因素,如正确性、精确性、性能与效率、易用性、可理解性、简法性、可复用性、可扩充性,等等。

2.3.1 子任务一:编写概要设计说明书

任务描述

(1)根据“小学生数学选题系统”需求分析的结果,从实现的角度进一步划分为模块,并组成模块的层次结构,绘制“小学生数学选题系统”总的模块层次图(H图)。

(2)根据系统流程图进行功能分解以确定模块结构,划分功能模块,并说明各模块的功能。

(3)确定模块之间的调用关系,绘制函数关系图。

任务分析与设计

(1)绘制功能模块图的关键是对用户需求要有充分的了解。

(2)划分各功能模块,采用自顶向下逐层分解的结构化分析方法。

(3)函数关系图主要是针对各模块而设计的,体现了各函数之间的调用关系,确定了模块之间的接口,即模块之间的传递的信息。

(4)系统设计是把需求转化为软件系统的最重要的环节,包括体系结构、模块、数据与算法和用户界面的设计。

任务实现

1.编写目的

小学生数学选题系统的概要设计是总体设计的第一个阶段,这个阶段的主要任务是对小学生数学选题系统的结构设计,具体为:

(1)采用结构化设计方法,将小学生数学选题系统按功能划分成模块。

(2)确定小学生数学选题系统各模块的功能。

(3)确定小学生数学选题系统各模块之间的调用关系(这里用函数关系图表示)。

(4)确定小学生数学选题系统各模块之间的接口,即模块之间传递的信息。

2.“小学生数学选题系统”总的模块层次图(H图)

“小学生数学选题系统”H图如图2.5所示。

图2.5 “小学生数学选题系统”H图

3.功能模块划分及调用关系

功能模块划分及调用关系如表2.9所示。

表2.9 功能模块划分及调用关系

引导文献

1.软件设计的过程

一旦确定软件需求之后,就进入开发阶段。开发阶段由三个互相关联的步骤组成:设计、实现(编码)和测试,最后得到有效的计算机软件。

从工程管理的角度来看,软件设计分两步完成:首先做概要设计,将软件需求转化为数据结构和软件的系统结构,并建立接口;然后是详细设计,即过程设计,得到软件的详细的数据结构和算法。

软件设计是开发阶段中最重要的步骤,它是软件开发过程中质量得以保证的关键步骤。设计提供了软件的表示,使得软件的质量评价成为可能。

软件设计是一个把软件需求变换成表示的过程。

1)需求转换为设计时判断设计好坏的三条特征

(1)设计必须实现分析模型中描述的所有显式需求,必须满足用户希望的所有隐式需求。

(2)设计必须是可读、可理解的,使得将来易于编程、易于测试、易于维护。

(3)设计应从实现角度出发,给出与数据、功能、行为相关的软件全貌。

2)设计的技术标准

(1)设计出来的结构应是分层结构,从而建立软件成分之间的控制。

(2)设计应当模块化,从逻辑上将软件划分为完成特定功能或子功能的构件。

(3)设计应当既包含数据抽象,也包含过程抽象。

(4)设计应当建立具有独立功能特征的模块。

(5)设计应当建立能够降低模块与外部环境之间复杂连接的接口。

(6)设计应能根据软件需求分析获取的信息,建立可驱动、可重复的方法。

(7)软件设计过程根据基本的设计原则,使用系统化的方法和完全的设计评审来建立良好的设计。

2.概要设计在开发阶段中的重要性

在软件需求分析阶段已经完全弄清楚了软件的各种需求,较好地解决了要让所开发的软件“做什么”的问题,并已在软件需求规格说明和数据要求规格说明中详尽和充分地阐明了这些需求。下一步就要着手实现软件的需求,即要着手解决“怎么做”的问题。

3.利用HIPO图(Hierarchy Plus Input-Process-Output)进行迭代式细化设计

在软件设计时,解决设计问题通常需要经历一个认识逐步发展的过程,并且对一些问题还要经过反复的考虑才可能达到比较满意的设计效果。我们称此为迭代式细化设计。HIPO图能很好地适应这一要求。

(1)HIPO图是系统设计的描述工具。HIPO图是IBM公司于20世纪70年代,在层次结构图的基础上推出的一种描述系统结构和模块内部处理功能的工具。HIPO图由两部分组成——H图和IPO图。

① 系统层次结构(H)图——描述整个系统的设计结构以及各类模块之间的关系,如图2.6所示。

图2.6 系统层次结构(H)图

② IPO图——描述某个特定模块内部的处理过程和输入/输出关系,即模块间的联系和数据结构(用于“详细设计”部分),如图2.7所示。

图2.7 IPO图

(2)利用HIPO图进行迭代式细化设计。把可视目录表和IPO图结合起来,反复交替地使用,可使得设计工作逐步深化,最终取得完满的设计结果。其实这正是自顶向下、逐步求精的结构化程序设计思想。

根据系统流程(自顶向下、逐步细化)进行功能分解,以确定模块结构、划分功能模块。

(3)将软件的体系结构采用自顶向下的方式,对各个层次的过程细节和数据细节逐层细化,直到用程序设计语言的语句能够实现为止,从而最后确立整个体系结构。

2.3.2 子任务二:编写详细设计说明书

任务描述

(1)根据“小学生数学选题系统”流程图和H图,绘制IPO图。

(2)详细设计数据结构。

任务分析与设计

(1)绘制IPO图的关键是,要清楚对各功能模块的输入/输出数据、处理功能和调用详细情况。

(2)数据结构设计要详细,为编码实现打下良好的基础。

任务实现

1.编写目的

小学生数学选题系统详细设计是设计的第二个阶段。这个阶段的主要任务是,在小学生数学选题系统概要设计的基础上,对概要设计中产生的功能模块进行过程描述,设计功能模块的内部细节,包括算法和详细数据结构,为编写源代码提供必要的说明。

2.项目概述

1)模块编号

小学生数学选题系统各模块编号如表2.10所示。

表2.10 小学生数学选题系统各模块编号

2)各模块IPO表

(1)登录模块IPO表如表2.11所示。

表2.11 登录模块IPO表

(2)主控模块IPO表如表2.12所示。

表2.12 主控模块IPO表

(3)使用说明模块IPO表如表2.13所示。

表2.13 使用说明模块IPO表

(4)四则题库模块IPO表如表2.14所示。

表2.14 四则题库模块IPO表

(5)加法模块IPO表如表2.15所示。

表2.15 加法模块IPO表

(6)减法模块IPO表如表2.16所示。

表2.16 减法模块IPO表

(7)乘法模块IPO表如表2.17所示。

表2.17 乘法模块IPO表

(8)除法模块IPO表如表2.18所示。

表2.18 除法模块IPO表

(9)题量设置模块IPO表如表2.19所示。

表2.19 题量设置模块IPO表

(10)评分系统模块IPO表如表2.20所示。

表2.20 评分系统模块IPO表

3.各模块的算法设计

各模块的算法设计如表2.21所示。

表2.21 各模块的算法设计

4.数据结构设计

根据需求分析及概要设计,进一步分析数据结构。题量数目数据表(全局变量)如表2.22所示,评分数据表(局部变量)如表2.23所示。

表2.22 题量数目数据表(全局变量)

表2.23 评分数据表(局部变量)

引导文献

1.程序设计原理

(1)模块:又称构件,是能够单独命名并独立地完成一定功能的程序语句的集合。例如,高级语言中的过程、函数、子程序等都可作为模块。

(2)模块化是软件的一个重要属性。模块化的特性提供了人们处理复杂的问题的一种方法,同时也使得软件能够被有效地管理。

(3)模块的独立性是软件质量的关键。

① 模块化程度较高的软件易于开发。

② 模块化程度较高的软件也较易于测试和维护。

2.程序描述与功能描述

功能性注释嵌入在源程序体内,用以描述其后的语句或程序段的处理功能。书写功能性注释,要注意以下几点:

(1)描述的对象是一段程序,而不是每一个语句。

(2)适当使用缩进和空行,使程序与注释容易区别。

(3)注释一定要准确。不精确的或错误的注释不仅对理解程序毫无帮助,反而会妨碍对程序的理解。

3.模块(函数)设计与算法

在设计好软件的结构后,就已经在宏观上明确了各个模块应具有什么功能,应放在体系结构的哪个位置。我们习惯地从功能上划分模块,保持“功能独立”是模块化设计的基本原则。因为“功能独立”的模块可以降低开发、测试、维护等阶段的成本。但是,“功能独立”并不意味着模块之间保持绝对的孤立。一个系统要完成某项任务,需要各个模块相互配合才能实现,此时模块之间就要进行信息交流。

1)设计准则

(1)尽力提高模块独立性。

(2)选择合适的模块规模。

(3)模块的深度、宽度、扇出和扇入应适当。

(4)模块的作用范围应该在控制范围之内。

(5)降低模块接口的复杂程度。

(6)设计单入口、单出口的模块,避免“病态连接”。

2)有效的模块设计

模块化方法带来了许多好处:一方面,模块化设计降低了系统的复杂性,使得系统容易修改;另一方面,推动了系统各个部分的并行开发,从而提高了软件的生产效率。

描述一个模块时,还必须按模块的外部特性与内部特性分别描述。模块的外部特性是指模块的模块名、参数表以及给程序或整个系统造成的影响。模块的内部特性是指完成其功能的程序代码和仅供该模块内部使用的数据。

对于模块的外部环境(如需要调用这个模块的上级模块)来说,只需要了解这个模块的外部特性,不必了解它的内部特性。在软件设计阶段,通常是先确定模块的外部特性,然后再确定它的内部特性。

3)模块独立性

所谓模块独立性,是指软件系统中每个模块只涉及软件要求的具体子功能,而与软件系统中其他模块的接口是简单的。例如,若一个模块只具有单一的功能且与其他用模块没有太多的联系,那么则称此模块具有模块独立性。

4)算法的特性

(1)有穷性:一个算法应包含有限的操作步骤,而不能是无限的。

(2)确定性:算法中每一个步骤应当是确定的,而不能是含糊的、模棱两可的。

(3)有零个或多个输入。

(4)有一个或多个输出。

(5)有效性:算法中每一个步骤应当能有效地执行,并得到确定的结果。

4.需求概述与程序设计结构

按照需求分析文档中的说明要求,使用系统选题并进行答题,统计题数,算出分数使得信息传递准确、流畅。同时,系统最大限度地实现易安装性、易维护性、易操作性、运行稳定、安全可靠性。

设计一个模块时,要考虑“模块的功能”,也要考虑“模块间的信息交流”。

5.软件体系结构

1)软件体系结构类型

(1)数据流系统。这种结构中的每一个组成成分都有一套输入和输出数据,都以输入数据-处理-输出结果的方式工作。进行数据变换的构件叫做过滤器,把数据从一个过滤器的输出导入到另一个过滤器的输入,就叫做管道。

(2)调用-返回系统:

① 主程序/子程序。

② 层次结构。在层次结构中,每一层都只与上下相邻的两层通信。每一层在利用下层基础服务的条件下,为上层提供服务。

2)软件体系结构的三要素

软件设计的目标是建立软件的体系结构表示。将这个表示当做一个框架,从事更详细的设计活动。Shaw和Garlan提出了在软件体系结构设计中应保持的下列性质。

(1)结构:体系结构设计应当定义系统的构件、这些构件打包的方式和交互的方式,如将对象打包以封装数据和操纵数据的处理,并通过相关操作的调用来进行交互。

(2)附属的功能:体系结构设计应当描述设计出来的体系结构如何实现对功能、性能、可靠性、安全性、适应性以及其他系统需求。

(3)可复用:体系结构设计应当描述为一种可复用的模式,以便在以后类似的系统族的设计中使用它们。此外,设计应能复用体系结构中的构造块。

6.“黑箱”技术

在设计当前模块时,应先把这个模块的所有下层模块定义成“黑箱”,并在系统设计中利用它们,暂时不考虑它们的内部结构和实现方法。在这一步定义好了“黑箱”,由于已确定了它的功能和输入、输出,在下一步就可以对它们进行设计和加工。这样,又会导致更多的“黑箱”。最后,全部“黑箱”的内容和结构应完全被确定。这就是自顶向下、逐步求精的过程。使用黑箱技术的主要好处是,使设计人员可以只关心当前的有关问题,暂时不必考虑进一步的琐碎的次要的细节,待进一步分解时才去关心它们的内部细节与结构。