数据结构大作业 猴子吃桃问题Word文件下载.docx
- 文档编号:19486402
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:18
- 大小:172.12KB
数据结构大作业 猴子吃桃问题Word文件下载.docx
《数据结构大作业 猴子吃桃问题Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构大作业 猴子吃桃问题Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
2014年06月01日
任务完成日期:
2014年06月15日
学生(签名):
摘要:
数据结构是一门结合C++知识的重要课程,因此我们要学会用平时课本的知识运用到我们的现实生活当中,这样才能让我们所学的知识更加深刻。
分析了猴子吃桃子问题的实质,得到了其数学模型ni-1=2*(ni+1)(0
,接下来就是其需求分析和概要设计,大致的制定出其实现方案以及其系统结构,然后就是利用掌握的语言C/C++编程实现这一生活问题,该软件用了几种不同的方法解答出了所需要的答案。
猴子吃桃的问题就是一个例子,我们可以运用简单的四种解法进行解题,即数组求值解法,链表求值解法,递归求值解法和队列求值法,通过分析四种解法,根据各种解法的功能,从而我们得到最合适的求法。
关键词:
猴子吃桃子;
数组法;
链表法;
递归法;
队列法;
分析
目录
1设计背景1
1.1问题描述1
1.2基本要求1
1.3开发及运行平台1
2.设计方案2
2.1题目分析2
2.2需求分析规格2
2.2.1数据求解法分析3
2.2.2链表求解法分析3
2.2.3递归法分析4
2.2.4队列法分析...4
2.3数据流程图.....................................................................................................................................4
2.4系统结构图5
3方案实施5
3.1数据类型定义...................................................................................................................................5
3.2主要模块设计..................................................................................................................................5
3.2.1模块1——数组求解模块5
3.2.2模块2——链表求解模块6
3.2.3模块3——递归求解模块7
3.2.4模块4——队列求解模块8
3.3源程序.................................................................................................................................................8
4结果与结论13
4.1调试分析..........................................................................................................................................13
4.2程序运行结果..................................................................................................................................13
4.3结论....................................................................................................................................................14
5.参考文献15
1.设计背景
1.1问题描述
有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子。
1.2基本要求
(1)采用数组数据结构实现上述求解
(2)采用链式数据结构实现上述求解
(3)采用递归实现上述求解
(4)采用队列实现上述求解
1.3开发及运行平台
在本课程设计中,系统开发平台为Windows2000,程序设计语言为VisualC++6.0,程序的运行环境为VisualC++6.0。
VisualC++一般分为三个版本:
学习版、专业版和企业版,不同的版本适合于不同类型的应用开发。
实验中可以使用这三个版本的任意一种,在本课程设计中,以VisualC++6.0为编程环境。
MicrosoftVisualC++6.0是Microsof公司的MicrosoftVisualStudio6.0开发工具箱中的一个C++程序开发包。
VisualC++包中除包括C++编译器外,还包括所有的库、例子和为创建Windows应用程序所需要的文档。
自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。
VisualC++从最早期的1.0版本,发展到最新的7.0版本,VisualC++已经有了很大的变化,在界面、功能、库支持方面都有许多的增强。
最新的7.0版本在编译器、MFC类库、编辑器以及联机帮助系统等方面都比以前的版本做了较大改进。
VisualC++6.0是Microsoft公司推出的目前使用最广泛的基于Windows平台的可视化编程环境。
VisualC++6.0是在以往版本不断更新的基础上形成的,由于其功能强大,灵活性好,完全课扩展以及具有强大的Internet支持,因而在各种C++语言开发工具中脱颖而出,成为目前最为流行的C++语言集成开发环境。
虽然微软公司推出了Visual
C++.NET(Visual
C++7.0),但它的应用的很大的局限性,只适用于Windows
2000,Windows
XP和Windows
NT4.0。
所以实际中,更多的是以VisualC++6.0为平台。
VisualC++6.0是Microsoft公司推出的目前使用最广泛的基于Windows平台的可视化编程环境。
Visual
C++
6.0是在以往版本不断更新的基础上形成的,由于其功能强大,灵活性好,完全课扩展以及具有强大的Internet支持,因而在各种C++语言开发工具中脱颖而出,成为目前最为流行的C++语言集成开发环境。
VisualC++6.0秉承Visual
C++以前版本的优异特性,为用户提供了一套良好的可视化开发环境:
主要包括文本编辑器、资源编辑器、工程创建工具、Debugger调试器等等。
用户可以在集成开发环境中创建工程、打开工程、建立、打开和编辑文件、编译、链接、运行、调试应用程序。
2.设计方案
2.1题目分析
根据题目要求,设猴子共摘的桃子个数为n即是第一天桃子的个数n1,第第二天时桃子个数n2,第三天时桃子个数n3,第四天时桃子个数n4,第五天时桃子个数n5,第六天时桃子个数n6,第七天时桃子个数n7,第八天时桃子个数n8,第九天时桃子个数n9,第十天时桃子个数n10。
由题中“每天都吃当前桃子的一半且再多吃一个”很容易知道n10=1,n9-(n9/2+1)=n10,n8-(n8/2+1)=n9……依
次推出公式:
ni-1-(ni-1/2+1)=ni(0
。
即ni-1=2*(ni+1)(0
2.2需求分析规格
由上述描述及分析可知,该系统所要做的工作就是计算出原来这群猴子共摘了多少个桃子。
通过分析不同的解法,找到每种解法的优劣,得到最合适的求解方法。
由问题描述可知,该系统运行时,不需要手动输入任何数据,因此就没有输入的测试数据,只有输出的测试数据,且输出数据的形式是输出每天剩下的桃子数,最后输出这群猴子总共摘了多少桃子。
2.2.1数组求解法分析
分析:
声明一个长度为10的整形数组a[10],分别存放各天猴子吃前的桃子数。
下图1所示:
n1
n2
n3
n4
n5
n6
n7
n8
n9
n10
a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a
图2.2.1数组元素分布图
先将a[9]赋值为1,用一个循环语句
for(inti=8;
i>
=0;
i--)
a[i]=2*(a[i+1]+1);
为其余各数组元素赋值,则数组元素a[0]的值便是该问题解。
数据类型定义:
inta[10];
a[9]=1;
2.2.2链表求解法分析
建立单链表,声明一个类用来对链表的结点指针进行定义,在初始化函数中利用头插法创建具有10个元素的链表,并依次安公式ni-1=2*(ni+1)(0
赋值得到一个如图2所示的链表。
图2.2.2链表结点逻辑结构图
数据类型定义:
classlist
{
public:
intdata;
classlist*next;
voidpush();
};
typedefclasslistnode;
//建立单链表(将class重定义为node)
typedefnode*link;
//定义结点指针
2.2.3递归法分析
利用一个递归函数来进行求值:
依据返回值来记录每一天剩余桃子情况。
intprocess(intn)
{
if(n==10)
return1;
else
return2*(process(n+1)+1);
}
2.2.4队列法分析
定义一个队列,和一个临时变量,临时变量存放第十天到第一天的剩下的桃子数目,每计算出一天的剩余的桃子数,就将其入队,十天的剩余桃子数全部入队以后就出对,即得到每一天的剩余桃子数,最后得到的一个数据就是所要求的桃子的总数。
typedefstructSqQueue
intdata[QueueSize];
intfornt,rear;
//队首、队尾指针
SqQueue;
2.3数据流程图
图2.3.1数据流程图
2.4系统结构图
图2.4.1系统结构图
3.方案实施
3.1数据类型定义
ina[10];
public:
typedefstructSqQueue
}SqQueue;
3.2主要模块设计
3.2.1模块1——数组求解模块
3.2.1.1模块算法:
//数组求解
voidArray_Solve()
//存放
inti;
cout<
<
"
★数组数据结构实现:
endl;
第10天剩下的桃子为:
a[9]<
for(i=8;
{
a[i]=(a[i+1]+1)*2;
cout<
第"
i+1<
天剩下的桃子为:
a[i]<
}
所以猴子共摘了"
a[0]<
个桃子"
}
3.2.1.2流程图
图3.2.1数组求解流程图
3.2.2模块2——链表求解模块
3.2.2.1模块算法
//链表求解
voidLink_Solve()
linkhead;
listlist1;
head=newnode;
p=head;
list1.push();
p=head->
next;
★链式数据结构实现:
1"
inti=9;
while(p)
{
i<
p->
data<
if(i==1)
cout<
p=p->
i--;
3.2.3模块3——递归求解模块
3.2.3.1模块算法
intprocess(intn)//递归
//递归求解
voidFac_Solve()
★递归方法实现:
for(inti=10;
0;
process(i)<
process
(1)<
endl<
3.2.4模块4——队列求解模块
3.2.4.1模块算法
//队列求解
voidQueue_Solve()
SqQueueSQ;
SQ.fornt=SQ.rear=0;
inttemp;
//临时变量,存放每一天剩的桃子数
temp=1;
//初始放第十天的
for(inti=0;
10;
i++)
SQ.data[SQ.rear++]=temp;
temp=2*(temp+1);
★队列数据结构实现:
while(SQ.fornt!
=SQ.rear)
第"
11-SQ.fornt<
SQ.data[SQ.fornt++]<
SQ.data[SQ.fornt-1]<
3.3源程序清单
#include<
iostream>
cstdlib>
cstdio>
#defineQueueSize10
usingnamespacestd;
classlist
linkp=NULL;
voidlist:
:
push()
links;
intj=1;
p->
data=j;
for(inti=9;
{s=newnode;
s->
data=(j+1)*2;
j=s->
data;
next=NULL;
p->
next=s;
{intdata[QueueSize];
{inta[10];
for(i=8;
{a[i]=(a[i+1]+1)*2;
{linkhead;
{cout<
i--;
{if(n==10)
{cout<
{SqQueueSQ;
{SQ.data[SQ.rear++]=temp;
voidmenu()
{system("
cls"
);
system("
color0A"
cout<
|************************主菜单**************************|"
||"
|1、数组求解|"
|2、链表求解|"
|3、递归求解|"
|4、队列求解|"
|5、退出|"
voidmain()
{intn;
charch;
while
(1)
{menu();
请选择:
;
cin>
>
n;
switch(n)
{case1:
Array_Solve();
cout<
按任意键继续..."
ch=getchar();
ch=getchar();
break;
case2:
Link_Solve();
case3:
Fac_Solve();
case4:
Queue_Solve();
ch=getchar();
case5:
exit(0);
default:
选择错误!
"
}
4.结果与结论
4.1调试分析
4.1.1数组求解模块的时间复杂度:
因为其中循环for(i=8;
i--),因此其时间复杂度为O(9).数组求解模块的空间复杂度:
因为不需要输入任何数据,所以该算法为原地工作。
4.1.2链表求解模块的时间复杂度:
因为算法中用到一个循环来输出,因此其时间复杂度为O(9).链表求解模块的空间复杂度:
原地工作。
4.1.3队列求解模块的时间复杂度:
因为for(i=0;
i++),所以时间复杂度为O(9)。
队列求解模块的空间复杂度:
因为用了一个存储临时变量的空间,所以其空间复杂度为O
(1)。
4.2程序运行结果
程序运行结果:
1
第9天剩下的桃子为:
4
第8天剩下的桃子为:
10
第7天剩下的桃子为:
22
第6天剩下的桃子为:
46
第5天剩下的桃子为:
94
第4天剩下的桃子为:
190
第3天剩下的桃子为:
382
第2天剩下的桃子为:
766
第1天剩下的桃子为:
1534
所以猴子共摘了1534个桃子
本测试分别输出了三种方法所求得的结果为:
1534个,另外还用数组法,链表法,队列法和递归法分别求出了,猴子在吃桃子的10天内,各天含有桃子的数量:
下面进行验证结果:
原始桃子为:
1534第一天为:
3070-(3070/2+1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构大作业 猴子吃桃问题 数据结构 作业 猴子 问题