猴子吃桃课程设计.docx
- 文档编号:9401136
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:13
- 大小:67.38KB
猴子吃桃课程设计.docx
《猴子吃桃课程设计.docx》由会员分享,可在线阅读,更多相关《猴子吃桃课程设计.docx(13页珍藏版)》请在冰豆网上搜索。
猴子吃桃课程设计
用C语言解决猴子吃桃子问题
摘要本课程设计主要解决猴子吃桃子的问题。
一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子。
在整个程序中分别采用数组数据结构、链数据结构、递归等结构形式实现此问题的求解。
程序通过调试运行,初步实现了设计目标。
1引言
在日常生活中经常遇到一些与数据计算有关的问题,许多与猴子吃桃问题类似的问题要求用计算机程序语言来解决,用这个程序算法可以解决一些类似问题,以便利于生活实际。
一:
课程设计背景
猴子吃桃问题涉及一个比较有趣的数组,把猴子吃桃的天数倒过来看的话,以天数作为数组的下标i,剩下桃子的个数a[i]的递推公式为a[i]=(a[i-1]+1)*2。
a[i]实际代表了倒数第i天剩下的桃子数。
所以可以求得此数组的通项公式为a[i]=3*pow(2,(i-1))-2(i>=2)
二:
课程设计目的
在这个程序中我们主要是用C语言解决猴子吃桃问题,一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子。
生活中或学术上有很多类似的问题,这个问题看似简单,却可能使很多重大问题的重要组成部分或者是核心。
解决此问题的目的是以便在生活中解决根本性问题,是生活变得更加便利。
三:
课程设计内容
这个程序的内容是以C语言为程序语言载体分别用数组数据结构、链数据结构、递归等结构形式实现此问题的求解。
2需求分析
这个课程设计分为三个部分,即分别用三种不同的方法解决猴子吃桃子问题。
每个部分都有不同的算法思想。
用数组结构实现的算法,通过构造求桃子数的数组,然后输出要求的项来实现。
用链结构实现的算法,则是建立链表,将每天的桃子数目存入链表,然后输出第一天的桃子数。
用递归结构实现的算法,是通过函数本身的特点,反复调用自身,最后找到递归的出口,求得算法的解。
3概要设计
一:
设计思路
C是结构式语言。
结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。
这种结构化方式可使程序层次清晰,便于使用、维护以及调试。
C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
二:
设计方案
如果用数组结构解决这个问题,把猴子吃桃的天数倒过来看的话,以天数作为数组的下标i,剩下桃子的个数a[i]的递推公式为a[i]=(a[i-1]+1)*2。
a[i]实际代表了倒数第i天剩下的桃子数。
所以可以求得此数组的通项公式为a[i]=3*2e(i-1)-2(i>=2)。
如果用链结构解决这个问题,建立一个链表,根据每天桃子数与后一天桃子数的关系n=2*n+2,依次将每天的桃子数存进链表中,最后输出第一天的桃子数。
如果用递归结构解决这个问题,要求利用他们每天都吃当前桃子的一半且再多吃一个这一特点,设计一个递归算法
4详细设计
一:
数组结构
把猴子吃桃的天数倒过来看的话,以天数作为数组的下标i,剩下桃子的个数a[i]的递推公式为a[i]=(a[i-1]+1)*2。
a[i]实际代表了倒数第i天剩下的桃子数。
所以可以求得此数组的通项公式为a[i]=3*pow(2,(i-1))-2(i>=2)。
数组结构算法的流程图如下:
intday,tao[11];//定义数组和下标
tao[0]=0;//tao[0]赋值为0
tao[1]=1;//倒数第一天的桃子数为1
for(day=2;day<=10;day++)
tao[day]=3*pow(2,day-1)-2;//给数组的赋值
printf("最初的桃子数为%d\n",tao[10]);//输出最初的桃子数
system("PAUSE");
二:
链结构
用链结构实现这个算法,其核心是利用链表这种存储结构,将每天的桃子数存储在链表中,在链表中实现数的递推。
首先是建立一个空链表,产生一个头结点,且将头结点的地址赋给L。
然后把每天的桃子数从链表的第一个结点插入链表。
最后第一天的桃子数被最后一个插入链表,成为链表中第一个值,将其赋给e,最后只要输出e即得到第一天的桃子数。
建立单链表的程序代码如下:
voidInitList(LinkList&L)//构造一个空链链表
{
L=(LinkList)malloc(sizeof(LNode));//产生头结点,并使L指向此头结点
if(!
L)exit(OVERFLOW);
L->next=NULL;
}
这个算法中,我运用了单链表,单链表每个结点由数据和指向后驱结点指针两部分构成。
在插入数据时,将插入的位置的前一项的原有后去指针赋给此结点的后去指针,然后把插入结点的data地址赋给前一结点的后驱指针,插入就完成了。
插入结点的程序代码如下:
StatusListInsert(LinkListL,inti,ElemTypee)//在第i个位置之前插入元素e
{
intj=0;//计数器初值为0
LinkLists,p=L;//p指向头结点
while(p&&j { j++; p=p->next; } 三: 递归 设计递归算法,利用x=2*x+2,定义一个函数sum_fan,然后不断调用自身,求得第一天的桃子数。 递归算法的流程图如下: N Y 主要程序代码如下: intsum_fan(intn,inti)//子函数sum_fun,参数n和i接受主函数的参数x和day { if(i>0) { n=sum_fan((n+1)*2,--i);//每一次都用((n+1)*2)的值去调用子函数本身 } returnn;//返回结果 } 四: 运行结果 数组结构的运行结果如下: 数组结构结果 链结构的运行结果如下: 链结构结果 递归结构的运行结果如下: 递归结构结果 5总结 这次的课程设计的内容是用C语言实现猴子吃桃子问题,这对我来说是个很具有挑战性的任务,虽然只做了一个很简单的程序,但通过长时间的设计也从中学到了不少东西,更深刻的理解了课本中的内容。 《数据结构》是一门实践性较强的课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。 在本次课程设计中,我明白了理论与实际相结合的重要性,并提高了自己组织数据及编写程序的能力,培养了基本的程序设计技能。 在这次课程设计中曾遇到了不少问题,就单凭我一个人的能力很难准时有效的完成这次的课程设计,感谢我的同学,他们为我提出了很多有用的建议,帮助我完成了这次的课程设计。 最后也要感谢我们学校为我们提供良好的编程环境,使我们能够按时完成任务。 源程序代码 数组结构代码 #include #include #include #include intpow(intb,intp) {inti,sum; if(p<0) return0; else { for(i=1;i<=p;i++) {if(i==1)sum=b; else sum*=b; } returnsum; } } voidmain() { intday,tao[11];//定义数组和下标 tao[0]=0;//tao[0]赋值为 tao[1]=1;//倒数第一天的桃子数为 for(day=2;day<=10;day++) tao[day]=3*pow(2,day-1)-2;//给数组的赋值 printf("最初的桃子数为%d\n",tao[10]);//输出最初的桃子数 system("PAUSE"); } 链结构代码 #include #include #include #defineTRUE1 #defineFALSE0 #defineERROR0 #defineOVERFLOW0 #defineOK1 #defineNULL0 typedefintStatus; typedefintElemType; structLNode { ElemTypedata; LNode*next; }; typedefLNode*LinkList; voidInitList(LinkList&L)//构造一个空链链表 { L=(LinkList)malloc(sizeof(LNode));//产生头结点,并使L指向此头结点 if(! L)exit(OVERFLOW); L->next=NULL; } StatusGetElem(LinkListL,inti,ElemType&e)//当第i个元素存在的时,将其值赋给e { intj=1;//计数器初值为 LinkListp=L->next;//p指向第一个结点 while(p&&j { j++; p=p->next; } if(! p||j>i) returnERROR; e=p->data; returnOK; } StatusListInsert(LinkListL,inti,ElemType&e)//在第i个位置之前插入元素e { intj=0;//计数器初值为 LinkLists,p=L;//p指向头结点 while(p&&j { j++; p=p->next; } if(! p||j>i-1)return0; s=(LinkList)malloc(sizeof(LNode));//生成新的结点 s->data=e; s->next=p->next;//新结点指向原第i个结点 p->next=s;//原第i-1个结点指向新结点 return1; } voidmain() { LinkListL; inti,e,n; InitList(L);//初始化链表 for(i=1,n=1;i<10;i++) { n=2*n+2;//将每一天的桃子数赋值给n ListInsert(L,1,n);//将n的值输入链表 } GetElem(L,1,e); printf("%d",e);//输出桃子的数目 system("PAUSE"); } 递归结构代码 #include #include #include intsum_fan(intn,inti)//子函数sum_fun,参数n和i接受主函数的参数x和day { if(i>0) { n=sum_fan((n+1)*2,--i);//每一次都用((n+1)*2)的值去调用子函数本身 } returnn;//返回结果 } voidmain() { intsum; intday=9;//实现函数调用的次数 intx=1;//最后一天还剩得一个桃子 sum=sum_fan(x,day);//调用子函数sum_fan,并把返回得结果赋给sum printf("%d",sum); system("PAUSE"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 猴子 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)