数据结构与算法 猴子吃桃Word格式.docx
《数据结构与算法 猴子吃桃Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构与算法 猴子吃桃Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
以小组为单位,分工合作完成以下任务
(1)编写程序实现对上述猴子偷桃问题的求解并运行出结果;
(2)在制定期限内提交程序并完成答辩;
(3)提交出详细的课程设计说明书。
参考文献阅读:
(1)严蔚敏,吴伟民.数据结构(C语言版)—北京:
清华大学出版社2007IBSN978-7-302-14751-0;
(2)谭浩强.C语言程序教程—北京:
清华大学出版社2007.7IBSN978-7-302-15157-9;
(3)(美)(Liang,Y.D)C++程序设计—北京:
机械工业出版社2008.5IBSN978-7-111-23996-3。
工作计划:
1、确定自己负责模块的作用
2、写出模块算法
3、写出源代码
4、验证与修改
任务下达日期:
2010年6月7日
任务完成日期:
2010年6月18日
指导教师(签名):
学生(签名):
(设计题目)
摘要:
有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子。
要求:
1)采用数组数据结构实现上述求解
2)采用链数据结构实现上述求解
3)采用递归实现上述求解
关键词:
数组链递归
1.设计背景
1.1时代背景
数据结构是由数据元素依据某种逻辑联系组织起来的。
对数据元素间逻辑关系的描述称为数据的逻辑结构;
数据必须在计算机内存储,数据的存储结构是数据结构的实现形式,是其在计算机内的表示;
此外讨论一个数据结构必须同时讨论在该类数据上执行的运算才有意义。
为了编写出一个“好”程序,必须分析待处理对象的特性以及各个对象之间存在的关系,“数据结构”正是我们学习这些处理方法的课程。
1.2能力要求
课程设计是理论学习的补充环节,是对学生所学知识的综合运用能力的检验,也是学生提高分析问题解决问题能力的大好实践时机。
通过课程设计,让学生接触社会,深入实际,亲自动手运用所学的专业知识和技巧,去分析、研究、解决这些实际问题,从而灵活运用所学知识,增强实际工作能力,为顺利走向工作岗位打下坚实的基础。
数据结构课程设计是在学生学完了《C程序设计教程》课程后开设的一门实践性课程,旨在通过对课程设计从分析、设计到实现的全过程剖析和实践,更好地理解数据结构中的概念和原理,并由此掌握数据结构的基本思路和方法。
2.设计方案
2.1初步分析
用数学方法对问题进行分析,写出详细的问题分析过程。
2.2问题细化
将问题的数学解决方法及思维转化成C语言数据结构的方法。
对问题进行分块设计
,分别用C语言实现问题的数组、链表、递归的解决方法。
当对程序进行初步调试并能运行得到正确结果时对程序进行进一步的完善,添加适当的模块使程序输出界面清楚明了便于操作。
3.方案实施
3.1初步探讨
问题数学分析:
猴子每天都吃当前桃子的一半多一个,假设今天还有n个桃子,则前一天就有(n+1)*2个桃子。
又已知第十天只剩下一个桃子,则可代入以上公式求出第九天的桃子数,以此类推求下去便可得到第一天的桃子数。
将上述解题过程思维转化为C语言的编程方法,先在草稿纸上列出初步的程序的框架,然后逐步实现。
3.2详细过程
在电脑上建立一个空的C/C++工程,在工程里分别添加以下文件“MEP.h”,“main.cpp”,“METP.cpp”,“Interface.cpp”,“ProblemAnlysis.cpp”。
其中头文件包含所有需要用的的相关函数,其它源文件分别实现不同的功能(详细请参照附件中的源程序)。
程序初步完成时对程序各方面进行测试,弥补不足之处最终得到比较完善的程序。
4.结果与结论
运行结果请参照附件中对程序运行结果的截图。
同一问题可以有多个不同的解决路径及方法,但是方法有优劣之分,就本题而言,递归方法最容易写程序最简单,但是其时间复杂度最大,运行速度慢。
本题链表法和数组法时间复杂度相当,但是一个是动态的存储结构,一个是静态的存储结构,各有各的长处和短处。
所以解决问题时要仔细分析,从多种不同的方法中找出最优的一种,以提高解决问题的效率。
5.收获与致谢
通过本次课程设计,让我们接触,深入实际,亲自动手运用所学的专业知识和技巧,去分析、研究、解决这些实际问题,从而灵活运用所学知识,增强了实际编程能力,为顺利走向工作岗位打下坚实的基础。
通过对课程设计从分析、设计到实现的全过程剖析和实践,更好地理了解数据结构中链表,数组,以及递归的概念和原理,并由此掌握数据结构的基本思路和方法。
在此,对我们数据结构老师冯慧玲女士的精心教学与辅导表示诚挚的感谢!
6.参考文献
[1]严蔚敏,吴伟民.数据结构(C语言版)—北京:
清华大学出版社2007IBSN978-7-302-14751-0.
[2]谭浩强.C语言程序教程—北京:
清华大学出版社2007.7IBSN978-7-302-15157-9.
[3](美)(Liang,Y.D)C++程序设计—北京:
机械工业出版社2008.5IBSN978-7-111-23996-3
7.附件
源程序
1)HeaderFilesMEP.H
#ifndefMEP_H
#defineMEP_H
#include<
iostream>
malloc.h>
usingnamespacestd;
typedefstructLNode
{
intdata;
structLNode*next;
}LNode,*LinkList;
voidUseLinkList();
intUseRecursion(intn);
intSwicth();
voidInterFace();
voidUseArray();
voidAnalysis();
voidLinkListAnalysis();
voidRecursionAnalysis();
voidArrayAnalysis();
staticunsignedshortarr[10]={0,0,0,0,0,0,0,0,0,1};
#endifMEP_H;
#include"
MEP.h"
2)main.cpp
voidmain()
InterFace();
}
3)Interface.CPP
voidInterFace()
cout<
<
"
——猴子吃桃子问题——\n\n"
;
有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一\n"
半且再多吃一个,到了第10天就只余下一个桃子。
用多\n"
种方法实现求出原来这群猴子共摘了多少个桃子。
\n"
(1)采用数组数据结构实现上述求解\n"
(2)采用链数据结构实现上述求解\n"
(3)采用递归实现上述求解\n"
(4)退出程序。
Swicth();
intSwicth()
Analysis();
intn;
for(;
;
)
{
cout<
请输入你要求解的方法:
cin>
>
n;
if(n<
1||n>
4)
cout<
输入错误!
请重新输入。
switch(n)
{
case1:
ArrayAnalysis();
break;
case2:
LinkListAnalysis();
case3:
RecursionAnalysis();
case4:
return0;
}
}
4)ProblemsAnalysis.cpp
voidAnalysis()
问题分析:
猴子每天都吃当前桃子的一半多一个,假设今天还有n\n"
个桃子,则前一天就有(n+1)*2个桃子。
又已知第十\n"
天只剩下一个桃子,则可代入以上公式求出第九天的\n"
桃子数,以此类推求下去便可得到第一天的桃子数。
voidLinkListAnalysis()
链表法采用后序插入的方法,先创建一个空的链表\n"
每次生成一个新的节点存储当前桃子数然后插入表\n"
头。
最后生成的链表的头结点指向的下一个节点存\n"
储的关键字便为第一天的桃子数。
最终结果为:
UseLinkList();
voidRecursionAnalysis()
采用递归的方法求解关键在于写递归函数,函数\n"
应定为int型,每次递归上次函数的返回值参与本\n"
次的运算。
最后当递归函数返回到第一层最终所得\n"
的结果变为第一天的桃子数。
其结果为:
UseRecursion(10)<
voidArrayAnalysis()
数组法是先建一个长度为10的数组,数组第一个元\n"
素存储第十天的桃子数为1,然后建立一个for循环\n"
语句使a[i+1]=(a[i]+1)*2。
循环执行到a[10]结束\n"
。
a[10]中的关键子即为第一天的桃子数。
UseArray();
5)METP.CPP
voidUseLinkList()
LinkListL,p;
L=(LinkList)malloc(sizeof(LNode));
L->
next=NULL;
p=(LinkList)malloc(sizeof(LNode));
p->
data=1;
next=L->
next;
next=p;
for(inti=1;
i<
10;
i++)
p=(LinkList)malloc(sizeof(LNode));
p->
data=2*(L->
next->
data+1);
L->
L->
data;
intUseRecursion(intn)
intm;
if(n==1)
m=1;
else
m=(UseRecursion(n-1)+1)*2;
returnm;
voidUseArray()
for(inti=9;
i>
0;
i--)
arr[i-1]=2*(arr[i]+1);
for(i=0;
i<
i++)
cout<
第<
i+1<
天还剩桃子:
arr[i]<
endl;
图1访问界面
图2方法1运行结果
图3方法2运行结果
图4方法3运行结果
图5全部方法运行结果
指导教师评语:
1、课程设计报告:
a、内容:
不完整□完整□详细□
b、方案设计:
较差□合理□非常合理□
c、实现:
未实现□部分实现□全部实现□
d、文档格式:
不规范□基本规范□规范□
2、出勤:
全勤□缺勤次
3、答辩:
a、未能完全理解题目,答辩情况较差□
b、部分理解题目,部分问题回答正确□
c、理解题目较清楚,问题回答基本正确□
d、理解题目透彻,问题回答流利□
课程设计报告成绩:
,占总成绩比例:
50%
课程设计其它环节成绩:
环节名称:
出勤,成绩:
20%
答辩,成绩:
30%
总成绩:
指导教师签字:
年月日
本次课程设计负责人意见:
负责人签字: