程序设计综合实践_第1页
程序设计综合实践_第2页
程序设计综合实践_第3页
程序设计综合实践_第4页
程序设计综合实践_第5页
已阅读5页,还剩111页未读 继续免费阅读

下载本文档

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

文档简介

1、程序设计综合实践(试用教材)信息工程学院前言本课程是在深入了解和掌握面向对象程序设计的理论和方法的基础上,使用面向对象的思想和方法对实际问题进行需求分析,根据需求分析结果完成程序的总体设计,在总体设计的基础上实现详细设计和编码调试,并对所设计的程序进行必要的测试。从而达到培养计算机软件本科学生程序设计的综合能力和训练工程化软件开发的初级技能的目标,为后续专业课程和实践奠定基础。本课程的主要内容包括: 初步学会使用UML的用例图分析和描述所设计程序的需求。 初步学会使用UML的类图、类之间的静态关联和动态交互图、以及功能活动图进行程序的总体设计。 学会能综合、合理地使用面向对象的各种编程方法、算

2、法和数据设计方法和库资源实现程序的详细设计、编码和调试。 了解程序测试的必要性和重要性,程序测试的目标、基本内容和方法;制定程序的简单测试方案并完成对程序的简单测试。 学会编写由需求分析、总体设计、详细设计和程序测试组成的程序开发文档以及程序的简单使用手册。目 录第一章面向对象程序设计的实现方法和步骤1第二章 程序设计案例分析 17第三章 实践题目和实践要求 50附录A使用Visio辅助建立软件模型 60附录B使用Visual C+ 建立具有GUI功能的控制台应用程序 79附录C string类和CString类的使用 99附录D 算法的伪代码描述约定 101附录E 使用Turbo C+ 环境

3、建立面向对象的程序项目 103第一章 面向对象程序设计的实现方法和步骤§1.1 软件的生命周期软件的生命周期描述了在软件要解决的实际问题描述确定之后,从软件要实现的功能分析开始、到根据分析结果进行的软件设计、依据设计进行的编码调试和软件应用过程中的维护,直至软件退出应用结束的全过程中各个阶段的任务和相互关系。分析设计演化维护从上图不难看出面向对象软件的开发生命周期是由四个阶段:分析、设计、演化和维护组成的。分析阶段是整个软件生命周期的开始,以后的各个阶段都可以直接和间接地回馈到前面的阶段。整个软件生命周期是一个迭代、渐增的开发过程,这种迭代过程不仅贯穿整个软件生命周期,并且表现在每个

4、阶段中,特别是在分析(全局分析、局部分析)和设计(全局设计、局部设计)阶段。§1.2 软件的建模所谓软件模型是对软件所模拟的现实世界和对软件所建立的信息系统的理解和描述,它源于所模拟的现实世界,是认识活动的产物,是描述信息系统的工具,是软件设计、测试、维护的依据。因此,软件模型的优劣将从根本上确定了软件的功能、性能和生命力。软件生命周期的前两个阶段,分析和设计所完成的工作就是建立软件模型。使用统一建模语言UML(Unified Modeling Language)建立软件模型可以提高我们在OO软件开发的每个阶段的工作效率 从记录新的问题领域中心概念的一些最初想法,到组织软件开发人员与

5、用户专家进行交流,直到最终软件产品的图形文件记录等。基于UML的OO软件开发产品的出现使OO设计更加高效、方便。UML的各种图形具有描述模型的准确性和广泛性,使用这些图形进行软件建模大大提高了模型的直观性,其主要优点表现在:· 直观、易于理解问题领域和发现设计中的错误,特别是那些有关对象间关系的错误;· 便于准确地从模型到实际应用编码的转换;· 为软件的测试和维护提供准确依据。UML提供的“用例图(User Case Diagram)”、“类图(Class Diagram)”、“顺序图(Sequence Diagram)”、“协作图(Collaboration D

6、iagram)”、“状态图(Statechart Diagram)”、“活动图(Activity Diagram)”和“包图(Package Diagram)”用于描述软件建模过程中各个阶段的各种模型成分。根据所设计的软件的规模和复杂程度不同,并非需要在所建立的软件模型中包括所有的图形,但一般都应包含用例图、类图、顺序图或协作图和活动图。§ 用例图用户登记检查用户背景销售者贴出需要拍卖的物品接受报价将物品发给竞拍获胜者报价扩展点:更多报价向销售者付钱授权向销售者支付维护用户列表通知获胜者接受用户报价进行多个报价每个报价对应一件物品<<extend>><&

