版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
软件设计与编码3第三章第三章软件设计与编码33.1软件设计阶段的任务与目标3.2软件结构与软件结构图3.3
模块的独立性3.4结构化设计(SD)法3.5JACKSON系统开发方法3.6详细设计的描述工具3.7用户界面设计3.8程序编码33.1软件设计的任务与目标3.1.1软件设计在开发阶段中的重要性3.1.2软件设计阶段的任务3.1软件设计的目标和任务目录33.2软件结构与软件结构图3.2.1软件结构的基本概念3.2.2软件的树状结构和网状结构3.2.3软件结构图(SC图)3.2软件结构与软件结构图目录33.3模块的独立性3.3.1模块独立性3.3.2耦合性3.3.3内聚性3.3模块的独立性目录3.3.4信息屏蔽33.4结构化设计(SD)方法3.4.1结构化设计方法概述3.4.2数据流图的分类与典型的系统结构3.4.3变换分析3.4结构化设计方法目录3.4.4事务分析3.4.6软件模块结构图的改进3.4.5实例:银行贷款文件管理33.5JACKSON系统开发方法3.5.1JACKSON方法简介3.5.2JACKSON方法的设计过程3.5.3JACKSON方法的技术构成3.5JACKSON系统开发方法目录33.6.1程序流程图3.6.2N-S图3.6.3PAD图3.6详细设计描述的工具目录3.6详细设计描述的工具33.7.1用户界面的特性及设计任务3.7.2用户界面的基本类型3.7.3I/O用户界面设计3.7用户界面的设计目录3.7用户界面的设计33.8.1程序设计语言的选择3.8.2结构化程序设计3.8.3程序设计风格3.8程序编码目录3.8程序编码3.8.4算法与程序效率3.1软件设计阶段的任务与目标正如任何工程项目一样,在生产之前要做设计,软件编码前,也必须先进行软件设计。软件设计是软件开发的关键步骤,直接影响软件的质量。在软件需求分析阶段已经完全弄清楚了软件的各种需求,较好地解决了所开发的软件“做什么”的问题,并已在软件需求说明书和数据要求说明书中详尽和充分地阐明了这些需求以后,下一步就要着手实现软件的需求,即软件设计阶段要解决“怎么做”的问题。3.1软件设计阶段的任务与目标3.1.1软件设计在开发阶段中的重要性软件设计功能与性能需求编码软件测试程序模块已测试软件系统结构设计过程设计数据结构设计信息域需求开发阶段信息流3.1.1软件设计在开发阶段中的重要性软件设计阶段要解决“如何做”的问题。这显然是整个软件开发过程的核心问题,所有的开发工作都将根据设计的方案进行。系统的总体结构在该阶段决定,因此软件的总体设计决定了系统的质量。软件需求确定以后,进入由软件设计、编码、测试三个关联阶段构成的开发阶段。开发阶段的信息流如图所示。在设计步骤中,根据软件的功能和性能需求等,采用某种设计方法进行数据设计、系统结构设计和过程设计。数据设计侧重于软件数据结构的定义。系统结构设计定义软件系统的整体结构,是软件开发的核心步骤。在设计步骤中,建立软件主要成份之间的关系。过程设计则是把结构成份转换成软件的过程性描述。在编码步骤中,根据这种过程性描述,生成源程序代码,然后通过测试,最终得到完整有效的软件。3.1.2软件设计阶段的任务总体设计需求说明书复审软件结构修改详细设计可接受模块描述复审修改
设计说明书软件设计工作流程3.1.2软件设计阶段的任务一、软件设计的任务将分析阶段获得的需求说明转换为计算机中可实现的系统,完成系统的结构设计,包括数据结构和程序结构,最后得到软件设计说明书。设计阶段结束要交付的文档是设计说明书,根据设计方法的不同,有不同的设计文档。每个设计步骤完成后,都应进行复审。从工程管理的角度来看,软件设计分两步完成;分为总体设计(概要设计)和详细设计两个阶段。其工作流程如图所示。首先做概要设计,将软件需求转化为数据结构和软件的系统结构。然后是详细设计,即过程设计。通过对结构表示进行细化,得到软件详细的数据结构和算法。
三类设计任务1、划分模块,确定软件结构
开发方法不同,确定软件结构的方法也不同。例如SD法,是从分层的DFD图导出初始的结构图,再对初始的结构图进行改进,获得最终的结构图。一般包括确定系统的软件结构,分解模块,确定系统的模块层次关系。2、确定系统的数据结构数据结构的建立对于信息系统而言尤为重要。要确定数据的类型,组织、存取方式,相关程度及处理方式等。3、设计用户界面作为人机接口的用户界面起着越来越重要的作用,它直接影响到软件的寿命。因此,软件设计阶段的任务可分为三部分:软件设计的目标3.1.2软件设计阶段的任务软件设计高可靠性高可维护性高可理解性高效率
软件设计的目标3.1.2软件设计阶段的任务二、软件设计的目标在设计阶段应达到的目标是:提高可靠性;提高可维护性;提高可理解性;提高效率。衡量该目标的准则:1、软件实体有明显的层次结构,利于软件元素间控制。2、软件实体应该是模块化的,模块具有独立功能。3、软件实体与环境的界面清晰。4、设计规格说明清晰、简洁、完整和无二义性。
软件设计的目标常用的设计方法有:SD法、Jackson法、HIPO法、Parnas法、Warnier法等。3.2软件结构与软件结构图3.2软件结构与软件结构图软件结构是软件模块之间关系的表示,它决定了整个系统的结构,也确定了系统的质量。模块之间的关系可有多种,但都可以归结为一种层次关系。软件结构图是总体设计阶段的主要描述工具,它描述了构成系统的基本元素——模块及模块之间的调用关系,模块之间的数据传递关系。本节讨论如何进行软件结构的设计,设计的准则以及为了提高软件系统的质量,如何对软件结构进行改进的技术。3.2.1软件结构的基本概念二、模块化
模块化就是将系统划分为若干个模块,每个模块完成一个子功能。模块化的目的是将系统“分而治之”,模块化能够降低问题的复杂性,使软件结构清晰,易阅读、易理解,易于测试和调试,因而也有助于提高软件的可靠性。3.2.1软件结构的基本概念软件结构表示软件系统的构成,是软件模块间关系的表示,下图则为软件结构示意图。下面先介绍几个相关的的概念。ABCDEFGHIJKLM一、模块(Module)模块是程序对象有名字的集合。例如,过程、函数、子程序、宏等,是构成软件系统结构的基本元素。
软件结构图模块化降低软件复杂度的简单证明3.2.1软件结构的基本概念模块化降低软件复杂度的简单证明令:C(X)表示问题X的复杂度函数;
E(X)解决问题X所需工作量的复杂度函数;若:有问题P1,P2;
C(P1)>C(P2);显然:E(P1)>E(P2)由经验:C(P1+P2)>C(P1)+C(P2)于是:E(P1+P2)>E(P1)+E(P2)将问题(P1+P2)划分为两个问题P1和P2后,其工作量和复杂度都降低。
并非模块分得越小越好,因为模块之间接口的复杂度和工作量增加。显然,每个软件系统都有一个最佳模块数M。注意选择分解的最佳模块数。右上图描述了模块化与软件成本的关系。软件总成本
模块化与软件成本的关系成本模块数目模块成本接口成本}最小成本区M软件的层次结构3.2.1软件结构的基本概念顶层1层2层ABCDEFGHIJKLMN深度扇入为2扇出为3扇入为33层4层宽度宽度宽度
软件结构示意图有关指标:⑴深度:表示软件结构中从顶层模块到最底层模块的层数。⑵宽度:表示控制的总分布。⑶扇出数:指一个模块直接控制下属的模块个数。⑷扇入数:指一个模块的直接上属模块个数。一个好的软件结构的形态准则是:顶部宽度小,中部宽度大,底部宽度次之;在结构顶部有较高的扇出数,在底部有较高的扇入数。软件结构图表示软件的系统结构,它是软件模块间关系的表示,软件之间的各种关系,均可表示为层次结构。如图所示。3.2.2软件的树状结构和网状结构3.2.2软件的树状结构和网状结构由模块连接而得到的软件结构最普通的形式就是树状结构和网状结构。在树状结构中,位于最上层的根部是顶层模块,它是程序的主模块。与其联系的有若干下属模块,各下属模块还可以进一步引出更下一层的下属模块,如图所示的树状结构。树状结构的特点是:整个结构只有一个顶层模块,而对于任何一个下属模块来说,它只有一个上级模块,而且同一层模块之间不发生关系。顶层1层2层3层
软件的树状结构ABCDEFGHIKLM网状结构上图是网状结构的两个例子。在网状结构中,任何两个模块间都可以有双向的关系。由于不存在上级模块和下属模块的关系,也就分不出层次来。任何两个模块都是平等的,没有从属关系。
网状结构(a)(b)3.2.2软件的树状结构和网状结构ABCDEFGHABCD
分析比较两种结构的特点后可以看出,对于不加限制的网状结构,由于模块间相互关系的任意性,使得整个结构十分复杂,处理起来势必引起许多麻烦,这与原来划分模块为便于处理的意图相矛盾。所以在软件开发的实践中,人们通常采用树状结构,而不采用网状结构。模块5模块5模块4模块43.2.3软件结构图(SC图)模块1模块3模块2valuesvaluesdatadata模块1模块2模块3valuesvaluesdatadata3.2.3软件结构图(SC图)结构图(StructureChart,简称SC图)是精确表达软件结构的图形表示方法,它以特定的符号表示模块、模块间的调用关系和模块间信息的传递。结构图的主要构成有:⑴模块(Module):用矩形框表示,框中写有模块的名字,说明模块的功能。模块是程序对象有名字的集合。例如:过程、函数、子程序、宏等。⑶数据:调用箭头边上的小箭头表示调用时从一个模块传送给另一模块的数据。通常在短箭头附近应注有信息的名字,如图所示。
模块调用图⑵调用:从一个模块指向另一个模块的箭头表示前一模块对后一模块的调用,一般是上层调用下层。右图表示模块1调用了模块2和模块3。data软件结构图的辅助符号
模块间接口的表示A查询学生成绩B查找学生记录○学号查找成功的信号
当模块A有条件地调用另一个模块B时,在模块A的箭头尾部标以一个菱形符号,当一个模块A反复地调用模块C和模块D时,在调用箭头尾部则标以一个弧形符号,如图3.11所示。在结构图中这种条件调用所依赖的条件和循环调用所依赖的循环控制条件通常无需注明。常用尾端带有空心圆的短箭头表示数据信息,用尾端带有实心圆的短箭头表示控制信息。有的结构图对这两种信息不加以区别,一律用注有信息名的短箭头来表示,如图所示。
○数字信息控制信息3.2.3软件结构图(SC图)为了进一步描述模块间的调用关系,还可使用两种辅助符号。
辅助符号ABCD条件选择ABCD循环例:画出打印报告的软件结构图。
调用次序为上层调用下层;
同层按照数据传递关系确定;一般从左到右执行。
执行过程即按照数据流向进行。报告计算获得编辑确认数据读入编辑打印报告头打印报告尾打印输入EOF输入已编辑已编辑已编辑已确认已确认数据已确认数据计算结果结果日期总结果行行行3.2.3软件结构图(SC图)打印报告予以确认3.3模块的独立性3.3模块的独立性上一节讨论了关于软件结构与软件结构图的概念,本节进一步讨论影响软件系统质量的另一个关键问题,模块的独立性问题。模块化方法已经为所有工程领域所接受。模块化的主要优点是,模块化设计降低了软件系统的复杂性,使得系统容易修改,同时使得系统各个部分可以并行开发,从而提高了软件的生产率。提高模块质量在于提高模块独立性。模块的独立性用耦合性和内聚性来衡量。 3.3.1模块独立性(moduleindependence)3.3.1模块独立性
“模块”,又称“构件”,一般指用一个名字可调用的一段程序。它一般具有如下三个基本属性:⑴功能即指该模块实现什么功能,做什么事情。必须注意,这里所说的模块功能,应是该模块本身的功能加上它所调用的所有子模块的功能。⑵逻辑即描述模块内部怎么做。⑶状态即该模块使用时的环境和条件。所谓模块的独立性,是指软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其他模块的接口是简单的。即功能专一,模块之间无过多的相互作用的模块。这种类型的模块可以并行开发,模块独立性越强,开发越容易。独立性强的模块,还能减少错误的影响,使模块容易组合、修改及测试。模块独立性的度量标准是两个定性准则:
耦合性用于描述模块之间联系的紧密程度。
内聚性用于描述模块内部联系的紧密程度。模块独立性比较强的模块应该是具有高内聚性和的低耦合度。3.3.2耦合性(Coupling)3.3.2耦合性模块分解的一个目标是使块间联系尽可能小,达到这个目标可通过以下措施。⑴每个模块用过程语句(或函数方式等)调用其他模块。⑵模块间传送的参数为数据型。⑶模块间公用的信息(如参数等)尽量少。耦合性是指软件结构中模块相互连接的紧密程度,是模块间相互连接性的度量。模块分解的一个目标是使块间联系尽可能小,块间联系的大小可从三个方面衡量:数据方式作用少多数量控制混合直接调用过程调用①方式
—
块间联系方式有“直接引用”或“用过程语句调用”。②作用
—
块间传送的共用信息(参数)类型,可为“数据型”、“控制型”或“混合型”(数据/控制型)。③数量
—
块间传送的共用信息的数量。耦合性的几种类型内容耦合公共耦合控制耦合复合耦合数据耦合高耦合性低1、内容耦合(contentcoupling)
一个模块直接访问另一模块的内部数据。 一个模块不通过正常入口转到另一模块的内部。 一个模块有多个入口。 两个模块有部分代码重迭。AB进入另一模块内AB部分代码重迭Entry1
….Entry2….
多重入口3.3.2耦合性耦合性的类型3、控制耦合(ControlCoupling)一个模块传递给另一模块的信息是用于控制该模块内部逻辑的控制信号(图3.16)。显然,对被控制模块的任何修改,都会影响控制模块。A
BFlagf1f2fn...4、复合耦合(StampCoupling)
一个模块传送给另一个模块的参数是一个复合的数据结构。例如,包含几个数据单项的记录。2、公共耦合(CommonCoupling)
若干模块访问一个公共的数据环境,则它们之间的耦合称为公共耦合。公共环境可为全局数据结构、共享的通信区、内存的公共覆盖区等。显然,公共数据区的变化,将影响所有公共耦合模块,严重影响模块的可靠性和可适应性,降低软件的可读性。5、数据耦合(DataCoupling)
一个模块传送给另一个模块的参数是一个单个的数据项或者单个数据项组成的数组。3.3.2耦合性3.3.3内聚性3.3.3内聚性(cohesion)3.3.3内聚性块内联系的类型分为六类:偶然型逻辑型瞬时型通信型顺序型弱内聚性强功能型内聚性表示一个模块内部各种数据和各种处理之间联系的紧密程度,它是从功能的角度来度量模块间的联系。显然,块内联系愈紧,即内聚性愈强,模块独立性愈好。内聚性的类型13.3.3内聚性模块T中的三条语句毫无关系,A、B、C、D都不在文件CARDFILE中。模块P、Q、R分别与三条语句有关。PQRMOVEATOBREADCARDFILEMOVECTODT
偶然型模块
2、逻辑型(LogicalCohesion)将几个逻辑上相似的功能放在一个模块中,调用时由调用模块传递的参数确定执行的功能。由于要进行控制参数的传递,必然要影响模块的内聚性。如图所示由调用模块传递的参数,经过判定后,才能确定是进行读还是进行写操作。调用模块判定读一个记录写一个记录
逻辑型模块被调用模块
1、偶然型(CoincidentalCohesion)又称为巧合型,为了节约空间,将毫无关系(或者联系不多)的各成分放在一个模块中。这样的模块显然不易理解,不易修改。内聚性的类型2
3、瞬时型(TemporalCohesion)将需要同时执行的成分放在一个模块中,因为模块中的各功能与时间有关,因此又称为时间内聚或经典内聚。例如,初始化模块,中止模块等这类模块内部结构较简单,一般较少判定,因此比逻辑内聚强,但是由于将多个功能放在一起,给修改和维护造成困难。
4、通信型(CommunicationalCohesion)模块中的成分引用共同的输入数据,或者产生相同的输出数据,则称为是通信内聚模块。通信型模块比瞬时型模块的内聚性强,因为模块中包含了许多独立的功能,但却引用相同数据。通信模块一般可以通过数据流图来定义。A打印报告1打印报告2打印报告2B存入打印C修改删除打印(a)(b)(c)
通信型模块3.3.3内聚性内聚性分类
5、顺序型(SequentialCohesion)模块中某个成分的输出是另一成分的输入。由于这类模块无论数据还是执行顺序,模块中的一部分依赖于另外一部分。因此具有较好的内聚性。
顺序型模块,编辑功能的输入是读入功能的输出,打印功能的输入是累加功能的输出。3.3.3内聚性读入编辑A数据累加打印B结果
顺序型模块
6、功能型(SequentialCohesion)一个模块包括而且仅包括完成某一具体功能所必须的所有成分。或者说,模块的所有成分都是为完成该功能而协同工作、紧密联系、不可分割的。例如仅完成以下功能的模块为功能模块:
●
求平方根
●
求解一元二次方程
●
计算利息
●
判素数
求解方程的功能模块求一元二次方程求平方根AB3.3.4信息隐蔽3.3.4信息隐蔽每个模块的实现细节对于其他模块来说是隐蔽的。也就是说,模块中所包含的信息(数据和过程)不允许其他不需要这些信息的模块使用。该原则有利于提高模块的内聚性。由于一个软件系统在整个软件生存期内要经过多次修改,在划分模块时要采取措施,使得大多数过程和数据对软件的其他部分是隐蔽的。这样,在将来修改软件时,可将偶然引入错误所造成的影响限制在一个局部范围之内,不致波及到软件的其他部分。例如:定义栈(stack)操作模块makenull(置空栈);push(进栈);pop(出栈);gettop(取栈顶)empty(判栈空)其操作均被封装,无需了解模块内部的实现过程。由parnas方法提倡的信息隐蔽如下:3.4结构化设计(SD)方法3.4结构化设计(SD)法结构化开发方法(StructuredDevelopingMethod)是现有的软件开发方法中最成熟、应用最广泛的方法,主要特点是快速、自然和方便。结构化开发方法由结构化分析方法(SA法)、结构化设计方法(SD法)及结构化程序设计方法(SP法)构成。结构化设计方法(StructuredDesign,SD)是结构化开发方法的核心,与SA法、SD法密切联系,主要完成软件系统的总体结构设计。3.4.1结构化设计方法概述结构化开发方法(StructuredDevelopingMethod)是现有的软件开发方法中最成熟、应用最广泛的方法,其主要特点是快速、自然和方便。一、结构化方法构成:
SP法(StructuredProgram)
SD法(StructuredDesign)
SA法(StructuredAnalysis)SD法与SA、SP法前后衔接,是结构化开发方法的核心。3.4.1结构化设计方法概述二、SD法的基本思想
是一种面向数据流的设计方法,将系统设计成由相对独立、单一功能的模块组成的结构。SD法的设计步骤三、SD法的设计步骤1、总体设计解决系统的模块结构,即分解模块,确定系统模块的层次结构。任务: ①划分模块 ②确定模块功能 ③确定模块间调用关系 ④确定模块间界面文档:模块结构图及其模块功能说明。2、详细设计对模块图中每个模块的过程进行描述,常用的描述的方式有:伪代码,
流程图,N-S图,PAD图等。SD法也分为总体设计和详细设计两个阶段:3.4.1结构化设计方法概述软件〈层次性:反映软件整体的性质(结构图)过程性:反映局部的性质(框图)由于软件具有两类特征:SD法的设计总则3.4.1结构化设计方法概述 SA法总体设计的步骤是: ⑴从DFD图导出初始的模块结构图。⑵按照SD法设计总则,改进模块结构图。四、SD法的设计总则
根据软件结构的准则,模块化准则,软件独立性准则得到结构化设计的总则是:
软件设计过程,总体设计是关键,决定了系统结构、数据结构及软件的质量,反映了系统的概貌。“降低块间联系,提高块内联系”3.4.2数据流图的分类与典型的系统结构3.4.2数据流图的分类与典型的系统结构
一、DFD图的分类一般将DFD图分为两种典型的类型,分析系统的DFD图类型的目的,是为了采用不同的技术将其转换为初始的模块结构图。分类报名付款注销查询复审检查顺序(物理输入)检查合理性扩充代码核对检查和修改压缩代码配检查和(逻辑输入)(逻辑输出)输入主加工输出卡片旧文件(物理输出)新文件事务处理型(transaction)—
事务分析这类数据流图可看成是对一个数据经过某种加工后,按加工的结果选择一个输出数据流继续执行的处理。中心变换型(transformcenter)—
变换分析这类数据流图可看成是对输入数据进行转换而得到输出数据的处理。其特点是:DFD图可以明显分为“输入-处理-输出”三部分。典型的系统结构二、典型的系统结构⑴变换型系统结构图通过变换分析技术,将中心变换型的DFD图转换而得的SC图,称为变换型系统结构图。相应于取得数据、变换数据、给出数据,系统的结构图由输入、中心变换和输出等三部分组成。⑵事务型系统结构图通过事务分析技术,将事务处理型的DFD图转换为的SC图,称为事务型的系统结构图。其中,事务中心模块按所接受的事务的类型,选择某一个事务处理模块执行。各个事务处理模块是并列的,依赖于一定的选择条件,分别完成不同的事务处理工作。每个事务处理模块可能要调用若干个操作模块,而操作模块又可能调用若干个细节模块。某些事务处理模块可能共享一些操作模块,而某些操作模块又可以共享一些细节模块。3.4.2数据流图的分类与典型的系统结构
①确定主加工及逻辑输入/输出主加工—
描述了系统的主要功能、特征。其特点是:输入/输出数据流较多,往往主加工不止一个。逻辑输入/输出—
是指输入/输出主加工的数据流。输入流—
是把物理输入转换为逻辑输入的数据流。输出流—
是将逻辑输出转换为物理输出的数据流。FDC中心加工2号加工3号加工1号加工4号加工ABE
输入流转换流输出流
输入流转换流输出流②进行一级分解,设计上层模块为每个输入设计一个输入模块,为每个输出设计一个输出模块,同时为每个主加工设计一个处理模块。MCICTCOCCDDCICTCO3.4.3变换分析技术3.4.3变换分析技术
变换分析技术DDCC变换分析步骤③进行二级分解,设计中下层模块这一步的工作是自顶向下,逐步细化,为第一层的每一个输入模块、输出模块、处理模块设计它们的从属模块,设计下层模块的顺序一般从设计输入模块的下层开始。MCICTCO处理C取B转换B转换D送ECCDDDCCDBBEEDC中心加工2号加工3号加工1号加工4号加工ABE
输入流转换流输出流转换流④进一步细化取A转换A转换E送FAABFFE3.4.3变换分析技术
变换分析技术F3.4.4事务分析技术3.4.4“事务分析”技术①确定流界;首先从数据流图中找出事务流、事务处理中心和事务路径。事务中心前是接受事物,事务中心后是事物路径。对应模块图原始的数据流图IP1P2P3事物流事务中心事务处理事务控制接受事务发送事务P1P2P3②进行一级分析,设计上层模块;事务分析的任务是从数据流图中导出具有接受分支和发送分支的软件结构。对事务中心应设计“事物控制”模块;对事物流应设计“接受事物”模块;对事务路径,应设计“发送控制”模块。③进行二级分解,设计中下层模块;对于接受分支,可用类似于转换处理型数据流图中对输入数据流的方法设计中下层。对于发送分支,在发送控制模块下为每条事务路径设计一个事务处理模块,这一层称为事务层。在事务层模块下,沿各事务路径进行进一步细化。
事务分析技术3.4.5实例:银行贷款文件管理(MFUP)3.4.5应用举例每个贷款用户在贷款文件中占有一个记录,记录结构如表3-1。序号内容长度(字节)数据类型可否修改1账号5数字否2户名30数字字母可3地址30数字字母可4省10字母可5市15字母可6邮政编码6数字可7电话8数字可8类型1字母否9信贷员号5数字可10最近一次业务日期6数字否11最近一次付息日期6数字否12余额8数字否13业务总量8数字否14限额6数字否表3-1
分析:要求对贷款文件进行修改,修改信息由卡片输入,卡片上的修改信息格式如下:1-5位 6-9位 10位起账号 空 ××修改值1* ××修改值2* …..** (序号)其中*为分界符,**为结束符贷款文件的记录格式(如表3-1)修改记录(卡片)格式3.需求分析结果贷款文件的DFD图,是一种混合的DFD图。输入为:卡片和旧记录。输出为:新记录和报告。4、将DFD图转换为模块结构图。3.4.5应用举例图3.28修改贷款文件DFD修改记录写记录卡片编辑卡片检查顺序检查次序账号相等错误顺序卡片修改信息旧记录顺序记录要修改的记录不修改的记录已修改的记录新记录抽出修改抽出编辑顺序卡片修改信息2345679编辑卡片加工分解主加工是??报告报告修改信息顺序记录新记录3.4.5应用举例
修改贷款文件的DFD图需求分析结果—DFD图答案主加工图3.29模块结构图贷款文件管理系统取顺序记录修改记录打印报告打印记录比较账号取修改信息读旧记录检查顺序取卡片读卡片检查顺序卡片卡片顺序卡片旧记录旧记录顺序记录顺序记录顺序卡片顺序卡片已修改编辑卡片“编辑卡片”应继续向下分解,是典型的“事务处理”型的DFD图。写记录写记录旧记录不修改的记录已修改的记录新记录修改记录卡片编辑卡片检查顺序检查次序账号相等错误顺序卡片修改信息顺序记录要修改的记录报告3.4.5应用举例转换后的模块图如图所示。将DFD图转换为模块结构图已编辑卡片
按照“降低块间联系,提高块内联系”的设计总则进行修改,完善系统的模块图,写出模块的功能说明。具体应从以下方面改进:1)尽可能建立功能模块功能模块具有最强的内聚性,应满足信息屏蔽原则:
一个模块内所包含的信息(过程和数据)对不需要这些信息的模块是不能访问的(黑盒)。功能模块的组成:
执行某项任务的部分出错处理部分返回结束标志3.4.6模块结构图的改进3.4.6模块结构图的改进图3.30消除重复功能
消除重复功能(a)(b)(c)(d)Q重复部分XQ1YQ22)消除重复功能
若两模块含有重复的部分,应设法将重复的功能消去。
如下图所示,Q1和Q2两个模块具有类似的功能,图(b)、(c)、(d)方案就是可能的解决方案。3.4.6模块结构图的改进XYQ’1Q’2QYQ’2XQ’1QXQ’1YQ’2图3.31、图3.32控制范围
—
结构方面的特点,包括模块及其所有下属模块。作用范围
—
判断所涉及到的模块,是从功能特点考虑的。SD方法认为:当作用范围为控制范围的子集时,才能获得较低的块间联系。如图(b)中的设计,判定的作用范围恰好在判定所在模块的下一层。3)模块的作用范围与控制范围TOPXTBAB1B2图(b)中模块TOP的控制范围是:
模块TOP、X、T、B、A、B1、B2;模块B的控制范围与作用范围相同,均为:模块B、A、B1、B2图(a)中模块A的控制范围:
A、B、C、D、G、E、F如果模块F的判定涉及到模块B、E、F。则F的的作用范围:B、E、FABCDGEFFBE(a)(b)3.4.6模块结构图的改进答案图3.33控制范围与作用范围显然,图(a)不满足作用范围应与控制范围的原则,模块F的作用范围不在控制范围之内。图(b)中模块TOP和图(c)中模块B虽然满足上述原则,但其作用范围所涉及到的模块不是直接的。图(d)的模块设计最合理。3.4.6模块结构图的改进应用范围与作用范围举例TOPABCDEF
(a)◆TOPABCDEF(d)◆TOPABCDEF(b)◆TOPABCDEF(c)◆比较(a)、(b)、(c)、(d)4种设计方案的优劣!模块图的改进4)模块的大小适当模块大小指其篇幅,一般模块大小约50-100行为宜。5)模块的扇入扇出数不宜太多一个模块调用其他模块的个数,称为该模块的扇出。模块的扇出不宜过大,一般认为不要超出7个。一个模块被其他模块调用的个数,称为该模块的扇入。扇入越大,除服务性模块外,模块的扇入扇出数不宜太多,否则块间联系增加。3.4.6模块结构图的改进3.5JACKSON系统开发方法3.5JACKSON系统开发方法结构化开发方法是一种面向数据流、数据封闭性的开发方法,而JACKSON系统开发方法则是面向数据结构的开发方法。其基本思想是先建立输入、输出的数据结构,再将其转换为软件结构。JACKSON方法由英国的M.Jackson提出,该方法特别适合于数据处理类的问题,如企事业管理一类的软件系统。Jackson系统开发(JSD)方法是一种典型的面向数据结构的分析与设计方法。其分析的重点放在构造与系统相关的现实世界,并建立现实世界的信息域的模型上。其最终目标是生成软件的过程性描述。JSD方法的步骤如下:1、实体动作分析2、实体结构分析3、定义初始模型4、功能描述:详细说明与已定义的动作相对应的功能。5、决定系统时间特性:对进程调度特性进行评价和说明。6、
实现:设计组成系统的硬件和软件。
JSD方法的前三步属于需求分析阶段,后三步属于软件设计阶段。3.5.1JSD系统方法简介3.5.1JACKSON方法概述JACKSON方法的构成
JACKSON方法由JSP(JacksonstructuredProgramming)和JSD(JacksonSystemDevelopment)方法构成。JSP法主要体现程序结构的设计,不严格区分软件概要设计和详细设计。可以根据JSP的规则直接导出程序结构。一般用于规模不大的数据处理系统,而且I/O数据结构容易描述的情况。
JSD法是对JSP法的扩充,针对JSP法的缺陷而提出的解决方案。其主要特点是:用“分而治之”的策略控制系统的复杂性,解决I/O结构的冲突问题。
SD法是一种面向数据流的设计方法,JACKSON方法是一种面向数据结构的设计方法。强调程序结构与问题结构相对应。3.5.1JACKSON方法概述一、JACKSON方法的构成实体结构分析实体结构分析是用Jackson图来描述每个实体执行的动作及其时序,产生一组描述实体进程的Jackson结构图。为了表示实体结构,Jackson引入了结构图。在此图中,给出了对实体的三种典型动作,即顺序的、选择的和重复的。其中,顺序型是指对于实体A的动作B,C是按时间顺序先左后右执行;选择型使用了符号“○”,表示实体A的两个动作B与C在某个时刻只做一个;重复型表示带有“*”的动作重复执行多次。例:下图是餐厅业务中的会计进程。
餐厅业务中的会计进程3.5.1JACKSON方法概述3.5.2JACKSON方法的设计过程2、以数据结构为基础,建立相应的程序结构图,也称为JACKSON图。当没有结构冲突时,转换过程是简单的。1、建立数据结构
JACKSON方法中数据结构通常表示为树型结构,有顺序、选择和循环三种基本结构。如下图按照三种基本结构建立的文件数据结构。ABCD顺序结构ABCD选择结构。。。AB*循环结构文件记录*项1项2项3
文件数据结构
三种基本结构3.5.2JACKSON方法的设计过程处理文件处理记录*处理项1处理项2处理项3
文件结构图例2:合并文件输入姓名和地址文件职工记录*工号姓名地址工资文件职工记录*工号工资新文件职工记录*工号姓名地址工资输出I/O文件的数据结构2、设计程序图由于输入、输出数据结构在内容、数量、次序上是对应的,不难导出结构图。取姓名地址记录*工号姓名地址取工资记录*工号工资产生新文件产生新记录*工号姓名地址工资结构图例2:合并文件(考虑输入和输出之间的对应关系),输入、输出数据结构在内容、数量、次序上是对应的。1、数据结构3.5.2JACKSON方法的设计过程3.5.3JACKSON方法的技术构成例3:产生报文分析报告。一组报文穿在若干卡片上,卡片上词与词之间用空格分隔,最后两张结束卡片的内容分别是“0000”和“EOF”,所有卡片以“EOB”结束。一、结构冲突
所谓结构冲突,是指输入数据与输出数据之间很少或没有结构上的对应关系。
这种情况就很难从数据结构导出程序结构。通常解决的办法是:构造一个或者多个中间结构,在输入和输出结构之间进行转换。
输出报文形式:报文分析报告 (标题)
本报有XX个词 其中有XX个词多于12个字符 (报告正文) 分析报告结束
(报告底)3.5.3JACKSON方法的技术构成输入报文卡片报告卡结束卡卡片体EOB0000EOF字符组词组*词空格组空格报告标题报告体报告底词超长词(a)输入数据结构(b)输出数据结构*
输入输出数据结构建立输入输出的数据结构,有明显的结构冲突,如图所示。图3.40报文的数据结构3.5.3JACKSON方法的技术构成输入结构型1词*0000过程P1过程P2型2S1报文词*0000正常词超长词输出结构过程P3S2为了解决输入、输出的结构冲突问题,引入两个中间结构:⑶S2经变换P3容易转换为输出结构。⑵第二中间结构S2识别“正常词”与“超长词”,由过程P2完成。
中间结构转换图3.41中间结构转换⑴第一中间结构S1简化输入,去掉输入报文中多余的字符(“EOB”、EOF”、多余空格),由过程P1完成。3.5.3JACKSON方法的技术构成图3.42报文分析模块图报文分析结构图报告标题报告体报告底词超长词输出数据结构分析报告打印标题打印报告体打印报告底处理中间结构打印报告内容P1P2P3打印总词数打印超长词数
报文分析模块图显然,中间结构的选取依赖于设计者对问题的理解及其设计者的设计风格。根据报文的中间结构,将输入数据结构转换为与输出的数据结构相对应,消除了结构冲突,上图将报文分析的数据结构转换为结构图。3.5.3ACKSON方法的技术构成二、回溯问题(Backtracking)
若B处理G前遇到条件(Condition)假设(Posit):
A选择执行B,则B处理E、F,
转向执行C。则停止(quit)执行G,AC。EFGPositelsequitadmitconditionAPositB。EFconditionquitadmitadmitCB。C。。在求解一些探索性问题时,常常需要进行回溯,为了解决具有试探性的求解过程,JACKSON方法提供了一种回溯结构设计。其基本思想是:执行选择、循环等结构时,先测试条件再做处理,若选择依据不充分,则可能产生回溯。下图是一种回溯结构。3.5.3JACKSON方法的技术构成
回溯结构回溯结构设计
回溯结构由三种构件组成:1、Posit(假定)用于表示条件成立时的处理过程,进入Posit构件时程序状态就被保存起来。2、Quit(退出)当假定条件不成立,控制转向另一认可。3、Admit(认可)
Admit构件提供了另一条处理路径,在Admit的入口处程序无条件恢复到原有状态。
JACKSON方法优点:结构清晰、易理解、易修改。不会过多依赖于设计者的经验。缺点:当系统规模及复杂度大时,确定数据结构困难。3.5.3JACKSON方法的技术构成一、任务
详细设计阶段的任务是开发一个可以直接转换为程序的软件表示,即对系统中每个模块的内部过程进行设计和描述。二、常用的描述方法工具1、流程图2、结构化流程图(N-S图)3、PAD图—问题分析图4、PDL语言3.6详细设计描述工具3.6详细设计描述工具abX1X2X7X6X4X3X5higfedcjFTFFFTTT多分支选择结构先判定型循环结构选择结构后判定型循环结构3.6.1程序流程图3.6.1程序流程图
流程图N-S图由而且仅由顺序、选择、循环三种基本结构组成。基本图例如下:顺序结构块1块2块3块4条件TF块1块2选择结构CaseI=1,2,3T块1块2多分支选择结构F块3块当条件成立时当型循环块直到条件成立时直到型循环3.6.2N—S图3.6.2N—S图N-S图N-S图举例3.6.2N—S图ab条件1TF
Case
Xi,i=2,3,4X2X3X4当条件3成立条件2直到条件4成立直到条件成立cdefghij顺序结构选择结构多分支选择结构先判定型循环结构后判定型循环结构FTTFN-S图举例3、PAD图—问题分析图(ProblemAnalysisDiagram)其基本控制结构如下:任务1任务2任务3
顺序结构WHILE型条件循环体先判定型循环结构条件then部分else部分选择结构TFUNTIL型条件循环体后判定型循环结构控制变量
任务1任务2任务n多分支选择结构值1值2值n3.6.3PAD图3.6.3PAD图PADL图基本结构例:对数组X进行排序。“自顶而下,逐步求精”
1、循环一次,排好一个X[h]排好第H个X[h]找X[J]=MAX(X[h]。。X[n])交换X[J]和X[h]2、细化(a)(b)(b)(a)3、连接各图,构成完整的PAD图H:=1,n-1排好第h个X[h]H:=1,n-1H:=1,n-1W:=X[h]X[h]:=X[j]X[j]:=wJ:=hk:=h+1,nX[k]>X[J]J:=kH:=1,n-1H:=1,n-1H:=1,n-1例13.6.3PAD图PAD图应用举例BEGINFIRST:=K[1];SECOND:=0;FIRST=K[I]SECOND=0I:=2toNK[I]>SECONDK[I]>FIRSTSECOND=FIRSTFIRST=K[I]SECOND=K[I] ELSESECOND:=K[I]ENDENDEND.
PASCAL源程序段对应PAD图FORI:=2TONDOBEGINIFK[1]>SECONDTHENBEGINIFK[I]>FIRSTTHENBEGINSECOND:=FIRST; FIRST:=K[I]ENDPAD图应用例2例23.6.3PAD图PAD图应用举例A、DEF图式:一个加工在一页中画不下时,用DEF图式定义后,可在另一页上画出。B、N+1/2循环NAMEAS1UNTILQS2S3S1PS1S2或S1S2PAD图的扩充图式3.6.3PAD图SNAMEA条件H1S1S2PPADL图扩充图式随着各种应用软件的面市,作为人机接口的用户界面具有越来越重要的作用,用户界面是否友好直接影响到软件的寿命与竞争力。因此,对用户界面的设计必须予以足够的重视。3.7用户界面设计本节将对用户界面设计中的主要问题进行讨论。用户界面应具有的特性—
什么是友好的用户界面。用户界面设计的任务—
用户界面设计应该完成的工作。用户界面的基本类型—
用户界面的工作模式。3.7用户界面设计一、用户界面应具有的特性
1、可使用性①使用简单。②用户界面中所用术语的标准化和一致性。③具有HELP功能。④快速的系统响应和低的系统成本。⑤具有容错能力。
2、灵活性①考虑用户的特点、能力、知识水平。②提供不同的系统响应信息。③提供根据用户需求制定和修改界面。
3、界面的复杂性与可靠性复杂性—界面规模及组织的复杂程度。应该愈简单愈好。可靠性—指无故障使用的时间间隔。用户界面应该能够保证用户正确、可靠地使用系统,及程序、数据的安全。3.7.1用户界面的特性及设计任务3.7.1用户界面的特性及设计任务
1、用户特性分析—
用户模型
了解所有用户的技能和经验,针对用户能力设计或更改界面。从以下方面分析:用户类型—
通常分为:外行型、初学型、熟练型、专家型。用户特性度量—
与用户使用模式和用户群体能力有关。包括:用户使用频度、用户用机能力、用户的知识、思维能力等。二、用户界面设计的任务这部分工作应该与软件需求分析同步进行。包括以下内容:2、用户界面的任务分析—任务模型(DFD图)是对系统内部活动的分解,不仅要进行功能分解(用DFD图描述),还要包括与人相关的活动。每个加工即一个功能或任务。3.7.1用户界面的特性及设计任务3、确定用户界面类型1、菜单(menu)
按照显示方式正文菜单、图标菜单、正文和图标混合菜单,如“开始”菜单。3.7.2用户界面的基本类型
从用户角度出发,用户界面设计的类型主要有问题描述语言,数据表格、图形与图标、菜单、对话框及窗口等。每一种类型都有不同的特点和性能。讨论以下类型:菜单、图象、对话框和窗口。按屏幕位置和操作风格固定位置、浮动位置(弹出)、下拉式、嵌入式
混合菜单
固定及下拉菜单固定菜单下拉菜单3.7.2用户界面的基本类型2、图像在用户界面中,加入丰富多彩的画面,将能够更加形象地为用户提供有用的信息,以达到可视化的目的。主要的处理操作有:图像的隐蔽和再现、屏幕滚动和图案显示、动画等。3.7.2用户界面的基本类型2、图像3、对话框对话框是在需要时,显示在屏幕上一个矩形区域内的图形和正文信息。通过对话,实现系统和用户之间的通信。对话框显示的方式与弹出式菜单类似,即瞬时弹出。同时,系统还应将对话框所覆盖的原图像进行保存,以便在对话结束后能立即恢复。有三种对话形式:必须回答式无需回答式警告式
必须回答式对话框
无需回答式对话框
警告式对话框3.7.2用户界面的基本类型3、对话框4、窗口(window)图形学中称为视图区(Viewport),视为虚拟屏幕。一个实用窗口,可包含部件:
3.7.2用户界面的基本类型
菜单区(menubar)图标区(iconbar)标题区(titlebar)移动区(movebar)大小区(sizebar)退出区(quitbar)用户工作区(user’sworkbar)横向滚动区(horizontalscrollbar)纵向滚动区(verticalscrollbar)4、窗口4、窗口(window)
下图描述了一个包括多个部件的窗口.3.7.2用户界面的基本类型标题区图标区大小区退出区菜单区滚动区菜单工作区图3.613.7.3I/O用户界面设计3.7.3I/O用户界面设计
I/O用户界面的设计,尤其是数据输入界面的设计,直接影响到用户使用系统的效率。特别是输入数据量大时,主要考虑提高输入速度。1、数据输入界面设计数据输入界面设计是系统的一个重要组成部分,一个好的输入界面应该尽可能方便而有效地进行数据输入。
⑴尽量减少输入工作量采用对相同内容输入设置默认值(缺省值)、自动填入、列表或点击选择
⑵输入屏幕与输入格式匹配
应以操作简便为主要原则。
⑶数据输入的一般规则
常常考虑确定输入、交互动作、确定删除、提供反馈数据等。2、输出界面设计
数据输出界面设计,首先应该了解数据显示的要求,选择适当的显示内容和显示的形式。⑴显示内容选择的原则是:
只选择必需的数据显示,联系紧密的数据应一起显示,每一屏数据的数量,不超过整个屏幕的30%。
⑵安排显示结构的规则:
数据安排要方便用户使用,要提供明了的提示帮助信息。
3.7.3I/O用户界面设计I/O用户界面设计
软件的详细设计完成,就表示完成了软件的过程性的描述,进入程序编码阶段。
3.8程序编码3.8程序编码本节不是介绍如何编写程序,而是从如何提高软件的质量和可维护性的角度,讨论在编码阶段所要解决的主要问题:程序设计语言的特性及选择的原则程序设计风格
在软件生命期中,程序经常需要被人阅读和理解,如何提高程序的可读性(Readability)?使程序“简单”和“清晰”,进而使程序具有良好的可靠性、可维护性。编码(Coding)阶段的任务简单说,是为每个模块编写程序。即是将详细设计的结果转换为用某种计算机语言写的程序——源程序代码。12
如何选择程序设计语言?关系到程序的效率和质量。应根据软件系统的应用特点,语言的内在特点等选择程序设计语言。
(1)项目的应用领域:应尽量选取适合某个应用领域的语言。
(2)算法和计算复杂性:要根据不同语言的特点,选取能够适应软件项目算法和计算复杂性的语言。
(3)软件的执行环境:要选取机器上能运行且具有相应支持软件的语言。
(4)性能因素:应结合工程具体性能来考虑,例如实时系统要求速度,就应选择汇编语言。
(5)数据结构的复杂性:要根据不同语言构造数据结构类型的能力选取合适的语言。
(6)软件开发人员的知识水平以及心理因素。知识水平包括:专业知识,程序设计能力。心理因素:如对某种语言或工具的熟悉程度。受外界的影响(盲目追求高、新)。3.8.1程序设计语言的选择一、语言选择的一般准则3.8.1程序设计语言的选择二、高级语言的内在特点
1、传统的高级语言
BASIC、FORTRAN、ALOGL
2、通用的结构化程序设计语言特点:具有很强的过程功能和数据结构功能,并提供结构化的逻辑构造。代表:PASCAL、PL/1、C、Ada等,均来自ALOGL语言。
PL/1第一个真正广泛使用的语言,可用于多种不同的应用领域。支持多任务处理和复杂的I/O功能,表处理等。
Ada用于其嵌入式实时计算机设计的标准语言。提供了一组丰富的实时特性,包括多任务处理,中断处理任务间的同步通信等。提供了许多Ada程序包及辅助软件开发环境。3.8.1程序设计语言的选择
Java的设计接近C++,但作了许多重大修改,不再支持运算符的重载,多继承及许多自动强制等易混淆又较少使用的特性。增加了内存空间自动垃圾收集的功能。简单网络支持
提供附加的例程库,用以支持Java的应用程序对网络对象的访问。安全有建立在公共密钥技术基础上的确认技术,指示器语义的改变,将使应用程序无法访问原有的数据结构和私有数据,大多数病毒无法破坏数据。3、面向对象的程序设计语言Smalltalk
首先实现真正的面向对象的程序设计,支持程序部件的“可复用性”。C++
既融合了面向对象的能力,又与C语言兼容,保留了C的许多重要特性。维护了大量已开发的C库、工具及C源程序的完整性。代表:TurboC++;BorlandC++;MicrosoftC++Java
是一种简单的面向对象的分布式的语言。功能强大、高效安全,与结构无关,易于移植,是多线程的动态语言。增加了ObjectiveC的扩充,提供更多的动态解决办法。3.8.1程序设计语言的选择3.8.1程序设计语言的选择4、面向对象的可视化语言—所见即所得
VB
(MicrosoftVisualBasic)
VC
(MicrosoftVisualC++)提供了可视化的开发环境,具有图形设计工具,结构化的事件驱动编程模式。
三、第四代语言称为4GL,不需要规定算法细节,在更高层次上用不同文法表示程序结构和数据结构。分为:查询语言程序生成器其他4GL如:判断支持语言、原型语言、形式化规格说明语言。
4、面向对象的可视化语言结构程序设计的概念最早是由E.W.Dijkstra提出来的,是为了解决程序可读性差的问题,创立一种新的程序设计思想、方法和风格,以显著提高软件生产率和质量。3.8.2结构化程序设计究竟什么是结构化程序设计?
主要特点:
1.自顶而下,逐步求精。这种逐步求精的思想符合人类解决复杂问题的普遍规律,从而可以显著提高软件开发的效率。而且这种思想还体现了先全局后局部、先抽象后具体的方法,使开发的程序层次结构清晰,易读、易理解、易验证,因而提高了程序的质量。
2.结构化的程序是由且仅由顺序、选择、循环三种基本控制结构组成,既保证了程序结构清晰,又提高了程序代码的可重用性。3.8.2结构化程序设计结构化程序设计是一种程序设计技术,它采用自顶向下,逐步求精的程序设计方法和单入口和单出口的控制结构。
例:要求用筛选法求100以内的素数。
筛选法为:从2到100中去掉2,3,…,9,10的倍数,剩下的就是100以内的素数。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年可视楼宇对讲合同(1篇)
- 2026年石材工程合同(1篇)
- 硅片切割液废砂浆回收项目可行性研究报告
- 行政法的基本概念原则和调整对象
- 高中信息技术信息系统在中医针灸推拿馆治疗记录与效果评估中的应用课件
- 脑室腹腔分流手术详解
- 2026年及未来5年市场数据中国空调被行业市场发展数据监测及投资前景展望报告
- 2025 高中信息技术数据与计算之数据在智能医疗远程诊断准确性提升中的应用课件
- 2026年助听器佩戴依从性监测数据上传远程医疗平台
- 2026年液流电池在微电网多能互补系统中应用
- 【《汽车排气系统三维建模及有限元仿真分析》17000字(论文)】
- 学校管理特色工作汇报
- 急危重症快速识别与急救护理
- 2026年新高考数学专题复习 103.马尔科夫链讲义
- 初中数学备课教案模板
- 浙江建设监理管理办法
- 2026届天津市部分区(蓟州区)中考英语考试模拟冲刺卷含答案
- 运输公司废物管理办法
- 水库安全度汛培训课件
- 2025年上海高二学业水平合格性考试信息技术试卷(含答案详解)
- 数字媒体艺术设计毕业设计
评论
0/150
提交评论