当前位置:文档之家› 猴子选大王数据结构课程设计报告(内附详细注释)

猴子选大王数据结构课程设计报告(内附详细注释)

1.需求分析
问题定义:一堆猴子都有编号,编号是1,2,3…n,这群猴子(n个)按照1-n的顺序围坐一圈,从第1个开始数,每数到第m个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。

m,n键盘输入,且m<n,输出为大王的猴子的号数。

问题分析:根据任务描述可知,编号是1,2,3…n的一群猴子按照1-n的顺序围坐一圈,因此可以用指针指向数组的方法给数组赋值,输入n值和m值,为保证m<n,用一个while( )语句实现,如果输错,报错,再输入。

用for循环实现猴子编号。

从1开始数到m的猴子出列,即用指针移动查找法将计数器数到m的指针指向的内容变为0,用for循环,直到只有一个元素不为0时,最后不为0的元素的值即为大王。

实现这个程序功能需3个模块,一个模块用数组指针实现猴子编号,一个模块用指针移动查找法实现猴子出局,最后主模块将前两个模块要用到的函数,数组定义。

具体步骤如下:
第一步建立数组,填入猴子编号及猴子出局时报的数
第二步从第一个猴子报数
第三步数到m让指针指向元素变为0
第四步继续报数,重复第三步
2.概要设计(流程图)
break
3.详细设计
#include<stdio.h>
#include<stdlib.h> //使用calloc()函数
void FindKing_pointer(int,int,int*);//移动指针法找大王void Initialize(int,int*);//初始化数组整形和指针型int main()
{
int m,n,*ptr;
printf("输入猴子数与出局时报的数\n");
scanf("%d %d",&n,&m);
while(n<m)
{
printf("输入数据有误,请重新输入!\n");
printf("输入猴子数与出局时报的数\n");
scanf("%d %d",&n,&m);
}
ptr=(int *)calloc(n,sizeof(int));
Initialize(n,ptr);
FindKing_pointer(m,n,ptr);
free(ptr);
return 0;
}
/*
在数组中依次填入1,2,3,4,…
*/
void Initialize(int n,int *ptr)
{
int i;
for(i=0;i<n;i++)
ptr[i]=i+1;
}
/*
循环一次指针向后移一位,所指元素不为0时计数器加1.
移动指针,当计数器数到m时将指针所指元素设为0.
*/
void FindKing_pointer(int m,int n,int *ptr)
{
int i,count,*ptr2;
count=n-1; //count=0时终止循环就是只剩一个猴子时
ptr2=ptr; // 移动ptr2进行查找开始时ptr为多少
//calloc()为指针类型的元素分配内存时,元素被初始化为空指针for(i=0;count!=0;ptr2++)
{
if(ptr2==ptr+n)
ptr2=ptr;
/*指针所指元素不为0时计数器加1.*/
if(*ptr2!=0)
i++;
/*计数器数到m时将指针所指元素设为0*/
if(i==m)
{
*ptr2=i=0;
count--; //用于终止循环
}
}
/*最后不为0的元素的值即为大王的编号*/
for(ptr2=ptr;;ptr2++)
{
if(*ptr2!=0)
{
printf("第%d个猴子是大王\n",*ptr2);
break;
}
}
}
/*思想是猴子围坐一圈,有N个猴子,开始数数,数到第M个猴子,该猴子就出列,
然后再从该猴子的下一个猴子开始数到第M个猴子,直到只剩下一个猴子时。

该猴子就是所要选得大王*/
4.结果分析
5.设计总结
在课程设计中,首先要看清问题,将问题要求理解透彻,在构思要如何实现,要用到哪些函数,要用什么算法,在课程构思中选算法是一个很重要的概念,只有确定用这么算法后才能接下来的工作,将流程图画在纸上,再依次编写代码,在程序设计中,编写代码只是一个方面,调试才是关键。

它是一个相当繁琐的过程,有许多新的问题需要被解决,但同时它也是一个比较重要的过程,因为在程序调试过程中,你会学到很多新的东西,从而增加你编程的经验。

通过本次实习,温固了数据结构的相关知识,加深对课内所学的有关数据的逻辑结构和存储表示、数据结构的选择和应用、算法的设计和时空效率分析等课程基本内容的理解,进一步熟悉了VC++编程环境,巩固并提高了分析问题、解决实际问题的能力。

相关主题