7、lt;include>>检查购买者的信用度<<include>>查出一件物品列出所有物品购买者拍卖师<<generalization>>使用“用例图”描述拟建软件与外部环境之间的关系。一个用例表示一个外部角色 Actor (例如,用户或其它外部软件环境)与拟建软件之间一个单独交互。将所有的用例集中在一起,就可以描述一个OO软件的总体功能需求。例如一个网上拍卖系统的拍卖过程用例图:用例图在软件的建模过程中是必不可少的。§ 类图使用“类图”描述所设计的软件中包含的类,以及这些类之间的静态关系,从而描绘了整个软件的静态组成和结构。

8、1 类的一般描述图Employee-address2.*:char-age:int-name2.*:char+getName():char*+setAddress(in addr:char*)类名属性操作 类名:类的名称 属性:属性描述的语法:visibility name N : type = initialValue property-string visibility:属性的可见性:+ 表示public; # 表示protected;- 表示private。 name:属性的名称。 N:属性的多值性:2.*表示属性能接受多值;如果属性描述中无此项,则表示该属性只允许接受一个值。 type

9、:属性的实现类型(依赖于实现语言的规范)。 initialValue:属性的初始值。 property-string:表示属性的一些无法用上述语法描述的特性。例如,一个只读属性(如 C+ 的const 成员或 Java 的 final 成员), 则property-string将可以 设置为frozen。 操作: 操作描述的语法:visibility name (parameter-list) : return-type operation-string visibility:操作的可见性:+ 表示public; # 表示protected;- 表示private。 name:操作的名称。 p

10、arameter-list:操作的形参列表,表中允许有多个形参,形参之间由逗号分隔。每个参数的表示语法:kind name : type = defaultValue ·kind:表示参数的作用分类in 表示参数向操作中传入一个值;out 表示参数从操作中提取一个值; inout 表示参数既可以向操作中传入一个值又可以从操作中提取一个值。 ·name:表示形参名。·type:表示形参类型。·defaultValue:表示形参的缺省值。 return-type:操作的返回类型(因编译器而异)。 operation-string:表示操作的一些无法用上述语法

11、描述的特性。例如,一个操作是抽象操作,则operation-string可以设置为abstract。2 类的相互关系图用于描述类之间的静态关系。在关系图中的类图除了类名部分不能省略外,其它两部分都可以根据需要省略。主要的静态关系有: 归纳关系(Generalization):表示两个类之间的继承和派生关系,例如下图中的类EmployeeManagerEmployee是类Manager的超类(基类),而类Manager是类Employee的子类(派生类)。 关联关系(Association):表示两个类之间的关联关系,如下图中类Employee和类 -department : string-na

12、me : string-position : int-employeeBy : CorporationEmployee-address : string-name : string-numberEmployee : long-employees : EmployeeCorporation-employees*-employeeBy0.1Corporation之间的关联关系: 图中employeeBy 是 Employee 的属性成员,其类型为Corporation。通过该属性employeeBy 使两个类关联;0.1表示关联的多样性,此关联表示一个Employee对象不会被超过一个Corpor

13、ation对象所雇用。同样,employees 是Corporation 的属性成员,其类型为Employee。* 表示一个Corporation对象允许有 0 至任意数量的Employee对象,即雇用任意多个雇员。上述二端关联关系也可以用两条箭头线分别表示,箭头线的方向是从关联属性所在类指向属性的类型类。下面的关联关系表示同一类的两个以上不同对象间的关联。它的含义是该雇员可以管理1至10个其它员工。-department : string-name : string-position : int-employeeBy : Corporation-employeeSupervised : Em

14、ployeeEmployee-employeeSupervised1.10注意,参与一个关联的两个对象常常是独立存在的,即关联关系中的一个对象的存在与否不会影响到所关联的另一个对象的存在。 类之间的聚合和合成关系:表示对象之间的“整体”和“部分”之间的关系,即在整体和部分之间可能存在生命期的依赖性。合成关系表示当整体不再存在时,部分同时被销毁的紧密关系。例如,下图中WindowTitleBarSliderPanel-scrollBar1-body1-title1的 Window 和 Slider, TitleBar, Panel 之间的关系:聚合关系表示当整体不再存在之后,部分还会继续存在的关

