面向对象程序设计实例.ppt
吕俊白第十章面向对象程序设计实例所谓面向对象的程序设计方法就是运用面向对象的观点来描述现实问题,然后用计算机语言来描述并处理该问题。1这种描述和处理是通过类与对象实现的,是对现实问题的高度概括、分类和抽象。2运用面向对象的观点来描述现实问题,首先要对现实世界中的对象进行分类,然后抽象出一类对象的共性并加以描述。3面向对象的分析和设计步骤:P:367找出类;01描述类和类之间的关系;01用类来界定抽象层次,从而组织程序结构。在这当中找出类和描述类和类之间的关系是关键。01找出类主要靠经验,程序员可由一系列候选类开始,然后,考虑哪一个是最基本的,哪一个是第二位的或者是被引出的。候选类可从以下各项找出:有形的、可视的或可描述的东西;(如:电视机、微波炉、桌子、问题等)角色;(如:操作电视机的人、桌子上摆放的东西、问题中涉及的链表结构等)事件(如:调节电视机的亮度、桌子的移动、问题中描述的操作等)对于复杂的问题,程序员必须做一个全面深入的分析,并充分了解问题的各项细节,然后对问题进行分类,抽象出要描述的类。1对于简单的问题,通过问题陈述和列出名词表,可以帮助解决问题。2例如:请用面向对象的程序设计方法来求解Josephus问题。Josephus问题:问题描述:一群(n个)小孩围成一圈做游戏,假定一个数m,从第s个小孩起,顺时针方向数,每数到第m个小孩时,该小孩便离开。小孩不断离开,圈子不断缩小。最后,剩下的一个小孩便是胜利者。对于一定的n、m和s,究竟胜利者是谁呢?01用环形链表来表示小孩围成圈,每个结点代表一个小孩。02步骤:03列出Josephus问题的名词表:04小孩;链表;小孩数;开始位置;05数数间隔;小孩离开;输出胜利者……左面是操作描述,表示类的外部界面;右面是数据属性描述。Josephus类{界面(函数成员)构造函数求获胜者内部数据成员小孩数开始位置数数间隔}BoyRing(环链表)类{界面(函数成员)构造函数析构函数根据数数间隔数小孩小孩离队(从环链中去掉当前小孩)返回当前小孩编号输出所有小孩内部数据成员小孩结构数组指针小孩哨兵指针当前小孩指针}//主函数创建一个Josephus类对象调用getWinner求获胜者算法实现:P:375Josephus//boyring.h#ifndefHEADER_BOYRING#defineHEADER_BOYRINGstructBoy{intcode;Boy*next;};//-----------------------------------classBoyRing{Boy*pBegin,*pivot,*pCurrent;public:BoyRing(intn);voidcountBoy(intm);intgetNum()const;voiddisengage();voidprintAll()const;~BoyRing();};//=====================#endif//HEADER_BOYRING//boyring.cpp#includeboyring.h#includeiostreamusingnamespacestd;//-------------------------------------BoyRing::BoyRing(intn){if(n2)throwexception();pBegin=newBoy[n];for(inti=1;i=n;i++){pBegin[i-1].next=pBegin[i%n];pBegin[i-1].code=i;}pivot=pCurrent=pBegin[n-1];}//------------------------------------voidBoyRing::countBoy(intm){for(inti=1;i=m;++i){pivot=pCurrent;pCurrent=pCurrent-next;}}//------------------------------------intBoyRing::getNum()const{returnpCurrent-code;}//----