猴子吃桃课程设计Word格式.docx
- 文档编号:22537193
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:13
- 大小:67.38KB
猴子吃桃课程设计Word格式.docx
《猴子吃桃课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《猴子吃桃课程设计Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
这个程序的内容是以C语言为程序语言载体分别用数组数据结构、链数据结构、递归等结构形式实现此问题的求解。
2需求分析
这个课程设计分为三个部分,即分别用三种不同的方法解决猴子吃桃子问题。
每个部分都有不同的算法思想。
用数组结构实现的算法,通过构造求桃子数的数组,然后输出要求的项来实现。
用链结构实现的算法,则是建立链表,将每天的桃子数目存入链表,然后输出第一天的桃子数。
用递归结构实现的算法,是通过函数本身的特点,反复调用自身,最后找到递归的出口,求得算法的解。
3概要设计
设计思路
C是结构式语言。
结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。
这种结构化方式可使程序层次清晰,便于使用、维护以及调试。
C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
设计方案
如果用数组结构解决这个问题,把猴子吃桃的天数倒过来看的话,以天数作为数组的下标i,剩下桃子的个数a[i]的递推公式为a[i]=(a[i-1]+1)*2。
所以可以求得此数组的通项公式为a[i]=3*2e(i-1)-2(i>
=2)。
如果用链结构解决这个问题,建立一个链表,根据每天桃子数与后一天桃子数的关系n=2*n+2,依次将每天的桃子数存进链表中,最后输出第一天的桃子数。
如果用递归结构解决这个问题,要求利用他们每天都吃当前桃子的一半且再多吃一个这一特点,设计一个递归算法
4详细设计
数组结构
把猴子吃桃的天数倒过来看的话,以天数作为数组的下标i,剩下桃子的个数a[i]的递推公式为a[i]=(a[i-1]+1)*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<
i-1)//寻找第i个结点
{
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<
stdafx.h>
#include<
stdio.h>
math.h>
#include<
stdlib.h>
intpow(intb,intp)
{inti,sum;
if(p<
return0;
else
{
for(i=1;
i<
=p;
i++)
{if(i==1)sum=b;
sum*=b;
}
returnsum;
}
voidmain()
//tao[0]赋值为
//倒数第一天的桃子数为
tao[day]=3*pow(2,day-1)-2;
链结构代码
#defineTRUE1
#defineFALSE0
#defineERROR0
#defineOVERFLOW0
#defineOK1
#defineNULL0
typedefintStatus;
typedefintElemType;
structLNode
ElemTypedata;
LNode*next;
};
typedefLNode*LinkList;
StatusGetElem(LinkListL,inti,ElemType&
e)//当第i个元素存在的时,将其值赋给e
intj=1;
//计数器初值为
LinkListp=L->
//p指向第一个结点
i)//顺指针向后查找,直到找到p指向第i个结点
p=p->
p||j>
i)
returnERROR;
e=p->
data;
returnOK;
StatusListInsert(LinkListL,inti,ElemType&
e)//在第i个位置之前插入元素e
i-1)return0;
s=(LinkList)malloc(sizeof(LNode));
//生成新的结点
s->
data=e;
next=p->
//新结点指向原第i个结点
p->
next=s;
//原第i-1个结点指向新结点
return1;
LinkListL;
inti,e,n;
InitList(L);
//初始化链表
for(i=1,n=1;
10;
i++)
{
n=2*n+2;
//将每一天的桃子数赋值给n
ListInsert(L,1,n);
//将n的值输入链表
GetElem(L,1,e);
%d"
e);
//输出桃子的数目
递归结构代码
intsum_fan(intn,inti)//子函数sum_fun,参数n和i接受主函数的参数x和day
if(i>
n=sum_fan((n+1)*2,--i);
returnn;
intsum;
intday=9;
//实现函数调用的次数
intx=1;
//最后一天还剩得一个桃子
sum=sum_fan(x,day);
//调用子函数sum_fan,并把返回得结果赋给sum
printf("
sum);
system("
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 猴子 课程设计