15、系。例如,下图中的类Orchestra 和 Performer之间的关系。当然这种关系也可以通过前面介绍过的关联关系表示。但是,聚合关系可以很形象地说明一些概念。例如本例中说明:乐队是由演-conductor-name : string-numberOfPlayer : int-musician : PerformerOrchestra-instrument : string-name : stringPerformer-musician1.*奏人员所组成的,但乐队的生存期与演奏人员的寿命并不存在紧密依赖关系。 类模板和类模板的实例化: 类模板是具有成员类型参数的类。例如,下图中的类就是一个具

16、有两种成员类型参数<<implementation class>>IndexListT, Y<<bind>>(long)longEmployee<<bind>>(Employee)<<implementation class>>IndexListT, YT和Y的类模板,和将该类模板的成员类型实例化后的类。 类的实例 对象:对象是按照类定义创建的实例,在对象的图形描述中实例被命名,同时类的各个属性被赋予特定的值。例如,下图就是一个用Employee类创建的对象john_1。department : s

17、tring = Sell_Dptname : string = john Smithposition : int = 1employeeBy : Corporation = IBMemployeeSupervised : Employee = 1john_1 : Employee 显然,在建模的主要工作 类设计中,使用类图是十分必要的,也是十分方便的。§ 类的交互关系图类之间的静态关联图可以准确地描述软件的静态组成和结构,而软件的各个组成部分围绕着功能实现所表现的动态关系,即类对象之间相互作用,则需要使用类的交互关系图加以描述。这类图有两种:“顺序图”和“协作图”。两种交互图都是用来

18、描述软件运行时完成一种功能事务(由一个或多个用例组成)的过程中,参与事务的对象之间的交互操作;但二者描述着眼点和侧重点不同。因此,一般情况下,描述一个功能事务的交互图只需要根据需要选择“顺序图”、“协作图”中的一种即可。1 顺序图按时间顺序描述参与功能事务的一组对象在功能事务的执行过程中的交互操作。构成顺消息1消息2消息3消息4消息5消息6同步消息导致操作执行an object返回消息导致操作执行异步消息导致操作执行同步、异步消息导致操作执行序图的要素如下 下面的顺序图描述了在网上拍卖事务中,销售者对象和竞拍者对象以及完成一次拍卖事务所需要的其它服务对象之间相互协作的顺序图:bidAccept

19、ablebidAcceptable:=minAcceptBidExceededminAcceptBidExceeded:=*for all items of an AuctionLista Buyer:AuctionListgetCurrentMaxBid()selectIteman AuctionItem:postBid()check()a Seller:notifySeller()Check()bidAceptablea saleDoc:new()图中的各种类型的交互消息必须遵循以下6种语法规则: 状态消息:由一个对象将一个状态值转送给另一个对象,例如:bidAcceptable。 方法名

20、: 一个对象调用另一个对象的方法。例如:selectItem()。 *迭代依据:方法:其中“*”是迭代标记。这个命名方法在目标对象的多个实例上调用,至于具体在哪个实例上调用则由方括号中的表达式控制。例如: *for all items in Auctionlist getCurrentMaxBid() 。 flag := 方法:flag 被设置为TRUE或FALSE,这取决于在这条消息接收对象上调用这个指定的方法所产生的结果。例如:minAcceptBidExceeded := check()。 条件 方法:只有在条件满足时才在消息接收对象上调用这个指定的方法。例如:minAcceptBidE

21、xceeded notifySeller()。 特殊符号 new:表示创建消息接收对象的新实例。例如:bidAccepttable new。由于顺序图既能较好地描述功能事务执行过程中各个参与对象的动作顺序,又能较好地描述对象之间的交互操作,因此,一般多用顺序图来描述类之间的动态交互关系。2 协作图协作图着眼于参与功能事务的一组对象在功能事务的执行过程中的相互协作关系,而不按照执行过程的时间顺序描述对象之间的交互操作。协作图虽然在表示对象之间的交互操作方面优于顺序图,但在其它方面都不及顺序图,因此,一般只用于顺序图所描述的类之间动态交互关系的补充。上述的网上拍卖事务的协作图如下图所示::Buye

