第 1 章 计算机与程序设计new_第1页
第 1 章 计算机与程序设计new_第2页
第 1 章 计算机与程序设计new_第3页
第 1 章 计算机与程序设计new_第4页
第 1 章 计算机与程序设计new_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

面向对象程序设计武汉理工大学——计算机科学与技术学院耿枫课程概述从过程抽象到数据抽象面向对象方法学初步面向对象分析和设计初步类和对象继承与派生多态性模板标准模板库(STL)C++的I/O实现第一章从过程抽象到数据抽象主要内容面向过程程序设计从过程抽象到数据抽象面向对象程序设计程序设计方法的发展

随着计算机软、硬件技术的不断发展,出现了许许多多的程序设计语言,程序设计方法也得到不断发展,经历一个由低级到高级,由复杂到简单的过程。主要有两种:面向过程程序设计面向对象程序设计

使用传统程序设计语言进行程序设计时,必须详细准确地描述解题过程。因为程序设计工作主要围绕设计解题过程来进行,所以传统的程序设计方法称为面向过程的程序设计。1.1面向过程程序设计[示例]:

设有如下要求:向整数集合的某个子集添加若干元素。

在程序中用整数数组表示整数集合:集合(数组)最多含MAXLENGTH个元素,集合当前有count个元素。数据定义如下:

intset[MAXLENGTH]; unsignedcount;[分析与实现]:Add(intelem,int*pset,unsigned&rcount)函数

[功能]:添加新元素elem到集合pset。若元素elem不在集合pset中,elem加到pset尾部,集合的元素个数rcount加1;否则,若元素elem已在pset中,则结束添加操作。函数定义如下:

voidAdd(intelem,int*pset,unsigned&rcount){ if(rcount<MAXLENGTH) if(!Isin(elem,pset,rcount)) *(pset+(rcount)++)=elem; }Isin(intelem,int*pset,unsignedcount)函数

[功能]:判断元素elem是否在集合pset中。从头至尾检查集合pset中的元素,若有元素elem,返回1;否则,返回0。函数定义如下:

intIsin(intelem,int*pset,unsignedcount){ for(unsignedi=0;i<count&&*(pset+i)!=elem;i++); return(i<count);}源程序面向过程程序设计的原理和方法1)模块化模块是数据说明、可执行的语句等程序元素的集合,它是单独命名的而且可以通过名字来访问。所谓模块化,就是把一个程序划分成若干个模块,每个模块完成一个子功能,把这些模块组装成一个整体,可以完成指定的功能。如:函数。

[注意]:在把程序划分成模块的时候,模块规模应该适当。2)抽象人类在认识复杂现象的过程中使用的最强有力的思维工具是抽象。人们在实践中认识到,在现实世界中一定事物、状态或过程之间总存在着某些相似的方面(共性)。把这些相似的方面集中和概括起来,暂时忽略它们之间的差异,这就是抽象。抽象的过程是将有关事物的共性归纳、集中的过程。 抽象的作用是表示同一类事物的本质。

[例如]:各式各样的人——>人类3)信息隐藏和局部化信息隐藏原理指出,在设计和确定模块时,应该使得一个模块内包含的信息(数据和过程)对于不需要这些信息的模块来说,是不可访问的(又称不可见的)。局部化是指把一些关系密切的程序元素物理地放得彼此靠近,处于同一局部区域内。4)模块独立模块独立要求在设计程序结构时,应该使得每个模块完成一个相对独立的特定子功能,并且和其他模块之间的关系尽可能简单。

衡量模块独立程度的两个定性标准:内聚和耦合。内聚衡量一个模块内部各个元素彼此结合的紧密程度。理想内聚的模块只做一件事情。耦合衡量不同模块彼此间相互依赖(连接)的紧密程度。

高内聚和松耦合是进行模块化设计的重要标准,实践表明内聚更重要。5)结构程序设计技术把一个程序划分成若干个模块之后,进一步的工作就是设计完成每个模块功能的处理过程。

结构程序设计是一种设计程序的技术,它采用自顶向下、逐步求精的设计方法和单入口、单出口的控制结构。结构化程序设计包括三种结构:顺序结构、分支结构和循环结构。AB顺序结构A循环结构expFTAB选择结构expFT结构化程序设计的特点:自顶向下,逐步求精。(示例图1)模块化。根据完成的功能,将程序划分为相对独立的若干模块。模块之间关系简单、独立。每一模块均是由三种结构组成的,模块化的实现的具体方法是子程序。使用结构程序设计技术设计程序的主要好处:自顶向下逐步求精的方法符合人类解决复杂问题的普遍规律,因此可以显著提高开发效率。用先全局后局部、先整体后细节、先抽象后具体的逐步求精过程开发出的程序有清晰的层次结构,因此容易阅读和理解。仅使用单入口单出口的控制结构,使得程序的静态结构和它的动态执行情况比较一致。控制结构有确定的逻辑模式,源程序清晰流畅,易读易懂而且容易测试。1.1从过程抽象到数据抽象【讨论区】: 针对示例,我们来讨论如下两个问题。需求变化,程序改动是否容易?

例如,将集合的数据表示改为用链表存储,不再需要变量count,集合的两个函数的实现及它们的使用都得改动。即:整个程序都得改动,修改不是局部化的。能否重用?

函数级重用,其他难以重用。

产生这些问题的原因是,示例中的程序实现了整数集合这样一种数据结构,并使用这种数据结构,把两者混在一起,过分针对具体问题。实际上,通常需要被重用的是集合,故应该把整数集合实现与应用分开,只有这样才能做到修改局部化,提高可重用性。[分析]:[解决方案]:将集合的实现与使用分开方案一:使用结构体类型,将整数集合做成以下数据类型:

structSet{ intdata[MAXLENGTH]; unsignedcount; };

这样,每个整数集合是一个结构体变量,需要将成员变量初始化。

程序中需要提供如下3个函数:

//集合初始化

voidInitialize(Set*pSet);

//向集合中添加元素elem

voidAdd(intelem,Set*pSet); //判断元素elem是否在集合中

voidIsin(intelem,Set*pSet);

为将集合的实现和使用分开,程序需按如下结构组织:将整数集合的定义放在一个头文件中;文件名为Set.h将整数集合的实现放在一个文件中;文件名为Set.cpp将集合的应用放在另外的文件中。文件名为AppSet.cpp源程序方案二:

使用单链表来存储集合元素,链表结点定义为:

structNode{ intelement; Node*pNodeNext; };

集合类型只含链表头,无须结点个数变量count,但需要增加求元素个数的函数Card。源程序面向过程程序设计的缺陷:把数据和过程分开。程序员在编程时必须考虑所要处理数据的格式,对于不同的数据格式做相同的处理或是对相同的数据格式做不同的处理都需要编写不同的程序,因此面向过程程序设计的可复用性不好。以功能分解的设计方法很难保证系统的演变像需求的变化那样平滑,有时需求的很少一点变化可能会导致系统的重新设计。面向过程程序设计认为每个系统的主功能都可以在最高层次上抽象出来进行恰当描述,而实际上大多数系统都无法简单地用一个顶层功能来描述,也没法简单地用一个主程序来描述系统的操作流程。如,操作系统。自顶向下的程序设计方法与复用思想本质上时背道而驰的。基于复用的软件构造方式应该是自底向上的,是用最大可能地利用现有部件的组合来实现新系统。软件危机

“软件危机”是指在开发和维护计算机软件的过程中所遇到的一系列严重的问题。

1.主要表现:对软件开发成本和进度的估计常常很不准确。用户对“已完成的”软件系统不满意的现象经常发生。软件产品的质量常常靠不住。软件常常是不可维护的。软件通常没有适当的文档资料。软件成本在计算机系统总成本中所占比例逐年上升。

2.产生原因:一方面是由软件生产本身存在着复杂性;另一方面却是与软件开发所使用的方法和技术有关。3.解决途径:一方面需要对程序设计方法、程序的正确性和软件的可靠性等问题进行系列的研究;另一方面,需要对软件的编制、测试、维护和管理的方法进行研究。1.4面向对象程序设计

面向对象程序设计是一种围绕现实世界的概念来组织模型的程序设计方法,它采用对象来描述问题空间的实体。 用对象分解取代功能分解,也就是把程序分解成许多对象,不同的对象之间通过发消息向对方提出服务要求,接收消息的对象主动完成指定功能,程序中的所有对象分工协作,共同完成整个程序的功能。1.面向对象方法概述1)基本思想

面向对象方法学的出发点和基本原则,是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题的问题空间(也称为问题域)与实现解法的解空间(也称为求解域)在结构上尽可能一致。认为客观世界是由各种对象组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合而成。把所有对象都划分成各种对象类(简称为类,class),每个对象类都定义了一组数据和一组方法。按照子类(或称为派生类)与父类(或称为基类)的关系,把若干个对象类组成一个层次结构的系统(也称为类等级)。对象彼此之间仅能通过传递消息互相联系。[分析]:2)Coad&Yourdon给OO的定义面向对象的方法学可以用下列方程来概括:

OO=Objects+Classes+Inheritance+CommunicationWithmessages[分析]:基于对象:仅使用对象和消息基于类:仅使用对象、类和消息面向对象:

只有同时使用对象、类、继承和消息的方法,才是真正面向对象的方法。所开发的程序才是面向对象的程序。3)发展历史与现状

雏形阶段

完善阶段

繁荣阶段60年代挪威计算中心开发的Simula67——面向对象语言的先驱和第一个里程碑(首先引入了类的概念和继承机制)。

70年代CLU、并发Pascal、Ada和Modula-2等语言对抽象数据类型理论的发展起到重要作用(支持数据与操作的封装)。犹他大学的博士生AlanKay设计了一个实验性的语言Flex。从Simula67中借鉴了许多概念,如类、对象、继承等。

1972年PaloAlno研究中心(PARC)发布了Smalltalk-72,其中正式使用了“面向对象”这个术语。

Smalltalk的问世标志着面向对象程序设计方法的正式形成。但是这个时期的Smalltalk语言还不够完善。3)发展历史与现状

雏形阶段

完善阶段

繁荣阶段PARC先后发布了Smalltalk-72,76,78等版本,直至1981年推出该语言最完善的版本Smalltalk-80。

Smalltalk-80的问世被今认为是面向对象语言发展史上最重要的里程碑。迄今绝大部分面向对象的基本概念及其支持机制在Smalltalk-80中都已具备。它是第一个完善的、能够实际应用的面向对象语言。3)发展历史与现状

雏形阶段

完善阶段

繁荣阶段

自80年代中期到90年代,是面向对象语言走向繁荣的阶段。其主要表现是大批比较实用的OOPL的涌现。

OO编程语言分为纯OO语言和混合型OO语言混合型语言是在传统的过程式语言基础上增加OO语言成分,在实用性方面具有更大的优势。2.面向对象方法的主要优点与人类习惯的思维方法比较一致;稳定性好;可重用性好;可维护性好。

温馨提示

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

评论

0/150

提交评论