第 2 章 程序设计基础

57
第 2 第 第第第第第第

Upload: zoey

Post on 15-Jan-2016

89 views

Category:

Documents


0 download

DESCRIPTION

第 2 章 程序设计基础. 知识类型:理论 学时: 4 学时. 面向对象的语言. 出发点: 更直接地描述客观世界中存在的事物 ( 对象 ) 以及它们之间的关系。 特点: 是高级语言。 将客观事物看作具有 属性 和 行为 的对象。 通过 抽象 找出同一类对象的共同属性和行为,形成 类 。 通过类的 继承 与 多态 实现代码重用. 面向对象的语言. 优点: 使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。. 程序设计方法的发展历程 —— 面向 过程 的程序设计方法. 程序的目的:用于数学计算 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 2 章 程序设计基础

第 2 章 程序设计基础

Page 2: 第 2 章 程序设计基础

知识类型:理论学时: 4学时

Page 3: 第 2 章 程序设计基础

面向对象的语言

出发点:更直接地描述客观世界中存在的事物 ( 对象 )

以及它们之间的关系。特点:

是高级语言。将客观事物看作具有属性和行为的对象。通过抽象找出同一类对象的共同属性和行为,

形成类。通过类的继承与多态实现代码重用

Page 4: 第 2 章 程序设计基础

优点:使程序能够比较直接地反问题域的本来面

目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。

面向对象的语言

Page 5: 第 2 章 程序设计基础

程序设计方法的发展历程 ——面向过程的程序设计方法

程序的目的:用于数学计算

主要工作:设计求解问题的过程

缺点:对于庞大、复杂的程序难以开发和

维护

Page 6: 第 2 章 程序设计基础

程序设计方法的发展历程——面向过程的结构化程序设计方法

设计思路 自顶向下、逐步求精。采用模块分解与功能抽象,自顶

向下、分而治之。 程序结构:

按功能划分为若干个基本模块,形成一个树状结构。 各模块间的关系尽可能简单,功能上相对独立;每一模

块内部均是由顺序、选择和循环三种基本结构组成。 其模块化实现的具体方法是使用子程序。

Page 7: 第 2 章 程序设计基础

程序设计方法的发展历程——面向过程的结构化程序设计方法

优点:有效地将一个较复杂的程序系统设计任务分解成

许多易于控制和处理的子任务,便于开发和维护。

Page 8: 第 2 章 程序设计基础

程序设计方法的发展历程 ——面向过程的结构化程序设计方法

缺点:可重用性差、数据安全性差、难以开发大型软件和图形界面的应用软件 把数据和处理数据的过程分离为相互独立的实体。 当数据结构改变时,所有相关的处理过程都要进行相

应的修改。 每一种相对于老问题的新方法都要带来额外的开销。 图形用户界面的应用程序,很难用过程来描述和实现,

开发和维护也都很困难。

Page 9: 第 2 章 程序设计基础

程序设计方法的发展历程 ——面向对象的方法

将数据及对数据的操作方法封装在一起,作为一个相互依存、不可分离的整体——对象。

对同类型对象抽象出其共性,形成类。 类通过一个简单的外部接口,与外界发生关系。 对象与对象之间通过消息进行通讯。

Page 10: 第 2 章 程序设计基础

程序设计方法的发展历程 ——面向对象的方法

优点: 程序模块间的关系更为简单,程序模块的独立性、

数据的安全性就有了良好的保障。 通过继承与多态性,可以大大提高程序的可重用性,

使得软件的开发和维护都更为方便。

Page 11: 第 2 章 程序设计基础

面向对象的基本概念 ——对象

一般意义上的对象: 是现实世界中一个实际存在的事物。 可以是有形的(比如一辆汽车),也可以是无形的

(比如一项计划)。对象有如下特性:

:有一个名字以区别于其它对象 :有一个状态用来描述它的某些特征 :有一组操作,每个操作决定了对象的一种功能或行为 :对象的操作分为两类:自身承受的操作、施加于其它对象的操作

是构成世界的一个独立单位,具有:静态特征:可以用某种数据来描述动态特征:对象所表现的行为或具有的功能

Page 12: 第 2 章 程序设计基础

<例 >

有一个人名字叫胡哥,性别男,身高 1.80m ,体重 68kg ,可以修电器,可以教计算机课,描述该对象如下:

–对象的静态特征:•性别:男•身高: 1.80m

•体重: 68kg

–对象的动态特征:•回答身高•回答体重•回答性别•修理电器•教计算机课

Page 13: 第 2 章 程序设计基础

面向对象的基本概念 ——对象

面向对象方法中的对象: 是系统中用来描述客观事物的一个实体,它是用来

构成系统的一个基本单位。对象由一组属性和一组行为构成。 属性:用来描述对象静态特征的数据项。 行为:用来描述对象动态特征的操作序列。

Page 14: 第 2 章 程序设计基础

面向对象的基本概念 ——类

分类——人类通常的思维方法 分类所依据的原则——抽象

忽略事物的非本质特征,只注意那些与当前目标有关的本质特征,从而找出事物的共性,把具有共同性质的事物划分为一类,得出一个抽象的概念。

例如,石头、树木、汽车、房屋等都是人们在长期的生产和生活实践中抽象出的概念。

Page 15: 第 2 章 程序设计基础

面向对象的基本概念 ——类面向对象方法中的 " 类 "

具有相同属性和行为的一组对象的集合 为属于该类的全部对象提供了抽象的描述,包括属性和行为两个主要部分。

类与对象的关系:犹如模具与铸件之间的关系,一个属于某类的对象称为该类的一个实例。

Page 16: 第 2 章 程序设计基础

抽象

抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。

先注意问题的本质及描述,其次是实现过程或细节。 数据抽象:描述某类对象的属性或状态(对象相互区

别的物理量)。 代码抽象:描述某类对象的共有的行为特征或具有的

功能。 抽象的实现:通过类的声明。

Page 17: 第 2 章 程序设计基础

抽象实例——钟表

数据抽象:int Hour, int Minute, int Second

代码抽象:SetTime(), ShowTime()

Page 18: 第 2 章 程序设计基础

抽象实例——钟表类class Clock{ public: void SetTime(int NewH, int NewM, int NewS); void ShowTime(); private: int Hour,Minute,Second;};

Page 19: 第 2 章 程序设计基础

抽象实例——人数据抽象:

char *name,char *gender,int age,int id

代码抽象:生物属性角度:GetCloth(), Eat(), Step(),…

社会属性角度:Work(), Promote() ,…

Page 20: 第 2 章 程序设计基础

类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。

利用类可以实现数据的封装、隐藏、继承与派生。

c++ 中的类

Page 21: 第 2 章 程序设计基础

类的声明形式 类是一种用户自定义类型,声明形式:

class 类名称{ public: 公有成员(外部接口) private: 私有成员 protected: 保护型成员}

Page 22: 第 2 章 程序设计基础

类的成员class Clock

{

public: void SetTime(int NewH, int NewM, int NewS); void ShowTime();

private:

int Hour, Minute, Second;

};成员数据

成员函数

Page 23: 第 2 章 程序设计基础

void Clock :: SetTime(int NewH, int NewM, int NewS)

{

Hour=NewH;

Minute=NewM;

Second=NewS;

}

void Clock :: ShowTime()

{

printf(“%d:%d:%d”,Hour,Minute,Second);

}

19

Page 24: 第 2 章 程序设计基础

成员函数 在类中说明原形,可以在类外给出函数体实现,并在函数名前使用类名加以限定。也可以直接在类中给出函数体,形成内联成员函数。

允许声明重载函数和带默认形参值的函数

成员数据 与一般的变量声明相同,但需要将它放在类的声明体中。

Page 25: 第 2 章 程序设计基础

对象 类的对象是该类的某一特定实体,即类类型

的变量。 声明形式:

类名 对象名; 例:

Clock myClock;

Page 26: 第 2 章 程序设计基础

类中成员的访问方式

类中成员互访 直接使用成员名

类外访问 使用“对象名 . 成员名”方式访问 public 属

性的成员

Page 27: 第 2 章 程序设计基础

<例 > 类的应用举例#include<iostream>class Clock{ ......// 类的声明略}//...... 类的实现略int main(){ Clock myClock; myClock.SetTime(8,30,30); myClock.ShowTime();}

Page 28: 第 2 章 程序设计基础

面向对象的基本概念 ——封装

将抽象出的数据成员、代码成员相结合,将它们视为一个整体。

目的是曾强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。

实现封装:类声明中的 { }

