猴子选大王课程设计报告
猴子选王问题求解和二叉树建立——课程设计报告
《数据结构》课程设计———————猴子选王问题求解和二叉树的建立专业计算机科学与技术班级指导教师编写日期 2012年6月24日目录一、课程设计的目的 (3)二、课程设计的要求 (3)三、相关知识 (3)四、问题的分析 (3)五、数据结构的描述 (4)六、算法的设计 (4)七、代码实现 (6)八、程序运行成功展示 (11)九、心得体会 (14)十、参考资料 (14)一、课程设计的目的课程设计是学生对课程所学知识的综合运用,它与课堂听讲、上机实验、课外练习、自学研究相辅相成,构成一个完整的课程教学体系。
《数据结构》是一门实践性强的课程,其中对算法设计和程序编写的掌握尤为重要。
学生虽然可以通过与课堂教学同步的上机实验完成相关内容的练习,但却往往局限于一些功能简单、彼此之间关系独立的算法和程序。
课程设计是一种综合训练,致力于培养学生全面、灵活的算法设计思想和较高的编程能力,为今后从事计算机开发与应用打下基础。
新世纪需要具有丰富科学知识、独立解决实际问题、有创造能力的新型人才,这也是该课程设计的最终目的。
二、课程设计的要求1、猴子选王问题描述一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
2、二叉树的建立描述已知二叉树T中结点的前序和中序遍历序列,编写算法实现构造满足上述条件的二叉树。
3、界面设计模块问题描述设计一个菜单式界面,让用户可以选择要解决的问题,同时可以退出程序。
界面要求简洁明了,大方得体,便于用户的使用,同时,对于用户的错误选择可以进行有效的处理。
三、相关知识1、猴子选王求解约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的,他参加并记录了公元66—70年犹太人反抗罗马的起义。
约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他和40名死硬的将士在附近的一个洞穴中避难。
猴子选大王上机报告
重庆交通大学信息科学与工程学院综合性设计性实验报告专业:课程名称:《C语言程序设计》题目:数组和链表的操作班级:设计者:学号:指导教师:完成时间:2014年6月16日重庆交通大学信息科学与工程学院综合性设计性实验任务书重庆交通大学信息学院综合性设计性实验评分表数组和链表的操作——猴子选大王程序设计报告一、系统的功能需求及分析功能:一群猴子共有m只,编号为1,2,……m,围坐一圈,从第1号猴子开始依次报数,数到n的猴子退出,然后从退出的下一只猴子继续从1开始报数,依次循环,直到圈内剩下一只猴子为止,该编号的猴子就是所选出的大王。
分析:用数组实现:先对数组进行初始化,然后将报到要删除的那个数字的猴子编号赋值为-1,每赋值一次,猴子数减一,再重新报数。
当猴子数只有一只的时候,输出猴子编号不为-1的那个编号。
用链表实现:先建立一个无头节点的单向循环的链表,然后将报到要删除的那个数字的猴子编号删除,以此循环,直到一个节点的下一个指向自己,最后输出猴子编号。
二、设计说明(一) 用数组实现1、数组的初始化for(i=0;i<m;i++)a[i]=i+1;2、算法流程图及说明(二) 用链表实现1、节点的定义struct monkey{int a;struct monkey *next;}*p,*q,*p1,*q1,*p2;2、链表的建立for (int i=0;i<m;i++){p=(struct monkey *)malloc(sizeof(struct monkey));p->a=i+1;p->next=NULL;if (i==0){head=p;q=head;}else{q->next=p;q=q->next;}}q->next=head;p2=head;p1=head;3、算法流程图及说明三、主要代码(一) 用数组实现#include<stdio.h>void main(){int a[10000];int m,n,x,b,i;printf("请输入猴子的只数:");scanf("%d",&m);printf("请输入要删除的猴子编号:");scanf("%d",&n);for(i=0;i<m;i++)a[i]=i+1;b=m;x=0;for(i=0;b!=1;i++){if(a[i%m+1]!=-1){x++;}if(x==n && a[i%m+1]!=-1){a[i%m+1]=-1;b--;x=0;}}for(i=1;i<=m;i++)if(a[i]!=-1)printf("猴子大王编号为:%d\n",i);}(二) 用链表实现#include <stdio.h>#include <stdlib.h>struct monkey{int a;struct monkey *next;}*p,*q,*p1,*q1,*p2;void main(){struct monkey *head;int m,n;printf("请输入猴子的只数:");scanf("%d",&m);printf("请输入想删除猴子的编号:");scanf("%d",&n);for (int i=0;i<m;i++){p=(struct monkey *)malloc(sizeof(struct monkey));p->a=i+1;p->next=NULL;if (i==0){head=p;q=head;}else{q->next=p;q=q->next;}}q->next=head;p2=head;p1=head;for (i=1;;i++){if (i==n-1){q1=p1->next;p1->next=q1->next;free(q1);i=0;}p1=p1->next;if (p1->next==p1) break;}printf("猴子大王的编号为%d\n",p1->a);}四、系统功能测试功能:一群猴子共有m只,编号为1,2,……m,围坐一圈,从第1号猴子开始依次报数,数到n的猴子退出,然后从退出的下一只猴子继续从1开始报数,依次循环,直到圈内剩下一只猴子为止,该编号的猴子就是所选出的大王。
猴子选大王
一、猴子选大王课题描述一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1到m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
猴子选大王系统设计1、猴子选大王总体设计结构图2、系统数据的数据结构设计猴子的存放采用链式存储结构,利用循环链表来实现建立的,其表示方法是递归定义的.(1)、变量说明程序中使用的存储结构:ListNode结构体Struct ListNode{Int data; //数据域Struct ListNode *nextPtr; //指向后继结点的指针域};Int monkeys,count //分别为猴子的个数和猴子的报数HeadPtr,tailPtr,currentPtr //分别为链表的头结点,尾结点和结点HeadPtr1,headPtr2 //分别为选大王的单循环链表和由淘汰的猴子所构成的链表(2)、函数说明DestroyList (LISTNODEPTR headPtr) //用destroylist函数来释放选大王链表的各个结点CreateList (int n) //创建循环链表,容纳n个猴子Printf(“input the amount of monkeys:”) //用printf函数来提示输入的内容Scanf(“%d”,&monkeys) //用scanf函数来输入猴子的个数Printf(“input the count number:”) //用printf函数来提示报数的数Scanf(“%d”,&count) //用scanf函数来输入每次数到的猴子就出局(3)、while循环说明while(currentPtr1!=currentPtr1->nextPtr){/*往后数一个猴子*/prePtr1=currentPtr1;currentPtr1=currentPtr1->nextPtr;count++;/*若数到n,则淘汰currentPtr指向的猴子*/if(count%n==0){/*从headPtr1指向链表中拆下currentPtr指向的结点*/prePtr1->nextPtr=currentPtr1->nextPtr;currentPtr1->nextPtr=NULL;/*将currentPtr1指向的结点插入到headPtr2指向链表中*/if(headPtr2==NULL){/*若headPtr2指向的为空链表*/headPtr2=currentPtr1;tailPtr2=currentPtr1;}else{ /*将拆下来的结点组装到headPtr2指向的链表上*/ tailPtr2->nextPtr=currentPtr1;tailPtr2=tailPtr2->nextPtr;}currentPtr1=prePtr1; /*currentPtr1指向上一个结点,为下一次数数做准备*/}}二、猴子选大王重点及关键技术分析程序通过循环链表较好的实现了猴子选大王的功能,但是还是有许多值得思考的地方。
猴子选大王课程设计说明书
数学与计算机学院课程设计说明书课程名称: 数据结构课程设计课程代码: 6014389题目: 猴子选大王年级/专业/班: 2010级软件工程2班学生姓名: 蒋童学号:开始时间: 2011 年11 月9 日完成时间: 2011 年12 月30 日课程设计成绩:指导教师签名:年月日数据结构课程设计任务书学院名称:数学与计算机学院课程代码:__ 6014389______ 专业:软件工程年级:2班一、设计题目猴子选大王二、主要内容一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
三、具体要求及应提交的材料要求:使用数组和循环链表等两种以上的存储方式来做输入数据:输入m,n m,n 为整数,n<m输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能用C/C++语言编程实现上述内容,对每个问题写出一个算法实现,并按数学与计算机学院对课程设计说明书规范化要求,写出课程设计说明书,并提交下列材料:1)课程设计说明书打印稿一份2)课程设计说明书电子稿一份;3)源程序电子文档一份。
四、主要技术路线提示可采用数组、链表数据结构实现。
在此基础上用C/C++实现其操作。
五、进度安排按教学计划规定,数据结构课程设计为2周,其进度及时间大致分配如下:六、推荐参考资料[1] 严蔚敏,吴伟民.数据结构.清华大学出版社出版。
[2] 严蔚敏,吴伟民. 数据结构题集(C语言版) .清华大学出版社.2003年5月。
[3] 唐策善,李龙澎.数据结构(作C语言描述) .高等教育出版社.2001年9月[4] 朱战立.数据结构(C++语言描述)(第二版本).高等出版社出版.2004年4月[5] 胡学钢.数据结构(C语言版) .高等教育出版社.2004年8月[6] 徐孝凯等著.数据结构(C语言描述).清华大学出版社.2004指导教师签名日期年月日系主任审核日期年月日目录摘要................................. 错误!未定义书签。
猴子选大王
《数据结构课程设计》报告专业: 计算机班级: 063学号: 14姓名: XXX指导老师: XXX时间: 2008.6.24-2008.7.4成绩:目录题目一编程实现将两个有序的线性进行合并,要求同样的数据元素只出现一次。
(3)题目二猴子选大王。
(6)题目三最少换车数。
(9)题目四航空订票系统。
(14)摘要(题目一):编程实现将两个有序的线性进行合并,要求同样的数据元素只出现一次。
(必做)解题思路由于两个线性表中的元素呈有序排列,在进行合并的时候,依次比较,哪个线性表的元素值小,就先将这个元素复制到新的线性表中,若两个元素相等,则复制一个即可,这样一直到其中的一个线性表结束,然后将剩余的线性表复制到新的线性表中即可。
1。
引言线性表是一个相当活的数据结构,它的长度可根据需要增长或缩短。
即对线性表不仅可以防问,还可以进行插入和删除以及合并2。
需求分析由于两个线性表中的元素呈有序排列,在进行合并的时候,依次比较,哪个线性表的元素值小,就先将这个元素复制到新的线性表中,若两个元素相等,则复制一个即可,这样一直到其中的一个线性表结束,然后将剩余的线性表复制到新的线性表中即可。
3.数据结构设计#include<stdio.h>为包含的库函数4.算法设计void Intilist(int la[10],int M)// 初始化线性表int move ( int a[100],int m) // 对该线性表排序int delem(int la[100],int m) //如果其中有相同的元素,则删除相同的元素5.算法的实现#include<stdio.h>void Intilist(int la[10],int M);int move (int la[100],int M);int delem(int la[100],int M);int M,N;5.2 初始化线性表void Intilist (int L[100],int m){int i;printf ("Please input numbers:\n");for (i=0;i<m;i++)scanf ("%d",&L[i]);printf ("\n");return;5.3 对该线性表排序int move ( int a[100],int m){int i,j,t;for (j=1;j<m;j++)for (i=0;i<m-j;i++)if (a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}m=delem(a,m);printf ("the sorted numbers:\n");for (i=0;i<m;i++)printf ("%d ",a[i]);printf ("\n");return m;}5.4如果其中有相同的元素,则删除相同的元素int delem(int la[100],int m){int i,j;for(i=0;i<m;i++)if(la[i]==la[i+1]){for(j=i;j<m;j++)la[j]=la[j+1];m--;i--;}return m;}5.5 主函数int main (){int la[100], lb[100];int lc[201];int i,j,k;printf("Please input length of la:\n");scanf("%d",&M);Intilist(la,M);M=move (la,M);printf("Please input length of lb:\n"); scanf("%d",&N);Intilist(lb,N);N=move(lb,N);i=j=0;k=0;while ((i<M)&&(j<N))if(la[i]<lb[j]){lc[k]=la[i];k++;i++;}else if (la[i]>lb[j]){lc[k]=lb[j];k++;j++;}else if(la[i]=lb[j]) {lc[k]=la[i];i++;k++;j++;}for(;j<N;j++){lc[k]=lb[j];k++;}for(;i<M;i++){lc[k]=la[i];k++;}for (i=0;i<k;i++)printf ("%d ",lc[i]);printf("\n");return 0;}6.程序运行的结果7.有关技术的讨论通过数组来模拟线性表的插入删除以及排序。
猴子选大王
数据结构课程设计报告题目:猴子选大王院(系):计算机工程学院专业:计算机科学与技术班级:嵌入式109(1)学生:秦姚指导教师:寇海洲孙成富邱军林殷路2010年12月目录一、设计目的 (1)二、设计内容 (1)三、程序设计步骤 (1)四、调试分析 (5)五、测试结果 (5)六、课程设计小结: (6)一、设计目的1、能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。
2、提高程序设计和调试能力。
学生通过上机实习,验证自己设计的算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
3、初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。
4、训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
5、培养根据选题需要选择学习书籍,查阅文献资料的自学能力。
二、设计内容1、系统名称:猴子选大王按照规定的要求,选出最后的一只猴子,为大王。
2、要求:一堆有编号的猴子,编号为1,2,3……m,这群猴子(m个)按照1-m的顺序围坐一圈,从第一开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中剩下最后一只猴子,则该猴子为大王。
三、程序设计步骤1)功能分析说明图:2)采用主要的数据结构类型。
采用了链表的存储方式,属于链接存储结构。
for(i=1;i<n;i++) //建立链表的存储结构{p=(LINK)malloc(sizeof(Monkey));p2->next=p;p2=p;}以下是用于存储结点的结构体的定义:typedef struct monkey{int num;struct monkey *next;} Monkey,*LINK;基本算法:这个算法的主要流程为:从控制台读取猴子的数量和报数的最大数——>对猴子进行编号,并用链表来存储——>让链表中的猴子进行报数,对于报数为m的猴子则从链表中删除——>当链表中只剩下一个报数后则停止这个过程,这最后一个猴子即选出来的大王。
猴子选大王课程设计报告
四、参考文献
1.H M Peitel,P J Deitei.C How to progrom,second Edition.蒋才鹏等译,C程序设计教程,北京:机械工业出版社,2000
2.Herbert Schild著,王曦若,李沛译,ANSIC标准详解,北京:学院出版社,1994
3、程序的设计思想:
(1)问题分析:“猴子选大王”问题是约瑟夫环问题的一个特例。由于本题目的数据元素个数不可知,所以可使用链表来动态的分配内存空间。而该问题又是一个不断的循环问题所以用循环链表来实现。
(2)总体设计:首先生成一个空链表,并给n个结点分配空间,让单链表的表尾指针指向头结点则生成一个带有n个结点的循环单链表。给每只猴子建立顺序的编号。机型筛选,最后剩下1个猴子时停止运行,得到的结点即为猴子选出大王的编号。
7号猴子报:2
8号猴子报:3 8号猴被淘汰
4号猴子报:1
7号猴子报:2
4号猴子报:3 4号猴被淘汰
7号猴子报:1
胜出:7号猴子Press any key to continue
程序初始状态如下图:
下一组数据:m = 21,n = 2;
运行结果如下:
得到了预期结果
6:程序源代码
#include<stdio.h>
北京化工大学北方学院
课程设计报告
课程名称数据结构课程设计
设计题目猴子选大王
专业、班级软件工程0902班
学号090203
姓名
指导教师周建敏
设计时间2012年9月17日—2012年10月14日
2012年10月10日
一、引言(简要说明设计题目的目的、意义、内容、主要任务等)
03 实验报告范例
“猴子选大王”实验报告游戏截图图一:开始游戏图二:猴子队列就绪图三:游戏中,按空格键淘汰猴子图四:选出大王,即最后剩下的一只图五:重新开始一局功能描述本游戏源自典故猴子称大王!1、游戏运行,初试界面出现‘空格开始’的提示。
2、玩家按空格开始游戏,6只猴子排成一列。
3、游戏开始后,用户每按一次空格键,随机从猴子队列中产生一个被淘汰的猴子4、被淘汰的猴子会出局,加入屏幕下方的淘汰者猴子队列中。
5、站在被淘汰猴子后方的选手依次往前移,填补空白6、用户继续按空格淘汰猴子,值到剩下唯一的猴子,就是大王!这样,一局游戏完成。
7、一局游戏完成后,屏幕重新出现“空格开始”的标志,用户按空格可以继续游戏,如此往复。
流程图数据结构1.CSprite* m_Monkeys[6] 用一个CSprite的指针数组来保存猴子精灵2.float m_fLocation[6]; 用一个浮点型数组存储猴子位置(因为6只猴子站成一排,y坐标值是相同的,因此该数组保存6只猴子的x坐标值)。
其中m_Monkeys[i] 对应的位置为 m_fLocation[i]3.m_iNumMokeys 当前备选猴子数量,即截图中上层队列的猴子数4.m_iNumLoseMonkeys 淘汰的猴子数量,即下层队列中的猴子数5.m_iChooseMonkey 本轮淘汰的猴子编号6.m_iMoveMonkey 淘汰猴子后,后面需要移动的猴子数7.m_fDelayTime 猴子向前移动的延迟时间算法描述有六只猴子,存储在m_Monkeys数组中,对应的位置则在m_fLocation中,对应关系为m_Monkeys[i] →m_fLocation[i];游戏状态m_iGameState分为三种状态0,1,2 ,其中0表示游戏结束状态,1表示游戏初始化,2则表示游戏运行状态;0 → 1的转换为“空格开始”,初始化函数为GameInit函数;1 → 2的转换自然发生,即游戏初始化函数后会自动将游戏状态从1置为22 表示游戏运行状态,在该状态,敲击空格可以选出淘汰的猴子2 → 0的转换为当猴子的备选队列中只剩下一只猴子的时候发生,该猴子便是大王了CGameMain::CGameMain()构造函数完成初始化工作1、设置游戏状态为1。
猴子选大王课程设计
猴子选大王课程设计一、课程目标知识目标:1. 学生能够理解故事《猴子选大王》的主要情节,掌握故事中出现的生词和关键句型。
2. 学生能够运用一般现在时和一般过去时描述故事中猴子的行为和动作。
3. 学生了解并掌握故事中所传达的公平、公正和团队合作的重要性。
技能目标:1. 学生能够通过听力训练,提高对英语语音、语调的辨识能力。
2. 学生能够通过角色扮演,锻炼口语表达和沟通能力。
3. 学生能够运用创意思维,编写属于自己的猴子选大王故事。
情感态度价值观目标:1. 学生通过学习故事,培养公平竞争、尊重他人的价值观。
2. 学生在小组合作中,学会倾听、关心和帮助同伴,培养团队协作精神。
3. 学生在课堂活动中,树立自信、勇敢表达自己观点的态度。
分析课程性质、学生特点和教学要求,本课程将目标分解为以下具体学习成果:1. 学生能够复述故事《猴子选大王》的主要情节,正确使用故事中的生词和关键句型进行描述。
2. 学生能够在角色扮演活动中,运用一般现在时和一般过去时表达猴子的行为和动作。
3. 学生能够通过小组合作,编写并表演一个关于猴子选大王的故事,展现公平、公正和团队合作的重要性。
4. 学生在课程学习中,积极参与课堂活动,展示良好的倾听、沟通和协作能力,体现出自信、尊重和关心他人的态度。
二、教学内容本节课以《猴子选大王》故事为主线,结合英语课程标准和学生实际情况,组织以下教学内容:1. 故事导入:通过图片、视频等教学资源,引导学生了解故事背景,激发学生的学习兴趣。
2. 故事学习:详细讲解故事《猴子选大王》的情节,重点讲解生词、关键句型和语法知识点。
- 生词:选举、候选、公平、公正、竞争、团队等。
- 句型:一般现在时、一般过去时的陈述句、疑问句和否定句。
- 语法:比较级、最高级的运用。
3. 角色扮演:学生分组进行角色扮演,运用所学知识进行对话练习,锻炼口语表达能力。
4. 小组合作:以小组为单位,编写一个关于猴子选大王的故事,要求运用所学生词、句型和语法。
数据结构课程设计(附代码)-数据结构设计
上海应用技术学院课程设计报告课程名称《数据结构课程设计》设计题目猴子选大王;建立二叉树;各种排序;有序表的合并;成绩管理系统;院系计算机科学与信息工程专业计算机科学与技术班级姓名学号指导教师日期一.目的与要求1. 巩固和加深对常见数据结构的理解和掌握2. 掌握基于数据结构进行算法设计的基本方法3. 掌握用高级语言实现算法的基本技能4. 掌握书写程序设计说明文档的能力5. 提高运用数据结构知识及高级语言解决非数值实际问题的能力表。
3、输出功能:void print(LinkList *head);通过一个while的循环控制语句,在指针p!=NULL时,完成全部学生记录的显示。
知道不满足循环语句,程序再次回到菜单选择功能界面。
4、删除功能:LinkList *Delete(LinkList *head);按想要删除的学生的学号首先进行查找,通过指针所指向结点的下移来完成,如果找到该记录,则完成前后结点的连接,同时对以查找到的结点进行空间的释放,最后完成对某个学生记录进行删除,并重新存储。
5、插入功能:LinkList *Insert(LinkList *head);输入你想插入的位置,通过指针所指向结点的下移,找到该位置,将该新的学生记录插入到该结点,并对该结点后面的指针下移。
链表长度加一,重新存储。
(5) 程序的输入与输出描述输入:调用LinkList *create()函数,输入学生的姓名、学号、三门功课的成绩;输出:调用void print(LinkList *head)函数,输出学生的记录。
(6) 程序测试主菜单:成绩管理系统的主界面:学生成绩记录的输入:输出学生成绩记录:学生成绩记录的删除(删除学号是1101的学生记录)插入新的学生成绩记录(插入学号为1103的学生记录)(7) 尚未解决的问题或改进方向尚未解决的问题:该成绩管理系统还存在不少缺陷,而且它提供的功能也是有限的,只能实现学生成绩的输入、输出、删除、插入。
猴子选大王问题
这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。
问怎样排法,才能使每次投入大海的都是非教徒。
*问题分析与算法设计约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。
这里给出一种实现方法。
题目中30个人围成一圈,因而启发我们用一个循环的链来表示。
可以使用结构数组来构成一个循环链。
结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在船上。
从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为0,表示该人已被扔下海了。
这样循环计数直到有15个人被扔下海为止。
[编辑本段]约瑟夫问题的一般形式:约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。
最后剩下1号。
假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。
C++代码示例:#include<iostream>usingnamespacestd;voidmain(){intn,m,a[101],k,i,j,num;.n-2,n-1,0,1,2,...k-2并且从k开始报0。
现在我们把他们的编号做一下转换:k-->0k+1-->1k+2-->2......k-2-->n-2k-1-->n-1变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解:例如x是最终的胜利者,那么根据上面这个表把这个x变回去不刚好就是n 个人情况的解吗?!!变回去的公式很简单,相信大家都可以推出来:x'=(x+k)modn 如何知道(n-1)个人报数的问题的解?对,只要知道(n-2)个人的解就行了。
猴子选大王 课程设计报告
目录一、需求分析 (1)1、问题描述: (1)2、基本要求: (1)3、需求分析: (1)二、概要设计 (2)三、详细设计 (3)1、循环队列 (3)2、循环链表 (4)3、伪代码 (5)4、具体函数分析及变量分析 (6)四、调试分析和测试结果 (6)五、总结 (9)六、参考文献 (10)七、附录 (11)一、需求分析1、问题描述:一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
2、基本要求:输入数据:输入m,n。
m,n 为整数,n<m。
输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能。
3、需求分析:①输入数据m,n②计算出最终猴子大王的序号。
③模拟出整个过程。
④找到合适的数据结构处理这个问题。
⑤找到正确的方法解决这个问题。
二、概要设计对题意进行分析后,可以画出整个过程的流程图。
具体流程图:这个问题属于约瑟夫环问题,我们对这个题目进行具体分析:假如现在m=5,n=2,即有5只猴子,按照循环数2的方法,我们演变这个过程:第一次:1 2 3 4 5× 2号出局第二次:1 2 3 4 5×× 4号出局第三次:1 2 3 4 5××× 1号出局第四次:1 2 3 4 5×××× 5号出局最后得到猴子大王的序号是3号。
那么一般化,对于m猴子,n只猴子我们该怎么做?三、详细设计1、循环队列队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。
进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列中没有元素时,称为空队列。
仔细分析整个过程,我发现这个过程和学过的循环队列特别像,在学习循环队列的时候,如果采取数组来存储队列,那么在front端弹出元素就执行front=(front+1)%MAX,在rear端进入队列的时候就执行rear=(rear+1)%MAX,以实现绕圈的操作。
课程设计猴子选大王
猴子选大王1、课程设计目的:(1)有利于基础知识的理解通过对数据结构的学习,学生掌握了一些信息时代生存与发展必需的信息技术基础知识和基本技能,具备了在日常生活与学习中应用信息技术解决问题的基本态度与基本能力。
(2)有利于逻辑思维的锻炼自主创作程序并写出思路及运行报告,能够较熟练地掌握在系统上编辑、编译、连接和运行C程序的方法。
并通过设计一个完整程序,掌握数据结构的算法编写、类C语言算法转换成C程序并上机调试的基本方法。
(3)有利于治学态度的培养。
程序设计中,语句的语法和常量变量的定义都有严格的要求,有时输错一个标点、打错了一个字母,编译就不通过,程序无法正常运行。
因此,程序设计要求人的严谨性,可能要通过几次乃至十多次的反复修改、调试,才能成功,但这种现象会随着学习的深入而慢慢改观。
这当中就有一个严谨治学、一丝不苟的科学精神的培养,又有一个不怕失败、百折不挠品格的锻炼2、课程设计方案论证:2.1课程设计题目及简介:内容:一堆猴子(m个)每一只都有编号,编号为1,2,3,4...m 这群猴子按照1-m的顺序排列从第一个开始数,没数到第N个,该猴子就要离开。
这样一次下来,直到剩下最后一只猴子,则这只猴子为大王。
2.1.1设计说明:本设计通过循环链表建立约瑟夫环。
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
这种方式非常类似于猴子选大王。
由于本题目的数据元素个数不可知,所以可使用链表来动态的分配内存空间。
而该问题又是一个不断的循环问题所以用循环链表来实现。
总体设计:首先生成一个空链表,并给n 个结点分配空间,让单链表的表尾指针指向头结点则生成一个带有n 个结点的循环单链表。
再给每只猴子建立顺序的编号。
现从第一个结点开始报数,依次顺序查找出报数为i 的待出列的结点(猴子)通过p->next = pass->next;。
c猴子选大王的课程设计
c 猴子选大王的课程设计一、课程目标知识目标:1. 学生能理解并掌握猴子选大王问题中的数学原理,包括排序和比较大小。
2. 学生能够运用所学知识解决类似猴子选大王的问题,如排序不同数字或物品。
技能目标:1. 学生培养观察、分析问题的能力,通过小组讨论与合作,提高问题解决技巧。
2. 学生通过实际操作,加强运用逻辑思维和数学方法解决问题的技能。
情感态度价值观目标:1. 学生培养对数学学习的兴趣,增强自信心,认识到数学与日常生活的紧密联系。
2. 学生在小组活动中,学会尊重他人意见,培养团队合作精神和公平竞争的意识。
3. 学生通过猴子选大王的故事,理解公平、公正的价值观,并能够在生活中践行。
课程性质:本课程为数学学科的一节实践活动课,结合二年级学生的认知水平和兴趣特点,设计富有情境性和趣味性的教学内容。
学生特点:二年级学生对数学有好奇心,喜欢通过故事和游戏学习。
他们具备一定的观察、比较和逻辑思维能力,但需要进一步培养和提高。
教学要求:教师需以学生为主体,关注个体差异,采用情境教学法和合作学习法,激发学生兴趣,引导他们主动参与。
同时,注重培养学生的逻辑思维和问题解决能力,将情感态度价值观的培养贯穿于教学过程中。
通过具体的学习成果评估,确保学生达到预设的课程目标。
二、教学内容本节教学内容以《数学》二年级教材中“比较大小”章节为基础,结合“猴子选大王”的故事情境,组织以下教学活动:1. 引入:通过讲述“猴子选大王”的故事,激发学生兴趣,引导学生关注故事中的数学问题。
2. 新课导入:a. 教学内容:比较大小,理解数字顺序。
b. 教学方法:采用直观演示、小组讨论等形式,让学生掌握比较大小的方法。
3. 教学主体:a. 教学内容:猴子选大王问题,运用比较大小的方法进行排序。
b. 教学方法:分组合作,让学生在活动中体验数学原理,培养问题解决能力。
4. 巩固练习:a. 教学内容:设计不同难度的练习题,让学生巩固比较大小的方法。
猴子选大王
云南大学物理实验教学中心实验报告课程名称:计算机软件技术基础实验项目:线性链表的应用(猴子选大王)学生姓名:吴莹盈学号:20101050040物理科学技术学院物理系2010 级电子科学与技术专业指导教师:马琳实验时间:2012 年12 月 1 日至12 月15 日实验地点:力行楼4202实验类型:教学(演示□验证□综合□设计□)学生科研□课外开放□测试□其它□云南大学物理实验教学中心实验预习报告一.实验名称:线性链表的应用(猴子选大王)二.实验目的:在实习三的基础上,用线性链表解决一个应用问题。
三.实验所需解决问题:问题:约瑟夫问题(Joseph)的求解。
问题描述:n只猴子要选大王,选举方法是:所有猴子按1、2、3、……、n编号顺时针方向围坐一圈,从第1号开始按1、2、3、……、m报数,凡报到m号的退出圈外,如此循环报数,直到圈内剩下一只猴子时,这只猴子就是大王。
试设计一个C程序,输出猴子出列顺序。
基本要求:利用单循环链表存储结构模拟此过程,n和m值由键盘输入,按照出列的顺序打印各个猴子的编号。
四.实验程序设计:#include <iostream>#include <string>#include <iomanip>using namespace std;struct monkey{ int num;int d;monkey *head;monkey *next;};class linked_CList //定义循环链表类{private:monkey *head;monkey *tail;public:linked_CList(); //建立循环链表int del_linked_CList(int); //删除选中的猴子int sel_linked_CList(int);};linked_CList::linked_CList() //建立空循环链表{monkey *p;p=new monkey;p->d=0;p->next=p;head=p;return;}int linked_CList::del_linked_CList(int nn) //删除选中的猴子{ int i;monkey *p,*q; //声明monkey结构指针p,qp=new monkey;p->num=1;p->next=NULL;head=p;q=p;for(i=2;i<=nn;i=i+1){ p=new monkey;p->num=i;q->next=p;q=p;p->next=NULL; }tail=q;tail->next=head;return nn;}int linked_CList::sel_linked_CList(int mm) // mm表示结点删除间隔{ int x=0;monkey *p,*q;q=tail;do{ p=q->next;x=x+1;if(x%mm==0) //x是否整除mm{ cout<<"被删除的猴子号为"<<p->num<<"号\n";q->next=p->next; //删除此结点delete p;p=NULL;}elseq=p; //q指向相邻的下一个结点p}while(q!=q->next); //剩余结点数不为1,则继续循环head=q; //head指向结点q,q为链表中剩余的一个结点cout<<"猴王是"<<head->num<<"号\n"; //输出猴王return mm;}//////////////////////////////////////////////////////////////////////////////////////////主函数int main(){ int mx;linked_CList s;label1:while(1){ cout<<"0.退出程序"<<endl;cout<<"1.猴子选大王"<<endl;cout<<"请输入0—1:";cin>>mx;switch(mx){ case 1:int n,m;monkey *head;head=NULL;cout<<"请输入猴子的总数\n";cin>>n;cout<<"请输入间隔\n";cin>>m;s.del_linked_CList(n);s.sel_linked_CList(m);delete head; //删除循环中最后一个结点break;return 0;case 0:cout<<"安全退出程序";return 0;}}}五.实验步骤:1.根据线性链表的特性和实验三的步骤,将猴子选大王这个程序的基本步骤,即整体结构先编译完成2.逐步细化,编译各个函数。
中大班表演游戏动物王国选大王教案
中大班表演游戏动物王国选大王教案第一篇:中大班表演游戏动物王国选大王教案2013级学前教育专业《幼儿园活动设计与组织》课程作业单游戏设计方案设计者:陈钰婕熊莉粟润王雅婧刘梦洁游戏名称:动物王国选大王适宜年龄:5~6岁游戏类别:表演游戏游戏玩法:按故事情节表演游戏;轮流表演不同角色游戏规则:按照故事情节及动物的出场顺序,开展表演;在其他幼儿表演时,安静认真的观看,不随意打断;在表演结束后,分享自己的经验、感受。
游戏道具:狮子、老鼠、小猫、小白兔、牛、狐狸、小鸭子、小羊、小鸟等动物的头饰教育意义:让幼儿在表演中加强对故事的理解,表演出不同动物的不同特征,认识秩序的重要性;在表演中提高幼儿的合作意识,学会和同伴协商,轮流扮演不同角色;鼓励幼儿思考如何更好地设计和布置表演场地,学会正确使用和替代游戏材料;增强幼儿爱护游戏材料的意识,学会收拾和整理游戏材料。
第二篇:大班表演游戏学期目标1、根据自己对文学作品的理解,激发幼儿积极的参加游戏表演。
2、通过参与表演游戏活动和扮演角色,加深对文学作品的理解,并激发幼儿对文学作品的兴趣。
3、让幼儿主动参与表演游戏活动,在语言、动作、情节表演上增色或更生动,从而提高幼儿的想象力、创造力和表演能力。
4、让幼儿学会与同伴协商分配角色,协调配合,合作游戏,正确处理游戏中的纠纷,提高幼儿解决问题的能力。
5、会用连贯的语言(包括体态语言)进行表演6、培养幼儿处理事物的正确态度和良好的学习品质。
7、让幼儿学会正确使用自制和替代的游戏材料。
8、学会有调理地归类收拾玩具、整理场地9月份游戏主题:《金鸡冠的公鸡》一、活动目标1、通过对作品的理解,能在角色对话、动作、表情等方面有所创新,积极地参与表演。
2、能正确处理游戏中的纠纷,会较正确地评价自己和别人。
二、活动准备:头饰:公鸡、画眉鸟、猫、小蝌蚪、青蛙、鸭妈妈、小鸭、大鱼、鹅、乌龟道具:荷叶、房子、六弦琴,池塘。
知识经验准备:幼儿已能复述故事四游戏指导:第一次指导:1、教师出示头饰:“上次老师给你们讲了《金鸡冠的公鸡》,你们还记得里面有哪些人物吗?讲了哪些对话?”请幼儿一起来复习故事里的对话。
数据结构课程设计报告猴子选大王
数据结构课程设计报告题目:猴子选大王——采用循环链表及动态存储的实现班级:计算机082班姓名:指导教师:成绩:信息工程学院2010年01 月20 日目录课程设计摘要(题目) (03)1.引言 (03)2.需求分析 (04)2.1问题分析 (04)2.2总体设计 (05)3.概要设计 (07)3.1模块分析 (07)3.1.1链表循环输入删除输出 (07)3.1.2各个函数之间的调用关系 (09)3.2函数的流程分析 (10)4.详细设计 (12)4.1函数设计 (12)4.2程序源代码 (13)5.测试结果 (16)6.设计体会 (18)7.结束语 (19)参考文献 (20)摘要(题目):猴子选大王任务:一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m 个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
要求:输入数据:输入m,n ;m,n 为整数(n<m)输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能1.引言随着计算机科学的迅速发展,计算机已深入到揉合社会的各个领域,它的应用已不再局限于科学计算,以解决一些数学问题,而且可以解决一些抽象化的具体问题,更多地用于控制,管理及数据处理等非数值计算的处理工作,这便为我们的日常生活提供了很多的方便,譬如说火车、飞机售票系统,学生成绩管理,商品管理系统,医院选址等实际问题。
如今程序设计的语言很多,有发展比较完善高级语言,也有最基本的低级语言,然而再好的程序设计也要有一个比较清晰的思路——算法。
为了编写好一个好程序,必须分析待处理对象的特性以及各处理对象之间的关系,于是数据结构便成为我们绝佳的选择。
数据结构是计算机程序设计的重要理论技术基础,它不仅是计算机科学的核心课程,而且已成为其他理工专业的热门选修课。
猴子选大王问题
这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。
问怎样排法,才能使每次投入大海的都是非教徒。
*问题分析与算法设计约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。
这里给出一种实现方法。
题目中30个人围成一圈,因而启发我们用一个循环的链来表示。
可以使用结构数组来构成一个循环链。
结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在船上。
从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为0,表示该人已被扔下海了。
这样循环计数直到有15个人被扔下海为止。
[编辑本段] 约瑟夫问题的一般形式:约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。
最后剩下1号。
假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。
C++代码示例: #i n c l u d e<i o s t r e a m>u s i n g n a m e s p a c e s t d;v o i d m a i n(){i n t n,m,a[101],k,i,j,n u m;.n-2,n-1,0,1,2,...k-2并且从k开始报0。
现在我们把他们的编号做一下转换:k-->0 k+1--> 1k+2--> 2......k-2-->n- 2k-1-->n- 1 变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解:例如x是最终的胜利者,那么根据上面这个表把这个x变回去不刚好就是n个人情况的解吗?!!变回去的公式很简单,相信大家都可以推出来:x'=(x+k)m o d n 如何知道(n-1)个人报数的问题的解?对,只要知道(n-2)个人的解就行了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告课程设计题目:猴子选大王****:**专业:软件工程班级:1321813学号:****************:***2015年1 月9 日东华理工大学目录一:需求分析1.问题描述2.基本要求3.需求分析二:概念设计三:详细设计四:调试分析和测试结果五:总结六:源代码一:需求分析1.问题描述一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m 的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
2.基本要求输入数据:输入m,n m,n 为整数,n<m。
输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能。
3.需求分析1.输入数据m,n。
2.计算出最终猴子大王的序号。
3.模拟出整个过程4.找到合适的数据结构处理这个问题。
5.找到正确的方法解决这个问题。
二:概念设计这个问题属于约瑟夫环问题,根据问题描述得知,该问题中m个猴子围坐在一群形成首尾相接的环,因此可用循环链表解决。
从第n个猴子开始出列相当于从链表中删除一个节点。
该程序主要有三个模块组成,建立循环链表,报数利用循环链表实现猴子的出列,最终剩下的猴子即猴王。
具体步骤如下:第一步首先创建循环链表。
第二步向链表中填入猴子的编号。
第三步找第一个开始报数的猴子。
第四步数到n让这个猴子出列。
第五步接着开始报数,重复第四步,直到剩下最后一个猴子,就是大王。
是三:详细设计1.程序中使用的存储结构struct L{int num;struct L *next;};int n;int i=0;2.程序中使用的循环结构struct L *LisDelete(struct L *head,int m)//报数为m的退出.{struct L *p,*q;int j=0;p=head;i=i+1;if(p->next==head) return(p);while(j<m-2){p=p->next;j=j+1;}q=p->next;p->next=q->next;head=p->next;printf("%d 第%d个猴子离开.\n",i,q->num);free(q);LisDelete(head,m);}3.主函数void main(){struct L *head;struct L *p;int m,N;printf("********************************************************* \n");printf("猴子选大王:\n");printf(" 一堆猴子都有编号,编号1,2,3...m,这群猴子(m个)按照1-m\n");printf("的顺序围坐一圈,从第1开始数,每数到第n(n<m)个,该猴子就要\n");printf("离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该\n");printf("猴子为大王\n");printf("********************************************************* \n");printf(" 输入n(所有猴子的总数):");scanf("%d",&N);printf(" 输入m(离开的猴子所报的数):");scanf("%d",&m);printf("***********************************\n");if (m>N||m<=0||N<=0){ERROR();}else{if(m==1){printf("结果:第%d个猴子为大王.\n",N);}else{head=creat(N);printf(" 过程:\n");p=LisDelete(head,m);printf("***********************************\n");printf("结果:第%d个猴子为大王.\n",p->num);printf("***********************************\n");}}}四:调试分析和测试结果得到了预期的结果五:总结本次课程设计,参考了相关教科书和参考书对二分法查找与各种排序方法的描述,对相关功能所需结构体和函数有了初步构思之后,经过代码的输入、语法改错,调试执行等过程,完成了一个简单的功能系统。
通过一周时间,从初步思路形成到基本功能完成,对数据结构设计实践与应用部分基本了解了。
从本次课程设计我觉得我应该把所学基础知识与具体问题实践结合,基本知识要扎实,对待问题要各方面分析。
数据结构与算法设计是一种锻炼人清晰思路的科目,我们应该通过多次实践让自己的知识得到巩固。
六:源代码#include <stdio.h>#include <malloc.h>#define NULL 0#define LEN sizeof(struct L)struct L{int num;struct L *next;};int n;int i=0;struct L *creat(int N)//建立动态循环链表.{printf("将猴子顺序编号为:\n");struct L *head;struct L *p1,*p2;n=0;p1=p2=(struct L *)malloc(LEN);p1->num=1;printf("%d ",p1->num);head=NULL;while(p1->num<=N){n=n+1;if(n==1) head=p1;else p2->next=p1;p2=p1;p1=(struct L *)malloc(LEN);p1->num=n+1;if(p1->num<=N)printf("%d ",p1->num);}p2->next=head;//尾指针指向头指针.printf("\n");printf("***********************************\n");printf("\n");return(head);}struct L *LisDelete(struct L *head,int m)//报数为m的退出.{struct L *p,*q;int j=0;p=head;i=i+1;if(p->next==head) return(p);while(j<m-2){p=p->next;j=j+1;}q=p->next;p->next=q->next;head=p->next;printf("%d 第%d个猴子离开.\n",i,q->num);free(q);LisDelete(head,m);}ERROR(){printf("m>N或者m<=0或者N<=0 ERROR!\n");}void main(){struct L *head;struct L *p;int m,N;printf("********************************************************* \n");printf("猴子选大王:\n");printf(" 一堆猴子都有编号,编号1,2,3...m,这群猴子(m个)按照1-m\n");printf("的顺序围坐一圈,从第1开始数,每数到第n(n<m)个,该猴子就要\n");printf("离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该\n");printf("猴子为大王\n");printf("********************************************************* \n");printf(" 输入n(所有猴子的总数):");scanf("%d",&N);printf(" 输入m(离开的猴子所报的数):");scanf("%d",&m);printf("***********************************\n");if (m>N||m<=0||N<=0){ERROR();}else{if(m==1){printf("结果:第%d个猴子为大王.\n",N);}else{head=creat(N);printf(" 过程:\n");p=LisDelete(head,m);printf("***********************************\n");printf("结果:第%d个猴子为大王.\n",p->num);printf("***********************************\n");}}}。