22、r:AuctionList2. selectItem()1. *for all AuctionItems in AuctionList getCurrentMaxBid()widget:AuctionItem3. postBid()4. minAcceptBidExceeded := check():Seller5. minAcceptBidExceeded notifySeller()6. bidAcceptable := check()7. bidAcceptable notifyAuctionItem()8. bidAcceptable notifyBuyer()不难看出,使用类的交互关

23、系图(特别是“顺序图”)对于类设计中研究类的属性和行为,最后确定类的结构和接口设计是必不可少的,也是十分方便的。§ 状态图状态图最适合用于显示一个类对象在经历一系列相关用例的过程中,所呈现的不同状态。它们可以帮助我们更好地理解一个OO程序中单一对象的生命期行为。状态图主要由三种图示构件组成:1 对象状态:对象的一个状态用圆角矩形表示。在该矩形中,状态名称用粗体字显示在矩形最上方;如果还有额外信息,用一条线将这些额外信息与状态名分隔开,以“do:/”为前缀的信息项目表示处于此状态下的一个活动。开始和结束是两个特殊状态。2 转换路径:对象从一个状态转换到另一个状态用一条箭头线(箭头指向转

24、换后的状态)表示。3 状态转换标签:描述引起状态转换的原因,描述语法是:EventGuard/Action 该语法的含义是:事件Event的出现将导致以Guard为条件的状态转换结果为TRUE。但在实际转换到新状态之前,动作Action必须先执行。由于对象从一个状态到其它状态只能进行一次转换,因此从一个给定状态可能出现的所有转换路径必须相互排斥。注意,转换描述的三个部分(事件、条件和动作)都是可选择的。下图描述了一次拍卖程序中Buyer对象的一个状态图:Registrationdo:/examine customer historyBrowerdo:/examine all items in

25、AuctionListregisteredItemReviewdo:/getCurrentMaxBid getMinAcceptBidselectItemnotWantItem/getNextItemnoRebidding/getNextItemitemCheckednotAllChecked/getNextItemBiddingdo:/place bidwantItemPaymentdo:/send paymentbidAcceptedItemReceiveditemReceivedbidNotAccepted/re-bidstartend显然,使用状态图对类对象的深入研究是有效的,但并不是

26、必不可少的。在建模的过程中是否需要使用状态图对类对象的生存过程进行状态进行,一般与软件的复杂程度有关。通常情况下,一个简单的软件建模中,不需要绘制状态图。§ 活动图活动图描述如何通过一组相互协作的活动产生一个期望的结果。在创建活动图时需要注意的一个重要问题是:确认那些可以同时执行的子活动(通过多进程或多线程)以及那些必须线性顺序执行的子活动。活动图中的主要图示构件:1 活动:用椭圆矩形表示。活动2 触发器:用指向活动和从活动出来的箭头线表示。一个活动有流入触发器,表示这个活动可以在接收到这个触发器时执行,在绝大多数情况下前一个活动的成功执行就是触发器源(流出触发器)。对于具有多个流入

27、触发器的活动而言,它是非连接性的。这意味着如果这个活动收到其中一条触发,目标活动将会执行。活动1活动2活动1活动2活动3SpecialActivity3 同步杠:用一条双线或一条粗黑线表示。一些活动流入它,一些活动自它流出,并且它带有附加条件condition。对于流入活动,同步杠是连接性(Conjunctive)的,即所有流入的活动必须在控制到达同步杠之前成功执行。这些流入活动的成功执行受制于同步杠的附加条件。对于流出活动,同步杠表示这些活动允许并发执行,彼此之间相互独立。活动1活动2活动3condition同步杠活动44 判定活动:在绝大多数情况下,判定活动是通过测试一个布尔值来实现的。这