Page 29: 第 2 章 程序设计基础

封装实例:class Clock

{

public: void SetTime(int NewH,int NewM, int NewS); void ShowTime();

private: int Hour,Minute,Second;

};

边界特定的访问权限

外部接口

Page 30: 第 2 章 程序设计基础

面向对象的基本概念 ——继承与派生

继承对于软件复用有着重要意义,是面向对象技术能够提高软件开发效率的重要原因之一。

定义:特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。 例如:将轮船作为一个一般类,客轮便是一个特殊类。

Page 31: 第 2 章 程序设计基础

保持已有类的特性而构造新类的过程称为继承。

在已有类的基础上新增自己的特性而产生新类的过程称为派生。

被继承的已有类称为基类(或父类)。派生出的新类称为派生类。

Page 32: 第 2 章 程序设计基础

继承与派生问题举例

¹ ¤¾ ß³ µ ½ γ µ Ã æ° ü³ µ

Ð ¡Æ û³ µ ¿ ³̈ µ  ÃРг µ

汽 车

交 通 工 具

Page 33: 第 2 章 程序设计基础

继承与派生问题举例

猴 子

Ê ×̈ Ó » ¢ Á Ô± ª

猫 鸟

动 物

Page 34: 第 2 章 程序设计基础

继承与派生问题举例

圆 矩 形

几 何 形 状

Page 35: 第 2 章 程序设计基础

继承与派生问题举例

兼 职 技 术 人 员

销 售 经 理

管 理 人 员 销 售 人 员

雇 员

多继承、单继承

Page 36: 第 2 章 程序设计基础

继承与派生的目的

继承的目的:实现代码重用。派生的目的:当新的问题出现,原有程序无法

解决(或不能完全解决)时,需要对原有程序进行改造。

Page 37: 第 2 章 程序设计基础

派生类的声明class 派生类名:继承方式 基类名{

成员声明;}

Public :

Protected:

Private:

继承方式:

Page 38: 第 2 章 程序设计基础

公有继承举例class Point // 基类 Point 类的声明{public: //公有函数成员

void InitP(float xx=0, float yy=0) {X=xx;Y=yy;}

void Move(float xOff, float yOff) {X+=xOff;Y+=yOff;}

float GetX() {return X;}float GetY() {return Y;}

private: //私有数据成员float X,Y;

};

动态特征:

InitP(x,y)初始化一个点

Move(x,y)移动该点

GetX() 得到该点 X坐标值

GetY() 得到该点 Y坐标值

Point 类:

静态特征:

x,y

Page 39: 第 2 章 程序设计基础

class Rectangle: public Point //派生类声明{public: // 新增公有函数成员

void InitR(float x, float y, float w, float h)

{InitP(x,y);W=w;H=h;}//调用基类公有成员函数float GetH() {return H;}

float GetW() {return W;}

private: // 新增私有数据成员float W,H;

};

39

动态特征:

InitR(x,y,w,h)初始化

GetH() 得到矩形的高

GetW() 得到矩形的宽

Rectanglet 类:

静态特征:

W,H

Move(x,y)移动该点GetX() 得到该点 X坐标值GetY() 得到该点 Y坐标值

Point 类:

Page 40: 第 2 章 程序设计基础

#include<iostream>#include<cmath>int main(){ Rectangle rect;

rect.InitR(2,3,20,10); // 通过派生类对象访问基类公有成员

rect.Move(3,2); printf(“%f,%f,%f,%f”,rect.GetX(), rect.GetY(),

rect.GetH(), rect.GetW());

return 0;}

40

Page 41: 第 2 章 程序设计基础

面向对象的基本概念 ——多态性

多态是指在一般类中定义的属性或行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或行为在一般类及其各个特殊类中具有不同的语义。

例如:数的加法 -> 实数的加法

-> 复数的加法

Page 42: 第 2 章 程序设计基础

多态:同一名称,不同的功能实现方式。

目的:达到行为标识统一,减少程序中标

识符的个数。

实现:重载函数和虚函数

Page 43: 第 2 章 程序设计基础

总结 面向对象程序设计(英语: Object Oriented

Programming ,缩写: OOP ),指一种程序设计范型,同时也是一种程序开发的方法论。它将对象作为程序的基本单元基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。

Page 44: 第 2 章 程序设计基础

