ring.h 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 #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<<","; } 程序中需要注意的小地方是在这里 class Josephus { public: Josephus(int num=10,int interval=1) { Josephus::num=num; Josephus::interval=interval; } void initial(); protected: int num; int interval; }; 代码中的 Josephus::num=num; Josephus::interval=interval; 使用域区分符的目的就是为了区分成员变量和局部变量Josephus(int num=10,int interval=1)
相信读者认真读完程序认真理解后应该就可以理解面向对象程序设计的用意和好处了,切记认真推敲!
大家看到面向对象程序设计的解决办法,可能觉得它的代码太多了,会怀疑它执行的效率是否足够好,呵呵!
这里只能这么说,程序的效率不是单单看程序的长短来看的,优秀的程序应该是便于维护,关系清楚的,面向对象的程序设计其实和过程式或者是结构化程序设计的思路是不冲突的,在不同的地方使用不同的方法,优势互补才是正道!
|