28、类活动是由一个菱形表示的,如下图所示:/ NO/ YESIs FOO true?下图显示了拍卖处理过程的活动图。图中那些可以并发进行的活动是从标签为“fork”的同步杠中流出的。标签为“merge”的同步杠用于表示一个条件,就是发生在该同步杠上的多个活动必须同时成功结束,控制流才能继续向前。特别要注意从P到Q的活动段。在P处与同步杠相关联的条件是:*for each item in the group这里的“*”表示多个触发器,就是说它指定了从P到Q所显示的活动线程实际上由一组平行的线程所组成,每个线程都由图中所示的活动组成。因此,在P处源于同步杠的并发路径的数量等于购买者感兴趣的那组项目的数

29、量。单个或一组项目?购买者登记On fill?/ yes/ no要求购买者填表浏览AuctionList选择项目启动信用验证fork/ 一组/ 单个fork/ P*for each item in the group记录每个项目的报价/ Q记录报价merge接受单个或一组项目报价并且对用户信用验证无误授权向销售者支付向购买者发送拍卖品不难看出,UML的活动图与一般的程序流程图在形状和作用上是类似的,但活动图的描述能力要远远超过一般的程序流程图。在模型中使用活动图来讨论和描述软件的部分和整个运行过程的活动也是必要的。§ 包图当类的数量比较多时,最好根据一些有用的标准将类按包的形式进行组

30、织。在UML中,“包”这个词的含义和Java的程序包package所表达的含义基本相同。包是用一个矩形图框来表示的,该矩形的左侧顶部有一个小矩形“标签”框。包的名称出现在框的中间。如果需要,可以在框中列出这个包中所包含的一些重要类的名称以及其它一些特定的与包有关的信息时;此时,包的名称就需要出现在标签内。在标签框和主框中都允许用一对花括号列出一些额外信息,描述这个包的特征。例如,如果一个包只是由C+定义的抽象类或Java的接口组成,这样的包可以称为抽象包,可以在包的名称旁边的一对花括号中添加“抽象”这个词。两个包之间如果存在着依赖关系,则使用实线箭头的虚线表示的。如果一个系统中的所有其它包都依

31、赖一个共同的包,我们可以不使用箭头线,而只需简单地把特征global放在被依赖包图中包的名称的旁边。SwingUI这里需要记住一个重要概念:包图中串联的依赖性并不会进行传递。这意味着虽然包 UI 依赖于包 Swing,并且包 ProcessOrder 依赖于包 UI,但包 ProceesOrder 并不会自动依赖包 Swing。SwingUIProcess Order这样的依赖属性类似于Java程序中的 import 命令的作用,而与C+程序中的 #include 预编译指令并不相同。显然,对于一个简单的程序,程序中所包含的类就没有划分多个子包的必要了。对于只有一个包的模型,绘制包图的必要性就

32、不大了。§1.3 软件的编码和调试软件模型的建立表明组成软件的所有类的静态结构、动态关系已经明确;需求分析中所描述的功能的实现活动过程已经确定;所有的编码和调试的依据已经确立。这是软件设计从建立模型到编码实现的转折标志。软件的编码和调试工作就是根据模型中的各种图形和相应的描述,从各个类的定义编码实现和调试,到使用类分别进行子功能的编码和调试,直至将子功能组合成整个软件的编码和调试。在各个阶段的编码过程中都需要对具体实现算法进行必要的设计,作为编码和调试的细化依据。§ 类的编码和调试1 类定义依据模型中的类图和相应的描述编写类的定义代码。2 类的实现类的实现工作是编写类成员函

33、数的定义代码。在模型中并没有提供编写这些代码的具体依据,因此需要为每个类的成员函数的操作设计算法,做为类实现的编码的依据。 算法设计 使用伪代码描述成员函数的操作算法。伪代码的描述约定参见附录D。 成员函数的编码 依据成员函数相应的算法,编写成员函数的定义代码。3. 类的调试一个类的编码一旦完成就可以对所该类的代码进行编译,并按照算法所描述的操作,编写一个测试该类功能的简单程序,对类接口提供的操作进行调试。对类的分别测试在任何一个面向对象的编译环境中都是容易实现的,并且这种测试为整个软件的实现和调试奠定了基础,这对于一个复杂的、具有较大规模的软件更是必要的。§ 子功能的编码和调试1

