面向对象程序设计实例_第1页
面向对象程序设计实例_第2页
面向对象程序设计实例_第3页
面向对象程序设计实例_第4页
面向对象程序设计实例_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、面向对象程序设计(二),吕俊白,第十章面向对象程序设计实例,所谓面向对象的程序设计方法就是运用面向对象的观点来描述现实问题,然后用计算机语言来描述并处理该问题。 这种描述和处理是通过类与对象实现的,是对现实问题的高度概括、分类和抽象。 运用面向对象的观点来描述现实问题,首先要对现实世界中的对象进行分类,然后抽象出一类对象的共性并加以描述。,面向对象的分析和设计步骤:P:367,(1)找出类; (2)描述类和类之间的关系; (3)用类来界定抽象层次,从而组织程序结构。 在这当中找出类和描述类和类之间的关系是关键。,找出类,找出类主要靠经验,程序员可由一系列候选类开始,然后,考虑哪一个是最基本的,

2、哪一个是第二位的或者是被引出的。 候选类可从以下各项找出: 1)有形的、可视的或可描述的东西;(如:电视机、微波炉、桌子、问题等) 2)角色;(如:操作电视机的人、桌子上摆放的东西、问题中涉及的链表结构等) 3)事件(如:调节电视机的亮度、桌子的移动、问题中描述的操作等),对于复杂的问题,程序员必须做一个全面深入的分析,并充分了解问题的各项细节,然后对问题进行分类,抽象出要描述的类。 对于简单的问题,通过问题陈述和列出名词表,可以帮助解决问题。,例如:,请用面向对象的程序设计方法来求解Josephus问题。 Josephus问题: 问题描述:一群(n个)小孩围成一圈做游戏,假定一个数m,从第s

3、个小孩起,顺时针方向数,每数到第m个小孩时, 该小孩便离开。小孩不断离开,圈子不断缩小。最后,剩下的一个小孩便是胜利者。 对于一定的n、m和s,究竟胜利者是谁呢?,用环形链表来表示小孩围成圈,每个结点代表一个小孩。 步骤: (1)列出Josephus问题的名词表: 小孩;链表;小孩数;开始位置; 数数间隔;小孩离开;输出胜利者,(2)把类中要用到的数据属性(数据成员)和操作(函数成员)描述清楚。,左面是操作描述,表示类的外部界面;右面是数据属性描述。,(3)设计程序 P:372,Josephus类 界面(函数成员) 构造函数 求获胜者 内部数据成员 小孩数 开始位置 数数间隔 ,BoyRing

4、(环链表)类 界面(函数成员) 构造函数 析构函数 根据数数间隔数小孩 小孩离队(从环链中去掉当前小孩) 返回当前小孩编号 输出所有小孩 内部数据成员 小孩结构数组指针 小孩哨兵指针 当前小孩指针 ,/主函数 创建一个Josephus类对象 调用getWinner求获胜者,算法实现: P:375 Josephus,/ boyring.h #ifndef HEADER_BOYRING #define HEADER_BOYRING struct Boy int code; Boy* next; ;/- class BoyRing Boy *pBegin, *pivot, *pCurrent; pu

5、blic: BoyRing(int n); void countBoy(int m); int getNum() const; void disengage(); void printAll()const; BoyRing(); ;/= #endif / HEADER_BOYRING,/ boyring.cpp #includeboyring.h #include using namespace std; /- BoyRing:BoyRing(int n) if(n2) throw exception(); pBegin = new Boyn; for(int i=1; i=n; i+) pB

6、egini-1.next = /-,void BoyRing:countBoy(int m) for(int i=1; inext; /- int BoyRing:getNum() const return pCurrent-code; /- void BoyRing:disengage() pivot-next = pCurrent-next; pCurrent = pivot; /-,void BoyRing:printAll()const int numinLine = 0; Boy* p = pCurrent; do coutcode; if(!(+numinLine%10) cout

7、next; while(p!=pCurrent); coutn; /- BoyRing:BoyRing() delete pBegin; /-,/ jose.h #ifndef HEADER_JOSE #define HEADER_JOSE class Josephus protected: int n, m, s; public: Josephus(int boys, int interval, int begin=1); void getWinner()const; ;/= #endif / HEADER_JOSE,/ jose.cpp #includeboyring.h #include

8、jose.h #include using namespace std; /- Josephus:Josephus(int boys, int interval, int begin) :n(boys),m(interval),s(begin) if(n=n | s=n) cerrdata error.n; throw exception(); /-,void Josephus:getWinner()const coutThere are n boys.nBoys leaved in order:n; BoyRing x(n); x.countBoy(s-1); for(int i=1,num

9、inLine=0; in; +i) x.countBoy(m); cout x.getNum()(+numinLine%10 ? : n); x.disengage(); coutnthe winner isn x.getNum()n; /-,/ f1102.cpp / Josephus Problem Object-based Solving #includejose.h #include using namespace std; /- int main() coutnms; Josephus(n,m).getWinner(); Josephus(n,m,s).getWinner(); return

温馨提示

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

评论

0/150

提交评论