《面向对象方法学优秀课件.ppt》由会员分享,可在线阅读,更多相关《面向对象方法学优秀课件.ppt(70页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、面向对象方法学面向对象方法学第1页,本讲稿共70页讨论讨论l软件?l软件危机?l软件工程?l你开发软件采用的方法?第2页,本讲稿共70页软件危机软件危机l软件定义:软件定义:一个软件必须由一个完整的配置组成。一个软件必须由一个完整的配置组成。软件软件是程序、数据及相关文档的完整集合。是程序、数据及相关文档的完整集合。第3页,本讲稿共70页软件开发的高成本与低质量的矛盾称为软件危机。软件危机第4页,本讲稿共70页 软件开发和维护过程中遇到一系列严重的问题(1)对软件开发成本和进度估计不准确。对软件开发成本和进度估计不准确。经费预算算经常突破,完成常突破,完成时间一再拖延。一再拖延。(2)开发的软
2、件不能满足用户要求。开发的软件不能满足用户要求。开开发初期初期对用用户的要求了解不的要求了解不够明确,未能得到明确表达。开明确,未能得到明确表达。开发工作工作开始后,开始后,软件人件人员和用和用户又未能及又未能及时交交换意意见,使得一些,使得一些问题不能及不能及时解决,解决,导致开致开发的的软件不能件不能满足用足用户的要求,使开的要求,使开发失失败。(3)软件产品质量靠不住。软件产品质量靠不住。(4)软件可维护性差。软件可维护性差。开开发过程没有程没有统一的、公一的、公认的的规范,范,软件开件开发人人员按各自的按各自的风格工作,格工作,各行其事。开各行其事。开发过程无完整、程无完整、规范的文档
3、,范的文档,发现问题后后进行行杂乱无章的乱无章的修改。程序修改。程序结构不好,运行构不好,运行时发现错误也很也很难修改,修改,导致致维护性差。性差。第5页,本讲稿共70页(5)开发的软件可靠性差。开发的软件可靠性差。由于在开由于在开发过程中,程中,没有确保没有确保软件件质量的体系和措量的体系和措施,在施,在软件件测试时,又没有,又没有严格的、充分的、完全的格的、充分的、完全的测试,提交提交给用用户的的软件件质量差,在运行中暴露出大量差,在运行中暴露出大量的量的问题。这种不可靠的种不可靠的软件,件,轻者会影响系者会影响系统正常正常工作,重者会工作,重者会发生事故,造成生命生事故,造成生命财产的重
4、大的重大损失。失。(6)(6)软件没有适当的文档材料软件没有适当的文档材料(7)(7)传统的软件开发速度远远跟不上应用速度。传统的软件开发速度远远跟不上应用速度。第6页,本讲稿共70页与软件本身的特点有关与软件本身的特点有关和软件开发与维护的方法不正确有关。和软件开发与维护的方法不正确有关。产生软件危机的原因第7页,本讲稿共70页缺乏缺乏“可见性可见性”管理和控制软件开发过程相当困难管理和控制软件开发过程相当困难 软件较难维护。软件较难维护。规模庞大规模庞大为了在预定时间内开发出规模庞大的软件,必须由许多人分工合作,然为了在预定时间内开发出规模庞大的软件,必须由许多人分工合作,然而,如何保证每
5、个人完成的工作合在一起确实能构成一个高质量的大型而,如何保证每个人完成的工作合在一起确实能构成一个高质量的大型软件系统,不仅涉及许多技术问题,更重要的是必须有严格而科学的管软件系统,不仅涉及许多技术问题,更重要的是必须有严格而科学的管理。理。(1)与软件本身的特点有关)与软件本身的特点有关第8页,本讲稿共70页忽视软件需求分析的重要性忽视软件需求分析的重要性 (2)与软件开发与维护的方法不正确有关)与软件开发与维护的方法不正确有关轻视维护轻视维护 软件已件已经完成之后完成之后进行的行的维护是极端是极端艰巨复巨复杂的工的工作,需要花作,需要花费很大代价。很大代价。统计数据表明,数据表明,实际上用
6、于上用于软件件维护的的费用占用占软件件总费用的用的55%55%70%70%。作好软件定义时期的工作,是降低软件成本提高软件作好软件定义时期的工作,是降低软件成本提高软件质量的关键。质量的关键。第9页,本讲稿共70页 克服软件危机的途径软件危机的途径用现代工程的概念、原理、技术和方法进行软件开用现代工程的概念、原理、技术和方法进行软件开发、管理和维护。发、管理和维护。l组织管理措施组织管理措施软件开件开发不是某种个体不是某种个体劳动的神秘技巧,而的神秘技巧,而应该是一种是一种组织良良好、管理好、管理严密、各密、各类人人员协同配合、共同完成的工程同配合、共同完成的工程项目。目。l技术措施技术措施(
7、方法和工具方法和工具)在在软件开件开发的每个的每个阶段都有段都有许多繁多繁琐重复的工作需要做,在适重复的工作需要做,在适当的当的软件工具件工具辅助下,开助下,开发人人员可以把可以把这类工作做得既快又好。工作做得既快又好。第10页,本讲稿共70页系统工程系统工程系统建模系统建模 第11页,本讲稿共70页 系统模型的定义系统模型的定义l系统模型是一个系统某一方面本质属性的描述,它以某种确定的形式(例如文字、符号、图表、实物、数学公式等)提供关于该系统的知识。l系统模型一般不是系统对象本身,而是现实系统的描述、模仿或抽象。系统是复杂的,系统的属性也是多方面的。对于大多数研究目的而言,没有必要考虑系统
8、的全部属性,因此,系统模型只是系统某一方面本质属性的描述,本质属性的选取完全取决系统工程研究的目的 第12页,本讲稿共70页l根据不同的研究目的,同一个系统可以建立不同的系统模型。例如,城市经济模型,可以用一、二、三产业表示,也可以用各个行政管理部门来表示。l同一种模型可以代表多个系统。例如,y=kx(k是为常量),几何上:代表一条通过原点的直线;代数上:表示比例关系;设k,x代表直径,则y表示圆周长;设k表示弹簧刚度,x表示伸长量,则y表示弹簧力大小;当ka表示加速度,xm表示质量,则y表示物体所受外力大小等等。第13页,本讲稿共70页 系统模型与原型系统模型与原型l系统模型反映实际系统的主
9、要特征,但它又高于实际系统而具有同类问题的共性。因此一个适用的系统模型应该具有如下三个特征:l(1)它是现实系统的抽象或模仿;l(2)它是由反映系统本质或特征的主要因素构成的;l(3)它集中体现了这些主要因素之间的关系。第14页,本讲稿共70页 系统模型与原型系统模型与原型l给对象实体以必要的简化,用适当的表现形式或规则把它的主要特征描绘出来,这样得到的模仿品称为模型,对象实体称为原型。l模型也有结构,模型结构与原型结构是不同的两码事,但两者又有直接或间接的联系。l原型中必须考虑的结构问题都应在模型中有所反映,能以模型的语言描述出来。第15页,本讲稿共70页 系统模型与原型系统模型与原型l数学
10、模型是抽象模型,不能要求它直接反映系统原型的结构,但必定与原型结构有内在联系,原型中的结构问题在模型中用数学语言描述,能用数学方法分析和解决。例如,原型的结构稳定与否可以转化为模型中数学结构的稳定与否。l构造模型是为了研究原型,通过模型研究能够把握原型的主要特性。模型又是对原型的简化,应当压缩一切可以压缩的信息 力求经济性好,便于操作。l没有简化不成其为模型,同原型比较未能显著简化的模仿品不是好模型。第16页,本讲稿共70页 系统模型的分类系统模型的分类l实体模型 即系统本身,当系统的大小刚好适合研究而又不存在危险时,就可以把系统本身作为模型。实体模型包括抽样模型,例如标准件的生产检验是从总体
11、中抽取一定数量的样本进行的,样本就是实体模型。l相似模型 根据相似原理,利用一种系统去代替另一种系统。例如用电路系统代替机械系统、热力学系统进行研究,则电路系统就是后二者的相似模型。第17页,本讲稿共70页 系统模型的分类系统模型的分类l比例模型 是放大或缩小的系统,使之适合于研究。l文字模型 如技术报告、说明书等。在物理模型和数学模型都很难建立时,有时不得不用它来描述研究结果。l网络模型 用网络图来描述系统的组成元素以及元素之间的相互关系(包括逻辑关系与数学关系)第18页,本讲稿共70页 系统模型的分类系统模型的分类l图表模型 用图像和表格描述的模型,它们可以互相转化,这里说的图像是指坐标系
12、中的曲线、曲面和点等几何图形。l逻辑模型 表示逻辑关系的模型,如方框图、程序单等。l数学模型 用数学方程式表示的模型。l计算机模型 用计算机设计语言描写的模型。第19页,本讲稿共70页 数学模型数学模型l所谓系统的数学模型,指的是描述元素之间、子系统之间、层次之间相互作用以及系统与环境相互作用的数学表达式。l原则上讲,现代数学所提供的一切数学表达形式,包括几何图形、代数结构、拓扑结构、序结构、分析表达式等,均可以作为一定系统的数学模型。l大量的数学模型是定量分析系统的工具。用数学形式表示的输出对输入的响应关系,就是广泛使用的一种定量分析模型 第20页,本讲稿共70页 数学模型数学模型l技术科学
13、层次的系统理论和系统工程,都主要使用数学模型作为定量分析工具,以便给出设计、操作系统所必须的定量结论。l数学模型同样可以作为定性描述系统的工具,对于描述系统演化现象来说,人们关心的主要是系统定性性质的改变与否,定性分析是更基本的。l定量描述系统的数学模型必须以正确认识系统的定性性质为前提。描述系统的特征量的选择建立在建模者对系统行为特性的定性认识基础上。第21页,本讲稿共70页 数学模型数学模型l优点l定量分析的基础 在自然科学和工程技术领域里,数量不准将招致质量低劣,在社会科学领域里,没有定量分析会使人心中无数,造成决策失误,引起不必要的混乱。因此,采用数学模型进行定量分析已成为当代自然科学
14、和社会科学进一步发展的共同要求。第22页,本讲稿共70页 数学模型数学模型l优点l系统预测和决策的工具 可以利用系统已有的数据建立预测模型,用来预测系统的未来状态,为正确决策提供依据。l灵活性好 它可变性好、适应性强、分析问题速度快,省时省钱,而且便于使用计算机,因此,它是所有模型中使用最广泛的一种。我们通常所说的系统建模,大多数情况下都是指建立系统的数学模型。第23页,本讲稿共70页 计算机模型计算机模型l用计算机程序定义的模型。首先明确构成系统的“构件”,把它们之间的相互关联方式提炼成若干简单的行为规则,并以计算机程序表示出来,以便通过在计算机上的数值计算来模仿系统运行演化,观察如何通过对
15、构件执行这些简单规则而涌现出系统的整体性质,预测系统的未来走向。l所有数学模型都可以转化为基于计算机的模型,通过计算来研究系统。l许多无法建立数学模型的系统,如复杂的物理过程,特别是生物、社会和行为过程,也可能建立基于计算机的模型。第24页,本讲稿共70页 计算机模型计算机模型l用数学表达式定义的传统模型,求解和处理往往需用复杂艰深的理论和技巧,费时费力,可行性常常较差,所得结果有时无法用实验检验。l用计算机程序定义的模型,可以做到既严格,又可行,能够在计算机上研究和预测系统,通过计算实验来检验结果。l对于那些无法用真实的实验来检验的复杂系统,计算实验是唯一可用的实验检验手段。l 计算实验是一
16、种新兴的实验形式,它为研究复杂巨系统提供了唯一普遍可用的实验手段。第25页,本讲稿共70页 系统建模方法系统建模方法l 1 系统模型的要求l 2 建模的原则 第26页,本讲稿共70页 1 系统模型的要求系统模型的要求l真实性 要求建立的模型能够很好地反映系统的客观实际,应把系统本质特征和关系反映进去,而把非本质的东西去掉,但又不影响反映本质的真实程度。也就是说,系统模型应有足够的精度,以保证它的真实性。精度要求不仅与研究对象有关,而且与所处的时间、状态和条件有关。因此,为满足真实性要求,对同一对象在不同情况下可以提出不同的精度要求。第27页,本讲稿共70页 1 系统模型的要求系统模型的要求l简
17、明性 在满足真实性要求的基础上,应尽量使系统模型简单明了,以节约建模的费用和时间。这也就是说,如果一个简单的模型已能使实际问题得到满意的解答,就没有必要去建一个复杂的模型,因为建造一个复杂的模型并求解是要付出很高代价的,其次模型过于复杂难以满足快速决策的需要。第28页,本讲稿共70页 1 系统模型的要求系统模型的要求l现实性 在建立某些系统的模型时,如果已有某种标准化模型可供借鉴,则应尽量采用标准化模型,或者对标准化模型加以某些修改,使之适合对象系统,不追求另起炉灶。其次,在建立模型时,要考虑数据采集的可能性和今后的发展方向,使建立的模型具有现实可操性和发展潜力。第29页,本讲稿共70页 2
18、建模的原则建模的原则l抓住主要矛盾 模型只应包括与研究目的有关的方面,而不是对象系统的所有方面。例如,对个空运指挥调度系统的研究,建模只需考虑飞机的飞行航向而无需考虑其飞行姿态。l清晰明了 一个大型复杂系统是由许多联系密切的子系统组成的,因此对应的系统模型也是由许多子模型(或模块)组成的。在子模型与子模型之间,除了保留研究目的所必要的信息联系外,其它的耦合关系要尽可能减少,以保证模型结构尽可能清晰明了。第30页,本讲稿共70页 2 建模的原则建模的原则l精度要求适当 建立系统模型,应该视研究目的和使用环境不同,选择适当的精度等级,以保证模型切题、实用,而又不致花费太多。l例如,一个受外力F作用
19、下的物体M,其动力学系统的数学模型,在不同使用环境下有不同精度等级,应该适当选择。第31页,本讲稿共70页 2 建模的原则建模的原则l当物体的运动速度v足够小时,可以忽略空气阻力的影响,其符合精度要求的数学模型为l当速度v提高到必须考虑空气阻力的影响时,则其符合精度要求的数学模型为l当物体的运动速度接近于光速3108ms时,按相对论原理,此时M将不是常数,因此其符合精度要求的数学模型为第32页,本讲稿共70页 2 建模的原则建模的原则l尽量使用标准模型 在建立一个实际系统的模型时,应该首先大量调阅模型库中的标准模型,如果其中某些可供借鉴,不妨先试用一下。如能满足要求,就应该使用标准模型,或者尽
20、可能向标准模型靠拢。这样有利于比较分析,有利于 节省费用和时间第33页,本讲稿共70页 3 建模的主要方法建模的主要方法l推理法 对于内部结构和特性已经清楚的系统,即所谓的“白箱”系统(例如大多数的工程系统),可以利用已知的定律和定理,经过一定的分析和推理,得到系统模型。l实验法 对于那些内部结构和特性不清楚或不很清楚的系统,即所谓的“黑箱”或“灰箱”系统,如果允许进行实验性观察,则可以通过实验方法测量其输入和输出,然后按照一定的辨识方法,得到系统模型。第34页,本讲稿共70页 3 建模的主要方法建模的主要方法l统计分析法 对于那些属于“黑箱”,但又不允许直接进行实验观察的系统(例如非工程系统
21、多数属于此类),可以采用数据收集和统计分析的方法来建造系统模型。第35页,本讲稿共70页 3 建模的主要方法建模的主要方法l类似法 即建造原系统的类似模型。有的系统,其结构和性质虽然已经清楚,但其模型的数量描述和求解却不好办,这时如果有另一种系统其结构和性质与之相同,因而建造出的模型也类似,但是该模型的建立及处理要简单得多,把后一种系统的模型看成是原系统的类似模型。利用类似模型,按对应关系就可以很方便地求得原系统的模型。例如很多机械系统、气动力学系统、水力学系统、热力学系统与电路系统之间某些现象彼此类似,特别是通过微分方程描述的动力学方程基本一致,因此可以利用成熟的电路系统来构造上述系统的类似
22、模型第36页,本讲稿共70页 3 建模的主要方法建模的主要方法l混合法 大部分系统模型的建造往往是上述几种方法综合运用的结果l真正解决系统建模问题还必须充分开发人的创造力,综合运用各种科学知识,针对不同的系统对象,或者建造新模型,或者巧妙地利用已有的模型,或者改造已有的模型,这样才能创造出更加适用的系统模型。l因此,有人把建造系统模型看成是一种艺术,这说明建造系统模型确实需要充分发挥人的创造性,而不可能有现成的模式可以照搬第37页,本讲稿共70页软件生命周期软件生命周期-传统方法传统方法软件生命周期软件生命周期是指一个是指一个软件件项目被提出并着手目被提出并着手实施开始,到施开始,到该软件件报
23、废或停止使用或停止使用为止。止。经历三个时期经历三个时期 .软件定义软件定义 .软件开发软件开发 .运行维护运行维护(也称为软件维护也称为软件维护)第38页,本讲稿共70页软件生命周期各阶段的基本任务1.问题定义问题定义2.可行性研究可行性研究3.需求分析需求分析4.总体设计总体设计5.详细设计详细设计 6.编码和单元测试编码和单元测试7.综合测试综合测试8.运行与维护运行与维护 软件生命周期由软件定义、软件开发和运行维护软件生命周期由软件定义、软件开发和运行维护(也称为软件维护也称为软件维护)3)3个时期组成,每个时期又进一步划分成若干个阶段。个时期组成,每个时期又进一步划分成若干个阶段。第
24、39页,本讲稿共70页1.问题定义问题定义 回答:回答:“要解决的问题是什么要解决的问题是什么?”通过调研,写出关于问题性质、工程目标和工程规模的书面报通过调研,写出关于问题性质、工程目标和工程规模的书面报告,并得到客户的确认。告,并得到客户的确认。2.可行性研究可行性研究 回答:回答:“对于上一个阶段所确定的问题有行得通的解决办对于上一个阶段所确定的问题有行得通的解决办法吗法吗?”研究并论证软件系统的可行性,对方案进行选择并形成可行研究并论证软件系统的可行性,对方案进行选择并形成可行性分析报告。性分析报告。第40页,本讲稿共70页3.需求分析需求分析这个阶段的任务主要是确定目标系统必须具备哪
25、些功能。这个阶段的任务主要是确定目标系统必须具备哪些功能。建立逻辑模型建立逻辑模型 必须准确完整地体现用户的要求。必须准确完整地体现用户的要求。数据模型数据模型 (实体(实体-联系图)联系图)功能模型功能模型 (数据流图)(数据流图)行为模型行为模型 (状态转换图)(状态转换图)书写规格说明书书写规格说明书 用正式文档准确地记录对目标系统的需求。用正式文档准确地记录对目标系统的需求。第41页,本讲稿共70页4.总体设计总体设计(概要设计概要设计)回答回答“概括地说,应该怎样实现目标系统概括地说,应该怎样实现目标系统?”软件设计的一条基本原理就是,程序应该模块化,也就是说,一个软件设计的一条基本
26、原理就是,程序应该模块化,也就是说,一个程序应该由若干个规模适中的模块按合理的层次结构组织而成。因此,程序应该由若干个规模适中的模块按合理的层次结构组织而成。因此,总体设计的另一项主要任务就是设计程序的体系结构,也就是确定程序总体设计的另一项主要任务就是设计程序的体系结构,也就是确定程序由哪些模块组成以及模块间的关系。由哪些模块组成以及模块间的关系。建立软件系统的总体结构建立软件系统的总体结构定义功能模块的接口定义功能模块的接口设计全局数据库或数据结构设计全局数据库或数据结构规定设计约束规定设计约束编制概要设计文档编制概要设计文档第42页,本讲稿共70页5.详细设计(模块设计)详细设计(模块设
27、计)把解法具体化,回答把解法具体化,回答“应该怎样具体地实现这个系统呢应该怎样具体地实现这个系统呢?”模块详细设计模块详细设计 模块的详细功能、算法、数据结构、模块间的接口等设计,拟定模块的详细功能、算法、数据结构、模块间的接口等设计,拟定模块测试方案。模块测试方案。编制模块的详细规格说明编制模块的详细规格说明 汇总模块详细设计的结果,形成模块详细规格说明书。汇总模块详细设计的结果,形成模块详细规格说明书。第43页,本讲稿共70页6.编码和单元测试编码和单元测试写出正确的容易理解、容易维护的程序模块。写出正确的容易理解、容易维护的程序模块。编码编码 根据模块详细规格说明书,把详细设计的结果翻译
28、成用选定的根据模块详细规格说明书,把详细设计的结果翻译成用选定的语言书写的程序。语言书写的程序。单元测试单元测试 对模块程序进行测试,验证模块功能及接口与详细设对模块程序进行测试,验证模块功能及接口与详细设计文档的一致性,并形成单元测试报告。计文档的一致性,并形成单元测试报告。第44页,本讲稿共70页7.综合测试综合测试 通过各种类型的测试通过各种类型的测试(及相应的调试及相应的调试)使软件达到预定的要求。使软件达到预定的要求。集成测试集成测试 根据设计的软件结构,把经过单元测试检验的模块按某种选定的策根据设计的软件结构,把经过单元测试检验的模块按某种选定的策略装配起来,在装配过程中对程序进行
29、必要的测试。略装配起来,在装配过程中对程序进行必要的测试。验收测试验收测试 按照规格说明书的规定,由用户对目标系统进行验收。按照规格说明书的规定,由用户对目标系统进行验收。现场测试或平行运行现场测试或平行运行 平行运行就是同时运行新开发出来的系统和将被它取代的旧系统,平行运行就是同时运行新开发出来的系统和将被它取代的旧系统,以便比较新旧两个系统的处理结果。以便比较新旧两个系统的处理结果。用正式的文档资料把测试计划、详细测试方案以及实际测试结果用正式的文档资料把测试计划、详细测试方案以及实际测试结果保存下来,作为软件配置的一个组成部分。保存下来,作为软件配置的一个组成部分。第45页,本讲稿共70
30、页8.软件维护软件维护 维护阶段的关键任务是,通过各种必要的维护活动使系统持久维护阶段的关键任务是,通过各种必要的维护活动使系统持久地满足用户的需要。地满足用户的需要。改正性维护改正性维护 诊断和改正在使用过程中发现的软件错误;诊断和改正在使用过程中发现的软件错误;适应性维护适应性维护 修改软件以适应环境的变化;修改软件以适应环境的变化;完善性维护完善性维护 根据用户的要求改进或扩充软件使它更完善;根据用户的要求改进或扩充软件使它更完善;预防性维护预防性维护 修改软件为将来的维护活动预先做准备。修改软件为将来的维护活动预先做准备。每一项维护活动都应该经过提出维护要求每一项维护活动都应该经过提出
31、维护要求(或报告问题或报告问题),分析维护要求,分析维护要求,提出维护方案,审批维护方案,确定维护计划,修改软件设计,修改提出维护方案,审批维护方案,确定维护计划,修改软件设计,修改程序,测试程序,复查验收等一系列步骤。程序,测试程序,复查验收等一系列步骤。第46页,本讲稿共70页传统的生命周期方法学传统的生命周期方法学 l传统方法学的本质传统方法学的本质l是在具体的软件开发工作开始之前,通过需求分析是在具体的软件开发工作开始之前,通过需求分析预先定义软件需求,然后一个阶段接着一个阶段有预先定义软件需求,然后一个阶段接着一个阶段有条不紊地开发用户所要求的软件,实现预先定义的条不紊地开发用户所要
32、求的软件,实现预先定义的软件需求。软件需求。l生命周期方法学是一个巨大的进步,对实现软生命周期方法学是一个巨大的进步,对实现软件开发工程化曾经起了重要的促进作用,部分件开发工程化曾经起了重要的促进作用,部分地缓解了软件危机。地缓解了软件危机。第47页,本讲稿共70页 结构化程序设计思想的提出背景结构化程序设计思想的提出背景 回首计算机的发展历程,人们发现计算机软件的发展回首计算机的发展历程,人们发现计算机软件的发展速度始终滞后于计算机硬件的发展,它已经成为制约速度始终滞后于计算机硬件的发展,它已经成为制约计算机产业整体发展的瓶颈。究其原因可能有很多方计算机产业整体发展的瓶颈。究其原因可能有很多
33、方面,但下面两点不容忽视。面,但下面两点不容忽视。l 软件产业的个体化软件产业的个体化l 受限于程序设计语言受限于程序设计语言结构化程序设计方法学结构化程序设计方法学 第48页,本讲稿共70页结构化程序设计方法结构化程序设计方法n自顶向下、逐步求精的开发方法自顶向下、逐步求精的开发方法n 模块化的组织方式模块化的组织方式n 结构化的语句结构结构化的语句结构第49页,本讲稿共70页自顶向下、逐步求精自顶向下、逐步求精 将编写程序看成是一个逐步演化的过程。所谓自顶将编写程序看成是一个逐步演化的过程。所谓自顶向下是指将分析问题的过程划分成若干个层次,每向下是指将分析问题的过程划分成若干个层次,每一个
34、新的层次都是上一个层次的细化,即步步深入,一个新的层次都是上一个层次的细化,即步步深入,逐层细分。逐层细分。第50页,本讲稿共70页模块化模块化 将整个系统分解成若干个模块,每个模块实现特定的功将整个系统分解成若干个模块,每个模块实现特定的功能,最终的系统将由这些模块组装而成。模块之间通过能,最终的系统将由这些模块组装而成。模块之间通过接口传递信息,力求模块具有良好的独立性。接口传递信息,力求模块具有良好的独立性。第51页,本讲稿共70页语句结构化语句结构化ABTAB顺序结构顺序结构分支结构分支结构YN第52页,本讲稿共70页结构化程序设计的特点结构化程序设计的特点程序设计数据结构算法程序设计
35、数据结构算法程序内容过程过程调用程序内容过程过程调用第53页,本讲稿共70页结构化程序设计的基本过程结构化程序设计的基本过程软件开发的基本过程:软件开发的基本过程:l需求分析需求分析l系统设计系统设计l系统实现系统实现l系统测试系统测试l系统维护系统维护当结构化思想贯穿于每个过程时,当结构化思想贯穿于每个过程时,其基本过程:分解和组装其基本过程:分解和组装第54页,本讲稿共70页MM1M2M3M4MnM31M32M33分解过程组装过程组装过程一个结构化程序设计的例子一个结构化程序设计的例子第55页,本讲稿共70页一个结构化程序设计的例一个结构化程序设计的例子子第56页,本讲稿共70页问题问题l
36、创建一个程序显示给定日期的月历。既程序提示用户输入年和月,然后显示该月的日历。第57页,本讲稿共70页思考思考1把问题分解为两个子问题:读取用户输入(readInput)和打印日历(printMonth)l 在这一步,我们思考的是怎样分解子问题而不是用什么方法输入数据和打印日历,可以画一个结构图把问题的分解表达出来。打印日历系统readInput子系统printMonth子系统第58页,本讲稿共70页思考思考2 要打印一个月的日历,应当知道这个月的第一天是星期几以及该月有几天,有了这些信息就可以打印日历的标题和主体了。因此,打印月历问题进一步可以分解成四个子问题:得到第一天对应的星期(getS
37、tartDay),求得这个月的天数(getNumOfDaysInMonth),打印标题(printMonthTitle),打印月历主体(printMonthBody)。打印日历系统readInput子系统printMonth子系统getStartDaygetNumOfDaysInMonthprintMonthTitleprintMonthBody第59页,本讲稿共70页思考思考3怎样知道一个月的第一天是星期几呢?l有几种方法可以求得(如使用有几种方法可以求得(如使用javajava中的中的DateDate和和CalendarCalendar类)。我)。我们采用另采用另外一种方法:假外一种方法:
38、假设知道知道18001800年年1 1月月1 1日是星期三(日是星期三(startDay1800startDay18003 3),),计算算18001800年年1 1月月1 1日和日和该月第一天相差的月第一天相差的总天数(天数(totalNumOfDaystotalNumOfDays),),该月第月第一天的星期就是(一天的星期就是(totalNumOfDays+startDay1800totalNumOfDays+startDay1800)7 7。l想要想要计算算18001800年年1 1月月1 1日和月日和月历第一天之第一天之间的的总天数,需要求出天数,需要求出18001800年到年到该年的
39、天数,并求出在年的天数,并求出在该年中日年中日历前的天数。前的天数。这两个数相加就是两个数相加就是totalNumOfDaystotalNumOfDays。l为了了计算算这个天数个天数还需要知道一年和一个月的天数。算法:需要知道一年和一个月的天数。算法:第60页,本讲稿共70页l一月、三月、五月、七月、八月、十月和十二月各31天l四月、六月、九月和十一月各30天l二月通常有28天,但是在闰年有29天,因此一年通常有365天,闰年366天。利用下面的条件可以判定某年是否 为闰年:if(year%400=0)|(year%4=0)&(year%100!=0)return true;else ret
40、urn false。l我们把判断是否是润年的工作也放在一个子问题中解决(isLeapYear)。l把计算总天数的工作放在子问题getTotalNumOfDays中。第61页,本讲稿共70页完整的结构化分完整的结构化分打印日历系统readInput子系统printMonth子系统getStartDaygetNumOfDaysInMonthprintMonthTitleprintMonthBodygetTotalNumOfDaysisLeapYear第62页,本讲稿共70页实验:月历系统主要方法实现实验:月历系统主要方法实现l打印日历子程序static void printMonth(int ye
41、ar,int month)/获得该月的第一天是星期几 int startDay=getStartDay(year,month);/获得该月共多少天 int numOfDaysInMonth=getNumOfDaysInMonth(year,month);/打印月历的表头 printMonthTitle(year,month);/打印月历的表体 printMonthBody(startDay,numOfDaysInMonth);第63页,本讲稿共70页static int getStartDay(int year,int month)int startDay1800=3;/先计算从1800/1/
42、1到该月之前的总天数 long totalNumOfDays=getTotalNumOfDays(year,month);/计算该月第一天的星期并返回该值 return (int)(totalNumOfDays+startDay1800)%7);第64页,本讲稿共70页l计算总天数static long getTotalNumOfDays(int year,int month)long total=0;for(int i=1800;iyear;i+)/从1800到该年的前一年的每年循环 if(isLeapYear(i)total=total+366;/如果是闰年,则天数是366 else to
43、tal=total+365;/否则是365for(int i=1;i month;i+)/该年第1个月到该月的前一个月循环 total=total+getNumOfDaysInMonth(year,i);/计算每个月的天数并加到total中return total;/计算结果返回第65页,本讲稿共70页l计算某月的天数static int getNumOfDaysInMonth(int year,int month)if(month=1|month=3|month=5|month=7|month=8|month=10|month=12)/大月情况 return 31;if(month=4|mo
44、nth=6|month=9|month=11)/小月情况 return 30;if(month=2)/闰月情况 if(isLeapYear(year)return 29;else return 28;return 0;第66页,本讲稿共70页l判断是否是闰月的程序static boolean isLeapYear(int year)if(year%400=0)|(year%4=0)&(year%100!=0)return true;return false;第67页,本讲稿共70页l打印月历体的程序static void printMonthBody(int startDay,int numO
45、fDaysInMonth)int i=0;for(i=0;istartDay;i+)/该星期之前输出空格 System.out.print();for(i=1;i=numOfDaysInMonth;i+)/输出月历 if(i10)System.out.print(“”+i);/如果是1位输出日期前多空一些 else System.out.print(+i);if(i+startDay)%7=0)System.out.println();/每行输出7天 第68页,本讲稿共70页l输出月历的头static void printMonthTitle(int year,int month)System
46、.out.println(+getMonthName(month)+,+year);System.out.println(_);System.out.println(Sun Mon Tue Wed Thu Fri Sat);l求某月对应的英文名字static String getMonthName(int month)String monthName=null;switch(month)case 1:monthName=January;break;case 2:monthName=February;break;case 3:monthName=March;break;case 4:monthN
47、ame=April;break;case 5:monthName=May;break;case 6:monthName=June;break;case 7:monthName=July;break;case 8:monthName=August;break;case 9:monthName=September;break;case 10:monthName=October;break;case 11:monthName=November;break;case 12:monthName=December;break;return monthName;第69页,本讲稿共70页传统的生命周期方法学传统的生命周期方法学l实践表明,传统的生命周期方法学并不能完全实践表明,传统的生命周期方法学并不能完全消除软件危机。消除软件危机。l对某些类型的软件开发,这种方法学比较适用,对某些类型的软件开发,这种方法学比较适用,对另一些类型的软件则可能完全不适用。对另一些类型的软件则可能完全不适用。l近年来软件工程的新途径近年来软件工程的新途径快速原型法快速原型法和和面面向对象方法学向对象方法学已经进入实用阶段,应用得已经进入实用阶段,应用得越来越广泛了。越来越广泛了。第70页,本讲稿共70页