34、算法设计依据模型中的子功能活动图和相关的类交互关系(顺序图)以及描述,使用伪代码设计子功能的实现算法。2 编码依据子功能的算法,编写子功能的实现代码模块。3 调试依据模型中的功能用例和子功能活动图的描述,对所编写的子功能模块进行初步测试。§ 软件的功能组装1 算法设计依据模型中的软件总体功能的活动图和界面实现技术,使用伪代码设计软件的功能组装算法。2 功能组装依据功能的组装算法,将已经经过初步调试的子功能组装到一起,完成整个软件代码的编写。§1.4 软件的测试软件的编码、编译和一般运行完成后,必须进行严格的、全面的测试之后,才可以交付使用。软件一旦开始使用,就进入了软件的维

35、护周期。所谓软件的测试应该包括软件的运行正确性测试和软件的性能测试两部分。其中软件的性能测试比较复杂,需要编制特定的外挂测试程序,需要软件的用户和相关的专家与软件的设计者共同测试评价。本次实践要求的软件测试是基本的软件运行正确性测试。这类测试主要包括两部分内容:按功能测试软件的容错能力和测试软件运行的稳定性。1 软件容错能力测试 制定测试提纲按功能划分,分析并确定每个功能执行过程中可能导致错误出现的所有运行条件(这些条件通常是通过用户输入产生),即功能执行的边界条件。按照这些边界条件编写每个功能的测试项目,并归纳制定整个软件的容错能力测试提纲。测试提纲包括软件对容错能力的要求和相应的测试条目。

36、 测试依据测试提纲,按功能测试每一个边界条件下的程序运行状态,并详细记录每一个边界条件下测试结果。 修改依据功能的容错能力要求,对照测试记录,分析不符合容错能力要求的原因,进行相应的代码修改,并对修改后的部分相关功能或修改后的全部功能重新测试。显然,上述的测试步骤中的和是迭代进行的,直至测试的结果全部满足软件对功能容错能力的要求。2 运行稳定性测试软件运行的稳定性问题往往是潜在的,不易立即发现。导致软件运行出现稳定性问题的原因可能有三种:软件运行中某些过程的CPU不合理占用、软件运行中的内存泄漏、软件运行对系统资源和第三方软件的不恰当使用。这些原因引起的软件运行的稳定性问题只能在软件的运行状态

37、下动态诊测才能发现,其中由于第三个原因的诊测比较复杂,本实践所设计的程序相对比较简单(无须使用任何第三方软件),因此只要求对前两个原因引起的软件运行稳定性问题进行测试。 CPU占用测试在被测程序运行期间,运行系统的“任务管理器”程序监测被测试程序各项功能执行过程中的CPU占用情况:采用该方法进行监测应注意三点: 被测试程序运行时,除了系统平台的必要进程以外不能启动任何其它应用进程,以便使“任务管理器”所监测到的数据能比较准确地反映被测试程序的真实状态。 在监测状态下分别按照不同条件执行每一个功能,不同功能的运行过程会引起不同的CPU占用,但应在平均占用率上下波动;并在功能执行结束后,迅速恢复到

38、空闲时的CPU占用状态,而不应出现CPU占用率逐次递增的现象。 如果出现不正常的CPU占用,则首先需要确定该CPU占用问题确实是被测程序产生的;然后确定问题产生在哪个功能执行过程中;分析相应功能的代码找到问题产生的原因,并加以解决。 内存泄漏测试在编译环境中的调试状态下运行被测试程序,并在程序运行期间按照不同条件执行每一个功能。正常结束程序运行后,查看程序运行期间被保留的调试信息记录中是否有内存泄漏的记录。如果程序存在内存泄漏问题,则会出现如下明确的信息记录(本信息是Visual C+ 编译环境中保留的内存泄漏调试信息,不同的编译环境中的信息描述会有所不同):Detected memory l

39、eaks!Dumping objects ->C:Documents and SettingsZhanghanyuMy Documents PersonnelMISPerson.cpp(21) : 233 normal block at 0x00433630, 4 bytes long. Data: < > CD CD CD CD C:Documents and SettingsZhanghanyuMy Documents PersonnelMISPerson.cpp(21) : 229 normal block at 0x00433660, 4 bytes long. Da

40、ta: < > CD CD CD CD C:Documents and SettingsZhanghanyuMy Documents PersonnelMISPerson.cpp(21) : 225 normal block at 0x00433690, 4 bytes long. Data: < > CD CD CD CD C:Documents and SettingsZhanghanyuMy Documents PersonnelMISPerson.cpp(21) : 221 normal block at 0x004336C0, 4 bytes long. Da