类 类( Class )定义了一件事物的抽象特点。通常来说,类定义了事物的属性和它可以做到的(它的行为)。

类可以为程序提供模版和结构。 一个类的方法和属性被称为“成员”。

类狗 { 私有成员 : 体重 毛皮颜色 ......... 公有成员 : 吠叫 () ...........}

Page 45: 第 2 章 程序设计基础

对象 对象( Object )是类的实例。

类狗 莱丝; 莱丝 .毛皮颜色 =棕白色 莱丝 .吠叫 () ;

我们无法让狗这个类去吠叫,但是我们可以让对象 "莱丝 "去吠叫,正如狗可以吠叫,但没有具体的狗就无法吠叫。

Page 46: 第 2 章 程序设计基础

方法 (行为 )

方法( Method )是一个类能做的事情,但方法并没有去做这件事。 作为一条狗,莱丝是会吠叫的,因此“吠叫 ()” 就是它的一

个方法。与此同时,它可能还会有其它方法,例如“坐下()” ,或者“吃 ()” 。 对一个具体对象的方法进行调用并不影响其它对象,正如所有的狗都会叫,但是你让一条狗叫不代表所有的狗都叫。

类狗 莱丝,泰尔; 莱丝 .吠叫 () ; 则泰尔是不会吠叫的,因为这里的吠叫只是对对象 "莱丝 " 进行的。

Page 47: 第 2 章 程序设计基础

封装性 具备封装性( Encapsulation )的面向对象程序设计隐藏了某

一方法的具体执行步骤,取而代之的是通过消息传递机制传送消息给它。

/* 一个面向过程的程序会这样写: */ 结构体狗 莱丝 ;

设置音调 (莱丝, 5) ; 吸气 (莱丝 ) ; 吐气 (莱丝 ) ;

/* 当狗的吠叫被封装到类中,任何人都可以简单地使用: */ 类狗 莱丝; 莱丝 .吠叫 () ;

封装是通过限制只有特定类的实例实例可以访问这一特定类的成员成员,而它们通常利用接口实现消息的传入传出。

class MeiNu //美女类!{............ private:   int XW;  //胸围   int YW;  //我就不说了噢 :)   int TW;  //我还是不说了噢 :)) };

MeiNu jordan; //now is 乔丹 !jordan.XW = 34;jordan.YW = 24;jordan.TW = 34;

Page 48: 第 2 章 程序设计基础

继承性与多态性 继承性( Inheritance )是指,在某种情况下,

一个类会有“子类”。 多态性( Polymorphism )指方法在不同的

类中调用可以实现的不同结果。

类狗 莱丝;类鸡 鲁斯特;莱丝 .叫 () ;鲁斯特 .叫 () ;

鸡啼

犬吠

Page 49: 第 2 章 程序设计基础

消息 消息是系统向对象发出的服务请求,是对象之

间的通信机制。提供服务的对象负责消息协议的格式和消息的接收,请求服务的对象提供输入信息,获取应答消息内容。

在面向对象中,消息常常通过函数调用来实现。

Page 50: 第 2 章 程序设计基础

<例 >

状态:胡哥 29岁 男 计算机 讲师 680

实例:

行为:评职称 涨工资

抽象

属性:姓名 年龄 性别 单位 职称 工资

类:讲师

操作:评职称 涨工资

数据

结构

方法名

方法:评职称 { 步骤 条件 } 涨工资 {公式 }

方法体

class 讲师 胡哥 ;

胡哥 .评职称( ..... ) ; 胡哥 .调工资( ..... ) ;

消息

Page 51: 第 2 章 程序设计基础

补充习题 -选择题1. 下面描述中,符合结构化程序设计风格的是 ______ 。 A. 使用顺序、选择和重复(循环)三种基本控制结构表示程

序的控制逻辑B. 模块只有一个入口,可以有多个出口C. 注重提高程序的执行效率D. 不使用 goto 语句

2. 下面概念中,不属于面向对象方法的是 ______ 。A. 对象 B. 继承C. 类 D. 过程调用

3. 结构化程序设计主要强调的是 ______ 。A. 程序的规模 B. 程序的易读性C. 程序的执行效率 D. 程序的可移植性

4. 对建立良好的程序设计风格,下面描述正确的是 ______ 。A. 程序应简单、清晰、可读性好B. 符号名的命名要符合语法C. 充分考虑程序的执行效率D. 程序的注释可有可无

