1、猴子选大王 课程设计报告目录一、需求分析 21、问题描述: 22、基本要求: 23、需求分析: 2二、概要设计 3三、详细设计 41、循环队列 42、循环链表 53、伪代码 64、具体函数分析及变量分析 7四、调试分析和测试结果 7五、总结 10六、参考文献 11七、附录 12一、需求分析1、问题描述:一堆猴子都有编号,编号是1,2,3 .m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。2、基本要求:输入数据:输入m,n。 m,n 为整数,nnext = q-next;delete q;3
2、、伪代码讨论了上述问题之后,那么接下来就是要来模拟这个过程了。以伪代码的形式进行这个操作:第一步,进行1-n的报数(在这个过程中如果遇到已经出局的猴子,就跳过)。第二步,对第n只猴子进行删除操作(删除或者标记)。第三步,找到下一只将要报数的猴子。第四步,如果只剩下一只猴子就执行第五步操作,不是就跳到第一步继续执行。第五步,输出所求猴子大王的序号。4、具体函数分析及变量分析:main() 主程序,包括输入输出和主要函数的调用。Link_solve() 用链表解决这个问题的方法,具体实现看附录。Array_solve() 用数组解决这个问题的方法,具体实现看附录。m:总猴子数n:报数循环的nans
3、1:用链表得到的答案ans2:用数组得到的答案其他函数中变量在附录中均有介绍。四、调试分析和测试结果对上述程序进行多次数据测试,其结果分别为:当猴子总数为5,每次数2个的方法:当猴子总数是6,每次数4个的方法:当猴子总数为20,每次数7只方法:当猴子总数为11,每次数3只方法:通过对上述数据手工的模拟及测试,发现结果均符合实际过程。五、总结短短一周的课程设计时间很快就过去了,而我所选的“猴子选大王”设计题目也接近尾声。这期间,有对自己学过的知识的一个回顾,也有新的知识的补充。当有自己不懂时就翻阅资料,寻求解答;当有疑问的时候,有成员之间的讨论,老师的指导。经过磕磕碰碰总算完了任务。这是我们一个
4、星期以来的努力成果,同时是这学期学数据结构的总结,是对自己能力的考验。在课程设计的过程当中,是对平时学习的检测,但在真正设计起程序来,很多困难还是意想不到的,这也告诉我,书上的知识是远远不够的,要想学到更多的知识,需要在实践过程中不断的摸索,在摸索中不断提升自己。一周课程设计的时间是过去了,但是,对数据结构的学习似乎才是开始,以后要学习的还很多很多,前面要走的路还很远很远。而我也要整装待发,在摸索中前进,在前进中不断摸索,让自己的路走得更远更长!六、参考文献1、严蔚敏、吴伟民、米宁 . 数据结构题集(C语言版) . 清华大学出版社2、赵逢禹、罗道昆、路玲、杜光耀 . 数据结构与C语言高级程序设
5、计 . 北京航空航天大学出版社3、严蔚敏、吴伟民 . 数据结构(C语言版) . 清华大学出版社.2010年4、谭浩强 .C语言程序设计(第2版). 清华大学出版社.2008年5、梁旭、谷晓琳、黄明.C语言课程设计(第2版).电子工业出版社.2009年6、XX文库 7、XX文库 七、附录详细代码: #includeusing namespace std;int m,n,ans1,ans2;bool *flag;struct Node int num; /存储所在的序号 struct Node *next; /指向下一个节点;/循环链表处理这个问题int Link_solve() Node* he
6、ad=new Node,*p,*q; /head为 头节点,p,q为临时变量。 head-num=1; int i; p=head; for(i=2;inum=i; p-next=q; p=q; p-next=head; /形成环 q=p=head; /开始报数 int t=1;/统计循环报数的次数 while(tm-1) for(i=2;inext; /找到了出局的猴子,并输出。 cout第 t+ 次选到的猴子是: num 号。next=p-next; /删除掉出局的猴子 delete p; /清除空间 p=q-next; coutnum; /返回最后剩下的那只猴子序号 /循环数组处理这个问
7、题 int Array_solve() int i,p=0; int t=1;/统计循环报数的次数 while(tm-1) for(i=1;in;i+) p=(p+1)%m; /形成循环数数 /当碰到已经出局的,跳过 while(flagp) p=(p+1)%m; flagp=1; cout第 t+ 次选到的猴子是: p+1 号。endl; /当碰到已经出局的,跳过,找到下一只没出局的猴子 while(flagp) p=(p+1)%m; /获取剩下的最后的一只猴子序号 while(flagp) p=(p+1)%n; coutendl; return p+1;int main() coutm; /输入猴子数 coutn; /输入循环报数的方式 flag=new boolm; /标记猴子是否出局,出局的是1,没出局的是0 memset(flag,0,sizeof(bool)*m); /初始化猴子全部未出局 cout链表处理:endl; ans1=Link_solve(); /链表处理得到答案 cout按照 m 个猴子,每次数 n 个的方法,大王的猴子是 ans1 号。endl; cout数组处理:endl; ans2=Array_solve(); /数组处理得到答案 cout按照 m 个猴子,每次数 n 个的方法,大王的猴子是 ans2 号。endl; return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1