41、ta: < > CD CD CD CD C:Documents and SettingsZhanghanyuMy Documents PersonnelMISPerson.cpp(21) : 217 normal block at 0x004336F0, 4 bytes long. Data: < > CD CD CD CD C:Documents and SettingsZhanghanyuMy Documents PersonnelMISPerson.cpp(21) : 213 normal block at 0x00433720, 4 bytes long. Da

42、ta: < > CD CD CD CD C:Documents and SettingsZhanghanyuMy Documents PersonnelMISPerson.cpp(21) : 209 normal block at 0x00433750, 4 bytes long. Data: < > CD CD CD CD C:Documents and SettingsZhanghanyuMy Documents PersonnelMISPerson.cpp(21) : 205 normal block at 0x00432890, 4 bytes long. Da

43、ta: < > CD CD CD CD C:Documents and SettingsZhanghanyuMy Documents PersonnelMISPerson.cpp(21) : 199 normal block at 0x004337C0, 4 bytes long. Data: < > CD CD CD CD C:Documents and SettingsZhanghanyuMy Documents PersonnelMISPerson.cpp(21) : 195 normal block at 0x004337F0, 4 bytes long. Da

44、ta: < > CD CD CD CD C:Documents and SettingsZhanghanyuMy Documents PersonnelMISPerson.cpp(21) : 191 normal block at 0x00433820, 4 bytes long. Data: < > CD CD CD CD C:Documents and SettingsZhanghanyuMy Documents PersonnelMISPerson.cpp(21) : 187 normal block at 0x00433850, 4 bytes long. Da

45、ta: < > CD CD CD CD C:Documents and SettingsZhanghanyuMy Documents PersonnelMISPerson.cpp(21) : 183 normal block at 0x00433880, 4 bytes long. Data: < > CD CD CD CD C:Documents and SettingsZhanghanyuMy Documents PersonnelMISPerson.cpp(21) : 179 normal block at 0x00433950, 4 bytes long. Da

46、ta: < > CD CD CD CD C:Documents and SettingsZhanghanyuMy Documents PersonnelMISPerson.cpp(21) : 150 normal block at 0x00431430, 4 bytes long. Data: < > CD CD CD CD Object dump complete.这些信息记录了在程序运行期间,曾出现了15次引起内存泄漏的操作,每次泄漏了4个字节。引起这些错误的代码在Person.cpp文件,即CPerson类的实现代码文件中。根据这些信息,可以比较方便地确定产生问题

47、的代码,并加以修改。第二章 程序设计案例分析简单人事信息管理程序一 系统需求分析用户装载人员信息文件添加一个新人员信息查询一个指定人员信息删除一个指定人员信息修改一个指定人员信息对所有人员信息排序显示所有人员信息删除所有人员信息保存人员信息文件*人事信息管理程序是典型的MIS(Management Information System)软件,在各类企业和事业单位中使用最为普遍的软件之一。设计、编写一个简单人事信息管理程序虽然并不能从功能的种类和操作接口、数据的存储和共享等方面满足实际使用的需要。但对于学习软件设计的一般方法(如何从分析程序的功能需求入手;如何进行以满足需求的类结构、类对象之间的

48、动态协作和实现功能事务的活动为主要内容的总体设计;如何以总体设计为依据,完成以各类算法设计和工程化编码实现为主要内容的详细设计;以及如何对可以运行的程序进行必要测试。)和了解MIS类软件的特点是十分必要的。我们所要设计的简单人事信息管理程序的功能需求如下所示:1. 装载人员信息文件:所有人事信息应能永久保存在一个特定的磁盘文件中。在系统开始运行时应首先打开该文件,将文件中的全部信息装载到内存中存放这些信息的人员信息集合中。2. 添加一个新人员信息:通过交互界面输入一个新人员的描述信息,并将该人员信息记录添加到人员信息集合中。注意集合中不允许有重复的人员信息记录。人员的描述信息包括:身份证号,姓