Page 52: 第 2 章 程序设计基础

补充习题 -选择题

5. 下面对对象概念描述错误的是 ______ 。 A. 任何对象都必须有继承性

B. 对象是属性和方法的封装体C. 对象间的通讯靠消息传递D. 操作是对象的动态性属性

6. 算法一般都可以用哪几种控制结构组合而成 ______ 。 A. 循环、分支、递归B. 顺序、循环、嵌套C. 循环、递归、选择D. 顺序、选择、循环

7. 在面向对象方法中,一个对象请求另一对象为其服务的方式是通过发送 ______ 。

A. 调用语句 B. 命令 C. 口令 D. 消息

Page 53: 第 2 章 程序设计基础

补充习题 -选择题8. 在设计程序时,应采纳的原则之一是 ______ 。 A. 程序结构应有助于读者理解

B. 不限制 goto 语句的使用C. 减少或取消注解行D. 程序越短越好

9. 面向对象的设计方法与传统的的面向过程的方法有本质不同,它的基本原理是 ______ 。

A. 模拟现实世界中不同事物之间的联系B. 强调模拟现实世界中的算法而不强调概念C. 使用现实世界的概念抽象地思考问题从而自然地解决问题D. 鼓励开发者在软件开发的绝大部分中都用实际领域的概念去思考

10.采用面向对象技术开发的应用系统的特点是 ______ 。 A. 重用性更强

B. 运行速度更快 C. 占用存储量小 D. 维护更复杂

Page 54: 第 2 章 程序设计基础

补充习题 -填空题1.结构化程序设计的三种基本逻辑结构为顺序、选择和( )2.源程序文档化要求程序应加注释。注释一般分为序言性注释 和( )3.在面向对象方法中,信息隐蔽是通过对象的( )性来实现

的 .4.类是一个支持集成的抽象数据类型,而对象是类的( )5.在面向对象方法中,类之间共享属性和操作的机制称为( 6. 结构化程序设计方法的主要原则可以概括为自顶向下、逐步

求精、 ( ) 和限制使用 goto 语句。7. 面向对象的程序设计方法中涉及的对象是系统中用来描述客

观事物的一个( )。8. 一个类可以从直接或间接的祖先中继承所有属性和方法。采

用这个方法提高了软件的( )9. 面向对象的模型中,最基本的概念是对象和 ( )。10. 结构化程序设计是一种面向 ( ) 的设计方法 .

Page 55: 第 2 章 程序设计基础

补充习题 -填空题

11. 对象的基本特点包括标识唯一性、分类性、 多态性、(  )和模块独立性

12. 采用结构化程序设计方法能够使程序易读、易理解 ( ) 和结构良好 .

13. 在面向对象分析和设计中 , 通常把对象所进行的操作称为 ( )14. 使用已经存在的类定义作为基础建立新的类定义 ,这样的技术称为 ( )

15. 继承使得相似的对象可以共享代码和数据结构 ,从而大大减少了程序中的冗余信息 , 提高软件的 ( )

16. 对象和类的关系可以表示为 (  )和(  )的关系17. 重复使用一个对象类有两种方法,分别是(  )和(  )。

答案 : 17 .创建该类的实例,从而直接使用它; 从它派生出一个满足当前需要的新类 

Page 56: 第 2 章 程序设计基础

补充习题 -填空题

18. 结构化程序设计的原则中 , “先考虑总体,后考虑细节;先考

虑全局目标,后考虑局部目标”称为 ( ) 。19. 在程序设计语言中,重复结构对应两类循环语句,即先判断 后执行循环体的 ( ) 循环结构,和先执行循环体后判断 ( ) 循环结构。20. 在消息传递中,对象根据所接受的消息而做出动作,同样的 消息被不同的对象接受时可导致完全不同的行动,该现象称 为 ( ) 。

Page 57: 第 2 章 程序设计基础

1. (06.4月 ) 下列选项中不属于结构化程序设计方法的是 A) 自顶向下 B) 逐步求精 C) 模块化 D) 可复用

2. (06.4月 ) 在面向对象方法中,【 】描述的是具有相似属性与操作的一组对象。

3. (05.4月 ) 在面向对象方法中,类的实例称为 【 】 .

有关等级考试题