从面向结构到面向对象-----josephus扩展问题(一)
2005-01-09 13:50
344 查看
今天看了一下josephus问题,突然有点想写些东西的冲动,结合自己的部份思想,于是便写了这几篇帖子。因为有几篇代码有点长,就分开发吧。如果对你有什么帮助的话,本人胜感欣慰。也许你会说,这个问题好多书上都有代码,但本人诣在于用不同的方法写出,让初学者体会一下从面向结构到面向对象的不同之处;同时你也可以看看我写的和一些书中的不同之处。如果你是个大虾,大可一笑了之,或赐教一番。
josephus扩展问题(一):一群小孩围成一个圈,间隔m个数顺时针方向计数,从第一个小孩数起,求一个和几个获胜者。
josephus扩展问题(一):一群小孩围成一个圈,间隔m个数顺时针方向计数,从第一个小孩数起,求一个和几个获胜者。
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //ring.h //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct Node { int code; Node *next; }; class Ring { public: Ring(int n); ~Ring(); void Progress(int m); void PrintNode(); void ClearCode(); void Display(); protected: Node *head; Node *pivot; Node *pCur; }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //ring.cpp //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include <iostream.h> #include <iomanip.h> #include "ring.h" Ring::Ring(int n) { head = new Node ; pCur = head; for (int i=1; i<=n; i++,pCur=pCur->next) { pCur -> code = i; pCur -> next = head + (i % n); // PrintNode();//if you want to look the boy who was you input,you can live out "//" } Display(); pCur = &head[n-1]; } Ring::~Ring() { delete []head; } void Ring::Progress(int m) { for (int i=0; i<m; i++) { pivot = pCur; pCur = pCur -> next; } } void Ring::PrintNode() { static int lineCount; if (((lineCount++) % 10) == 0) cout<<endl; cout << setw(4) << pCur -> code; } void Ring::ClearCode() { pivot->next=pCur->next; pCur=pivot; } void Ring::Display() { Node *pB=pCur; do{ PrintNode(); pCur=pCur->next; }while(pB!=pCur); cout<<endl; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //jose.h //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class Jose { public: Jose(int boys=10, int begin=1, int m=3); void Initial(); void GetWinner(); protected: int numOfBoys; int beginPos; int interval; int wins; }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //Jose.cpp //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include <iostream.h> #include "ring.h" #include "Jose.h" Jose::Jose(int boys , int begin, int m) { if (boys < 1) { cout << "Bad number of boys!/n"; return; } if (begin < 0) { cout << "Bad beginning position!/n"; return; } if ((m<1) || (m>boys)) { cout << "Bad interval number!/n"; return; } numOfBoys = boys; beginPos = begin; interval = m; } void Jose::GetWinner() { Ring x(numOfBoys); x.Progress(beginPos); for (int i=1; i<numOfBoys-wins+1; i++) { x.Progress(interval); //x.PrintNode(); //if you want to look the boy who is out,you can live out "//" x.PrintNode(); x.ClearCode(); } cout<<"/nThe winner is:"; x.Display(); } void Jose::Initial() { int num,begin,m,w; cout<<"Please input the number of boys:" <<endl <<"Beginning position,/n innterbal per count" <<endl <<"number of winners:" <<endl; cin>>num>>begin>>m>>w; if(num<2) { cerr<<"bad number of boys" <<endl; return; } if(begin<0) { cerr<<"bad beginning position." <<endl; return; } if(m<1||m>num) { cerr<<"bda interval number." <<endl; } if(w<1||w>=num) { cerr<<"bad number of winners."; return; } numOfBoys=num; beginPos=begin; interval=m; wins=w; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //main.cpp //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include "Jose.h" void main() { Jose jose; jose.Initial(); jose.GetWinner(); } |
相关文章推荐
- 从面向结构到面向对象-----josephus扩展问题(二)
- 从面向结构到面向对象-----josephus问题(方法一:数组的应用)
- 从面向结构到面向对象-----josephus问题(方法二:结构的应用)
- 从面向结构到面向对象-----josephus问题(方法三:结构化方法的实现)
- 从面向结构到面向对象-----josephus问题(方法四:面向对象的实现)
- 倒油问题详解 (深搜、广搜)(面向过程和面向对象)
- 编程瑕想:面向结构、面向对象、面向线程-->基于类库重用的面向应用软件开发
- 数据结构——Josephus问题顺序表实现
- 面向服务的体系结构扩展Web服务的前景
- 数据结构问题---JOSEPHUS环解法
- 结构之法------从无头单链表中删除节点(扩展问题)
- 马士兵 Java 第5章(1) 分别使用面向对象和面向结构(数组)的设计方法来实现“数三退一”
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为(转)
- 面向对象思想解决的问题以及面向对象的三个特征
- 6 Java基础语法(二维数组,参数传递与数据加密问题)&面向对象(面向对象思想,类与对象及使用,对象内存图解)
- 大话JS面向对象之扩展篇 面向对象与面向过程之间的博弈论(OO Vs 过程)------(一个简单的实例引发的沉思)
- js面向对象练习(二):JS面向对象的思路(canvas)写躁动的小球
- JAVA拆装箱问题到面向对象原理思考
- 八皇后非递归(仅使用一个数组且可扩展为N皇后问题)
- SQL2008不允许保存更改的表结构问题解决方法