来源:远方网络 | 2006-1-6 | (有2101人读过)
由上图可以看出:
面向对象的程序设计是由类组合而成的,有类必然有类的对象,程序之间的交互主要是通过对象与对象之间的关系进行操作的。
由于我们把josephus问题分解成了josephus类和ring类,在主函数中,用户只需要使用josephus类设计其对象明确知道Josephus类的外部接口函数也就是操作该对象的方法initial()就可以了,至于josephus的内部实现又是如何与Ring类进行操作的使用者一概不需要知道,只要拿来用知道接口和接口函数是什么就可以了,这样的程序设计很好的保护了各类成员数据的安全,主函数代码调用极其简单只有建立对象和调用对象方法的操作这两部而已,以后类一旦需要修改,只修改类体本身就可以,而主函数不需要做任何修改,这样就很好的做到了什么人做的事情什么人处理互不冲突。
程序的代码如下,我把工程文件压缩了作为此帖的附件提供下载,希望读者仔细阅读仔细推敲,真正理解面向对象oop编程的特点和意图。
主程序test4.cpp -----------------------------------------------------------
//程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream> #include "josephus.h" using namespace std;
void main() { Josephus a; a.initial(); cin.get(); cin.get(); }
josephus.h -----------------------------------------------------------
//程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者
class Josephus { public: Josephus(int num=10,int interval=1) { Josephus::num=num; Josephus::interval=interval; } void initial(); protected: int num; int interval; };
josephus.cpp ---------------------------------------------------------------
//程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream> #include "josephus.h" #include "ring.h"
using namespace std;
void Josephus::initial() { int num,interval; cout<<"请输入孩子总数:"; cin>>num; if(num<2) { cout<<"孩子总数不能小于2,否则不能构成环链!"; return; } cout<<"请输入抽选号码"; cin>>interval; if(interval<1|interval>num) { cout<<"请输入抽选号码不能小于1或者大于小孩总数!"; return; } Josephus::num=num; Josephus::interval=interval; Ring a(num); a.ShowRing(num); cout<<endl; for(int i=1;i<num;i++) { a.CountInterval(interval); a.ShowWiner_loser(); a.OutChild(); } cout<<endl<<"胜利者是:"; a.ShowWiner_loser(); }
ring.h -------------------------------------------------------------------
//程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者
struct Children { int number; Children *next; };
class Ring { public: Ring(int num) { josephus = new Children[num]; point = josephus; for(int i=1;i<=num;i++) { point->number = i; point->next = josephus + i % num; point=point->next; } point = &josephus[num-1]; } ~Ring() { delete[] josephus; } void ShowRing(int num); void CountInterval(int interval); void OutChild(); void ShowWiner_loser(); protected: Children *josephus; Children *point; Children *cut_point; };
ring.cpp ----------------------------------------------------------------------
//程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream> #include "ring.h"
using namespace std; void Ring::ShowRing(int num) { point=josephus;//也可以写成point=point->next;但前着效率高一点点 for(int i=1;i<=num;i++) { cout<<point->number<<","; point=point->next; } point=&josephus[num-1];//输出过后恢复point应该在的位置 } void Ring::CountInterval(int interval)//数小孩 { for(int i=0;i<interval;i++) { cut_point = point; point = cut_point->next; } } void Ring::OutChild() { cut_point->next = point->next;//将不要节点断离 point=cut_point; } void Ring::ShowWiner_loser() { cout<<point->number<<","; }
|