《《高级程序设计》课程设计指导书.doc》由会员分享,可在线阅读,更多相关《《高级程序设计》课程设计指导书.doc(5页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、高级程序设计课程设计指导书对象:浦计1003-5 时间:2011年6月设计题目:大学人员管理系统、图书管理系统、平面图形多态演示系统指导老师:杨建新一、 实习步骤随着计算机硬件性能的提高,人们开发的软件越来越大,软件开发的复杂度也急骤增加。然而,编制一个10,000行的程序的难度绝不仅仅是一个5,000行的程序的两倍。软件的复杂度随着其规模呈非线性增长!因此软件开发需要系统的方法。事实上,这正是软件工程这门学科产生的背景。按照软件工程的观点,通常我们可以将软件从构建到消亡的整个生命周期划分为分析、设计、编码、调试、测试、维护等几个阶段。其中设计又可细分为总体设计、各功能模块的概要设计、详细设计
2、等。当然一个具体的软件不一定具有上述的每种分类。虽然高级程序设计课程中的实习题的复杂度远不如(从实际问题提出来的)一个“真正的”软件,但为了培养一个软件工作者所应具备的科学工作的方法和作风,我们制订了如下所述完成实习的七个步骤:(一) 问题分析和任务定义与精确定义的数学问题不同,软件开发所面对的问题通常是不明确的,或者说其含义是模棱两可的。理由很简单的,软件开发出来是供人使用的,它当然得符合用户的需求,然而用户的需求是个含糊的不精确的主观上的东西,有时甚至用户自己都不清楚自己究竟想要什么,并且用户的需求也不是一成不变的,很可能会发生变化。因此软件开发的第一步通常是需求分析,也即明确问题或者说明
3、确软件系统的功能目标用户究竟想要什么,限制条件是什么等。为了尽可能模拟实际的软件开发,我们实习题目的陈述也比较简洁、或者说有模棱两可的含义。因此,在进行设计之前,首先应该充分地分析和理解问题,明确问题要求做什么?限制条件是什么。另外,最好事先设计一组好的测试用例用以验收最后构建的系统是否满足用户的功能需求,不要等到系统构建完了才设计测试用例。注意:本步骤强调的是做什么(what to do)?而不是怎么做(how to do)。(二) 概要设计这步是从高层抽象的角度宏观上考虑怎么做(how to do)?为了达到第一步分析中的系统的功能目标,我们应该如何构建它?系统应该划分为几个模块?模块之间
4、怎样交互?系统中需要哪些类?每个类在逻辑上应该怎样描述(逻辑结构)它具有哪些特征(属性和行为)?各类之间关系又如何?注意:概要设计是一种逻辑上的设计。作为逻辑设计的结果,应该写出每个类的抽象定义(逻辑结构是什么?它有哪些操作接口?)、各个主要模块的抽象算法,并画出模块之间的调用关系图。我们不应过早考虑“计算机内部如何表示类(存储结构)?类的各操作具体如何实现(算法)?”等接下来详细设计中才需考虑的问题。比如,假定系统中需要一个描述“人”的类Person,它有姓名、性别、年龄等属性。此时不应该考虑是用char name30还是string name或者char*来表示属性“姓名”这种细节问题,因
5、为哪是详细设计的任务,而不是概要设计的任务。在求精的过程中,应尽量避免过早地陷入具体编程语言的细节中!(三) 详细设计详细设计的主要任务就是针对概要设计中定义的“类”选择合适的存储结构,然后在存储结构上实现类的各个操作。还有就是对概要设计中各模块的抽象算法进行逐步求精。最好用伪码来表示算法,当然用算法框图也可以。注意,详细设计的过程及结果通常是和具体编程语言紧密相关的,因为存储结构的选择中,我们通常必须用到编程语言中的内建类型(built-in type)来表示我们的UDT(User Defined Type)。(四) 编码实现将详细设计的结果转换为具体的编程语言(在我们课程里是C+)程序代码
6、。无论是与高层的概要设计相比也好,还是与低层的详细设计相比也好,源代码的抽象度是三者中最低的,同时它又是最精确,最没有歧义性的。编码要注意遵循相关的规范,从一开始就养成一个良好的编程习惯。比如:缩进、关键代码段加注释等等。每种编程语言都有自己的一整套语言特性,也有自己的陷阱和缺陷,编码时要注意选用合适的语言特性来解决合适的问题,并避开语言中的陷阱。这些都需要我们对编程语言的熟悉程度。“编程中学会编程”!这与“游泳中学会游泳”的道理是相通的。编码完了之后,不要急着去编译运行,而应该首先进行静态检查。在编译运行之前,认真的静态检查是必不可少的。多数初学者在编好程序后处于以下两种状态之一:一种是对自
7、己的“精心作品”的正确性确信不疑;另一种是认为上机前的任务已经完成,纠查错误是上机调试的工作。这两种态度是极为有害的。事实上,非训练有素的程序设计者编写的程序代码超过50行时,极少不含有除语法错误以外的错误。上机动态调试程序决不能代替程序运行前的静态检查,否则调试效率将是极低的。(五) 上机调试即使我们在编码之后运行之前作了非常非常仔细的静态检查,程序在编译运行时,可能还会出现各种事先我们未曾预料的错误和异常现象。这源自于软件开发的复杂性,“程序的正确性证明”在学术上是个重要的研究方向,可惜对于现实世界中复杂的软件系统,这仍然只是个美好的愿望。调试是实际软件开发中必不可少的一环,也是最容易让人
8、受挫的一步。一种普遍存在的错误观念是,调试程序全凭运气。事实上,调试能力取决于一个人的智慧、编程功底和经验,著名的计算机科学家Brian W.Kernigham说过,调试至少比编码难一倍;而软件系统的设计是否清晰、结构是否良好、代码的可读性好坏则是影响调试效率的另外一个重要方面。很多人只认识到定位错误,而没有认识到预先避免错误的重要性,也不知道应该如何努力。实际上,设计思路不清晰、结构不好、算法在概念上晦涩难懂的程序是很难调试正确的。 最后,“工欲善其事必先利其器”,对调试器(debugger)的熟练应用有助于提高调试效率。顺便提一下,调试与测试是两个不同的概念,测试是企图去发现系统不一定是软
9、件系统,也可以是硬件系统。中的错误,而调试则是去分析错误的根源并排除错误。(六) 测试程序的正确性(对一切正确的输入都产生正确的输出)在软件质量度量中是头等重要的,可惜的是,前面我们已提及要严格证明复杂程序的正确性极为困难,至少目前为止无法实用。既然如此,那么我们如何度量程序的正确性(即如何判断开发出来的软件是否满足用户的需求),答案是:测试。当然,由于组合爆炸的缘故,对于复杂的程序我们要作完备穷尽的测试是不可能的,此时测试用例的设计就很讲究。软件工程对测试会有专门的讨论(比如白盒测试、黑盒测试;单元测试、集成测试等),这里就不赘述了。高级程序设计作为一门先修的基础课程不可能详细讨论这些概念,
10、我们主要是希望通过课程实习让同学们有“测试”的概念,从而为后续课程(比如软件工程)的学习作一些铺垫。最后,有必要提一下测试的局限性,伟大的计算机科学家Dijkstra有句名言:“测试只能证明程序有错,而不能证明程序没有错误。”因此,对于系统中某些关键的核心算法,我们为了可以放心大胆地使用,仍有必要从数学上严格证明其正确性。(七) 总结和整理实习报告撰写课程设计实习报告书,内容包括需求分析、概要设计、详细设计、调试分析、测试结果、程序文件名清单、小结与思考等。二、 实习报告规范实习报告的开头填写姓名、班级学号和题目,并包括以下七部分内容:1. 需求分析以无歧义的陈述说明程序设计的任务,强调的是程
11、序要做什么?明确规定:(1) 输入的形式和输入值的范围;(2) 输出的形式;(3) 程序所能达到的功能;(4) 测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。2. 概要设计说明本程序中用到的所有“类”的抽象定义、画出类图、主程序的流程以及各程序模块之间的层次(调用)关系。3. 详细设计表示并实现概要设计中定义的“类”:先为它选择合适的存储结构,然后在存储结构的基础上实现类的各个操作(用算法伪码表示);对主程序和其他模块也都写出伪码算法;画出函数的调用关系图。注意:伪码算法的抽象度要高于源码,但容易按照伪码算法写出相应的高级语言源码程序;对于算法的关键之处或难懂之处应加注释。4. 调试分析内容包括:调试过程遇到的问题以及如何解决的经验与体会;对设计与实现的回顾讨论与分析(主要谈它们对调试的影响)。5. 测试结果列出你的测试结果,包括输入和输出。这里的测试数据应该完整和严格,最好多于需求分析中所列。6. 附录列出组成软件系统的源程序文件名清单。例如,以下为一示例:Person.h/ 类Person的表示单元Person.cpp / 类Person的实现单元DB_UI.cpp/ 主程序模块7. 小结与思考内容包括本次课程设计的收获与不足等感想体会。值得注意的是,实习报告的各种文档资料,如上述中的前三部分要在程序开发过程中逐渐充实形成,而不是最后补写。
限制150内