49、名,性别,出生日期,家庭住址,联系电话,工作证号,工作部门,职务,薪金额度等。其中身份证号是唯一区别不同人员的标志。3. 查询一个指定人员信息:通过交互界面确定待查询人员的身份证号,在人员信息集合中搜索待查询的人员,并根据搜索结果显示不同的信息:如果指定的人员信息记录存在,则显示该人员的详细信息;若指定的人员信息记录不存在,则提示被查询人员不存在。4. 删除一个指定人员信息:通过交互界面确定待查询人员的身份证号,在人员信息集合中搜索待删除的人员,并根据搜索结果进行相应的删除操作:如果指定的欲删除信息记录存在,则先显示确认删除操作提示,并在确认删除后删除该指定信息记录;若指定的欲删除信息记录不存

50、在,则显示相应的提示信息。5. 修改一个指定人员信息:通过交互界面确定待查询人员的身份证号,在人员信息集合中搜索待修改的人员,并根据搜索结果确定相应的操作:如果待修改的信息记录存在,则显示该记录中的全部信息,并允许进行编辑修改,并在编辑修改操作结束后依据记录信息是否被修改提示是否保存修改后的记录;否则显示待修改的信息记录不存在的提示。6. 对所有人员信息排序:提示对人员信息集合中所有人员信息记录选择按照身份证号上升或下降排序,在确定了排序方向选择后,对集合中信息记录按身份证号进行上升或下降排序,并在排序操作后显示全部人员的主要信息。7. 显示所有人员主要信息:顺序显示当前人员信息集合中所有人员

51、的主要信息(身份证号、姓名、性别、出生日期、工作部门和薪金额度)。8. 删除所有人员信息:提示是否确实要删除人员信息集合中所有人员信息记录,根据确认选择执行删除操作或放弃删除操作。9. 保存人员信息文件:在系统退出运行时,如果人员信息集合中的信息记录已经被修改,则提示是否保存被更新的信息,并根据用户的选择确定是否将修改后的信息保存到特定的磁盘文件中。如果选择保存操作,则在保存新的人员信息文件的同时,将修改之前的人员信息文件作为新的备份文件。二 总体设计从软件的需求分析中不难看出:本软件要处理的数据就是描述人员信息的各种数据,因此如何组织这些数据、如何操作这些数据、如何在内存和磁盘中存储这些数据

52、、如何为操作这些数据提供交互界面等就是系统总体设计的主要任务。(一) 类的静态设计组成一个简单人事信息管理程序的类可以分为两种:一种是组织数据和完成对数据的各项操作的类,另一种是辅助各项数据操作实现的交互界面类。1. 组织数据和操作数据的类描述人员状态的各种信息是本软件中最主要的数据,因此,应该将描述一个人员状态的所有信息数据组织在一起,并将对这些数据的基本操作一起封装在一个类中,该人员信息类可以命名为Person。在Person类的各项状态属性中,描述出生日期的属性是系统预定义类型不能直接定义的,因此将描述日期状态的各项基本数据和对这些数据的操作封装一个被命名Date的日期类中是十分必要的。

53、如何将所有人员(Person对象)信息数据组织在一起对于安全、高效、方便地管理和访问这些数据非常重要的,为此,应该定义一个存储和管理这些人员信息的容器类PersonSet。这三个类的属性和操作以及它们之间的静态关系如下:Date-year:int-month:int-day:int+SetYear(in year:int)+SetMonth(in month:int)+SetDay(in day:int)+GetYear():int+GetMonth():int+GetDay():int+operator()(in year:int, in month:int, in day:int):CDa

54、te&+Format():CStringoperator>>(inout istream& in, inout Date& date):istream&friendoperator<<(inout ostream& in, inout Date& date):ostream&friend(1) Date类属性:year年份month月份day日操作:Date构造函数Date析构函数SetYear设置年份。SetMonth设置月份。SetDay设置日。GetYear获取年份属性值。GetMonth获取月份属性值。GetDay获取日属性值。operator()设置年、月、日。Format将年、月、日的属性值变换为一个形式为“yy-mm-dd”的字符串。注意,该函数的返回类型CString是MFC中提供的类,该类的功能和使用方法与STL的string类类似。祥见附录C。为了便于Date对象的输入和输出操作,应该使用友元函数为Date类重载输入和输出运算符函数:operator>&g

温馨提示

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

评论

0/150

提交评论