猴子吃桃.docx
《猴子吃桃.docx》由会员分享,可在线阅读,更多相关《猴子吃桃.docx(14页珍藏版)》请在冰豆网上搜索。
猴子吃桃猴子吃桃河南理工大学万方科技学院数据结构课程设计报告院系名称建筑与测绘工程系姓名学号专业地理信息系统指导教师目录1引言42需求分析63概要设计74详细设计85调试分析116课程设计总结14数据结构课程设计报告-猴子吃桃问题问题描述本课程设计主要解决猴子吃桃子的问题。
一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子。
在课程设计中,系统开发平台为Windows2000,程序设计设计语言采用VisualC+,数据库采用MSSQL2000,程序运行平台为Windows98/2000/XP。
在整个程序中分别采用数组数据结构、链数据结构、递归等结构形式实现此问题的求解。
程序通过调试运行,初步实现了设计目标。
关键词程序设计;C+;数组;链;递归;猴子吃桃1引引言言在日常生活中经常遇到一些与数据计算有关的问题,许多与猴子吃桃问题类似的问题要求用计算机程序语言来解决,用这个程序算法可以解决一些类似问题,以便利于生活实际。
1.1课程设计背景猴子吃桃问题涉及一个比较有趣的数组,把猴子吃桃的天数倒过来看的话,以天数作为数组的下标i,剩下桃子的个数ai的递推公式为ai=(ai-1+1)*2。
ai实际代表了倒数第i天剩下的桃子数。
所以可以求得此数组的通项公式为ai=3*pow(2,(i-1))-2(i=2)1.2课程设计目的在这个程序中我们主要是用C语言解决猴子吃桃问题,一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子。
生活中或学术上有很多类似的问题,这个问题看似简单,却可能使很多重大问题的重要组成部分或者是核心。
解决此问题的目的是以便在生活中解决根本性问题,是生活变得更加便利。
1.3课程设计内容这个程序的内容是以C语言为程序语言载体分别用数组数据结构、链数据结构、递归等结构形式实现此问题的求解。
2需求分析这个课程设计分为三个部分,即分别用三种不同的方法解决猴子吃桃子问题。
每个部分都有不同的算法思想。
用数组结构实现的算法,通过构造求桃子数的数组,然后输出要求的项来实现。
用链结构实现的算法,则是建立链表,将每天的桃子数目存入链表,然后输出第一天的桃子数。
用递归结构实现的算法,是通过函数本身的特点,反复调用自身,最后找到递归的出口,求得算法的解。
3概要设计3.1设计思路C是结构式语言。
结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。
这种结构化方式可使程序层次清晰,便于使用、维护以及调试。
C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
3.2设计方案如果用数组结构解决这个问题,把猴子吃桃的天数倒过来看的话,以天数作为数组的下标i,剩下桃子的个数ai的递推公式为ai=(ai-1+1)*2。
ai实际代表了倒数第i天剩下的桃子数。
所以可以求得此数组的通项公式为ai=3*2e(i-1)-2(i=2)。
如果用链结构解决这个问题,建立一个链表,根据每天桃子数与后一天桃子数的关系n=2*n+2,依次将每天的桃子数存进链表中,最后输出第一天的桃子数。
如果用递归结构解决这个问题,要求利用他们每天都吃当前桃子的一半且再多吃一个这一特点,设计一个递归算法。
4详细设计详细设计4.1数组结构把猴子吃桃的天数倒过来看的话,以天数作为数组的下标i,剩下桃子的个数ai的递推公式为ai=(ai-1+1)*2。
ai实际代表了倒数第i天剩下的桃子数。
所以可以求得此数组的通项公式为ai=3*pow(2,(i-1))-2(i=2)。
数组结构算法的流程图如图4-1:
图4-1intday,tao11;/定义数组和下标tao0=0;/tao0赋值为0tao1=1;/倒数第一天的桃子数为1for(day=2;daynext=NULL;这个算法中,我运用了单链表,单链表每个结点由数据和指向后驱结点指针两部分构成。
在插入数据时,将插入的位置的前一项的原有后去指针赋给此结点的后去指针,然后把插入结点的data地址赋给前一结点的后驱指针,插入就完成了。
插入结点的程序代码如下:
StatusListInsert(LinkListL,inti,ElemTypee)/在第i个位置之前插入元素eintj=0;/计数器初值为0LinkLists,p=L;/p指向头结点while(p&jnext;4.3递归设计递归算法,利用x=2*x+2,定义一个函数sum_fan,然后不断调用自身,求得第一天的桃子数。
递归算法的流程图如图4-3NY图4-3主要程序代码如下:
intsum_fan(intn,inti)/子函数sum_fun,参数n和i接受主函数的参数x和dayif(i0)n=sum_fan(n+1)*2,-i);/每一次都用(n+1)*2)的值去调用子函数本身returnn;/返回结果5调试分析5.1运行环境在本课程设计中,系统开发平台为Windows2000,程序设计语言为VisualC+6.0,程序的运行环境为VisualC+6.0。
VisualC+一般分为三个版本:
学习版、专业版和企业版,不同的版本适合于不同类型的应用开发。
实验中可以使用这三个版本的任意一种,在本课程设计中,以VisualC+6.0为编程环境。
MicrosoftVisualC+6.0是Microsoft公司的MicrosoftVisualStudio6.0开发工具箱中的一个C+程序开发包。
VisualC+包中除包括C+编译器外,还包括所有的库、例子和为创建Windows应用程序所需要的文档。
自1993年Microsoft公司推出VisualC+1.0后,随着其新版本的不断问世,VisualC+已成为专业程序员进行软件开发的首选工具。
VisualC+从最早期的1.0版本,发展到最新的7.0版本,VisualC+已经有了很大的变化,在界面、功能、库支持方面都有许多的增强。
最新的7.0版本在编译器、MFC类库、编辑器以及联机帮助系统等方面都比以前的版本做了较大改进。
虽然微软公司推出了VisualC+.NET(VisualC+7.0),但它的应用的很大的局限性,只适用于Windows2000,WindowsXP和WindowsNT4.0。
所以实际中,更多的是以VisualC+6.0为平台。
VisualC+6.0是Microsoft公司推出的目前使用最广泛的基于Windows平台的可视化编程环境。
VisualC+6.0是在以往版本不断更新的基础上形成的,由于其功能强大,灵活性好,完全课扩展以及具有强大的Internet支持,因而在各种C+语言开发工具中脱颖而出,成为目前最为流行的C+语言集成开发环境。
VisualC+6.0秉承VisualC+以前版本的优异特性,为用户提供了一套良好的可视化开发环境:
主要包括文本编辑器、资源编辑器、工程创建工具、Debugger调试器等等。
用户可以在集成开发环境中创建工程、打开工程、建立、打开和编辑文件、编译、链接、运行、调试应用程序。
5.2运行结果数组结构的运行结果如图5-1图5-1数组结构结果链结构的运行结果如图5-2图5-2链结构结果递归结构的运行结果如图5-3图5-3递归结构结果6课程设计总结课程设计总结这次的课程设计的内容是用C语言实现猴子吃桃子问题,这对我来说是个很具有挑战性的任务,但通过几天的设计也从中学到了不少东西,更深刻的理解了课本中的内容。
数据结构是一门实践性较强的课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。
同时再次深刻理解了C+中类的思想和实现,文件的概念和相关操作,以及有关数据结构的很多知识。
根据实际问题的需要,对个方面的优缺点加以综合平衡,从中选择比较适宜的实现方法。
在本次课程设计中,我明白了理论与实际相结合的重要性,并提高了自己组织数据及编写程序的能力,培养了基本的,良好的程序设计技能。
提高综合运用所学知识的能力。
在这次课程设计中曾遇到了不少问题,就单凭我一个人的能力很难准时有效的完成这次的课程设计,在此,我忠心感谢我的老师和同学,他们为我提出了很多有用的建议,帮助我完成了这次的课程设计。
最后也要感谢我们学校为我们提供良好的编程环境,使我们能够按时完成任务。
附录:
源程序代码数组结构代码#include#includevoidmain()intday,tao11;/定义数组和下标tao0=0;/tao0赋值为0tao1=1;/倒数第一天的桃子数为1for(day=2;daynext=NULL;StatusGetElem(LinkListL,inti,ElemType&e)/当第i个元素存在的时,将其值赋给eintj=1;/计数器初值为0LinkListp=L-next;/p指向第一个结点while(p&jnext;if(!
p|ji)returnERROR;e=p-data;returnOK;StatusListInsert(LinkListL,inti,ElemTypee)/在第i个位置之前插入元素eintj=0;/计数器初值为0LinkLists,p=L;/p指向头结点while(p&jnext;if(!
p|ji-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;/将每一天的桃子数赋值给nListInsert(L,1,n);/将n的值输入链表StatusGetElem(L,1,e);printf(%d,e);/输出桃子的数目递归结构代码#includeintsum_fan(intn,inti)/子函数sum_fun,参数n和i接受主函数的参数x和dayif(i0)n=sum_fan(n+1)*2,-i);/每一次都用(n+1)*2)的值去调用子函数本身returnn;/返回结果voidmain()intsum;intday=9;/实现函数调用的次数intx=1;/最后一天还剩得一个桃子sum=sum_fan(x,day);/调用子函数sum_fan,并把返回得结果赋给sumprintf(%dn,sum);