猴子吃桃子问题数据结构课程

合集下载

猴子吃桃子问题 大数据结构课程设计

猴子吃桃子问题 大数据结构课程设计

标准文档目录1、需求分析 (1)2、概要设计 (1)2.1.用数组数据结构实现上述求解 (1)2.2.用链数据结构实现上述求解 (1)2.3 用栈数据结构实现求解 (1)2.4 用递归实现上述求解 (2)3、运行环境 (2)3.1 硬件环境 (2)3.2软件环境 (2)4、详细设计 (2)4.1系统流程图 (2)4.2用数组数据结构实现上述求解 (3)4.3用链数据结构实现上述求解 (4)4.4用栈数据结构实现求解 (5)4.5用递归实现上述求解 (6)5、调试分析 (7)6、运行结果 (7)课程设计总结 (8)参考文献 (9)附录: (9)1、需求分析1、猴子吃桃子问题有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。

用多种方法实现求出原来这群猴子共摘了多少个桃子。

要求:1) 采用数组数据结构实现上述求解2) 采用链数据结构实现上述求解3) 采用栈实现上述求解4) 采用递归实现上述求解2、概要设计2.1.用数组数据结构实现上述求解在taozi函数中定义一个一维数组,分别存储每天的桃子个数,根据题目的内容找出各个数之间的关系,用数组元素表示出来,根据用户输入要计算哪一天的桃子,用for循环控制结束。

在main函数中让用户输入要计算的哪一天,调用taozi 函数,以便用户可查出任意一天的桃子个数,用switch语句判断用户要执行的功能,然后用while循环控制,直到用户输入0为止。

2.2.用链数据结构实现上述求解先写出预定义常量和类型,写出结点的类型定义,创建结点,初始化链表,定义变量并初始化,找出结点与其后继结点之间的联系,然后在主函数中控制。

2.3 用栈数据结构实现求解本部分包括预定义常量和类型,顺序栈的定义,InitStack函数,Push函数,和main函数,在InitStack函数构造一个空栈,在Push函数中调用该函数,并在其中编写控制栈顶指针和栈底指针移动的语句,找出指针所指向的数据之间的关系,在main函数中编写控制循环结束的语句,最后再用main函数去调用Push函数。

数据结构与算法 猴子吃桃

数据结构与算法 猴子吃桃

课程设计说明书课程名称:数据结构与算法设计题目:猴子吃桃问题院系:计算机科学与信息工程系学生姓名:学号:专业班级:指导教师:2010年6月18日课程设计任务书设计题目猴子吃桃问题学生姓名蒋耀辉所在院系计算机科学与信息工程系专业、年级、班08软件工程班设计要求:分别用以下三种方法实现对猴子吃桃问题的求解:(1)数组数据结构(2)链表数据结构(3)递归问题描述如下:有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第十天就只剩下一只桃子,求出它们第一天摘了多少桃子。

学生应完成的工作:以小组为单位,分工合作完成以下任务(1)编写程序实现对上述猴子偷桃问题的求解并运行出结果;(2)在制定期限内提交程序并完成答辩;(3)提交出详细的课程设计说明书。

参考文献阅读:(1)严蔚敏,吴伟民.数据结构(C语言版)—北京:清华大学出版社2007IBSN978-7-302-14751-0;(2)谭浩强.C语言程序教程—北京:清华大学出版社2007.7 IBSN978-7-302-15157-9;(3)(美)(Liang,Y.D)C++程序设计—北京:机械工业出版社 2008.5 IBSN978-7-111-23996-3。

工作计划:1、确定自己负责模块的作用2、写出模块算法3、写出源代码4、验证与修改任务下达日期:2010 年 6 月7 日任务完成日期:2010 年 6 月18 日指导教师(签名):学生(签名):(设计题目)摘要:有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。

用多种方法实现求出原来这群猴子共摘了多少个桃子。

要求:1)采用数组数据结构实现上述求解2)采用链数据结构实现上述求解3)采用递归实现上述求解关键词:数组链递归目录1. 设计背景 (1)1.1时代背景 (1)1.2能力要求 (1)2.设计方案 (1)2.1初步分析 (1)2.2 问题细化 (2)3. 方案实施 (2)3.1初步探讨 (2)3.2 详细过程 (2)4.结果与结论 (3)5. 收获与致谢 (3)6. 参考文献 (3)7. 附件 (4)源程序 (4)1. 设计背景1.1时代背景数据结构是由数据元素依据某种逻辑联系组织起来的。

数据结构实现猴子吃桃

数据结构实现猴子吃桃

《数据结构》课程设计报告(猴子吃桃)学院:东方科技学院班级:08级信息工程1班学号:200841919116姓名:朱旭指导教师:贺细平老师目录一、题目概要 (1)二、基本概念和要点 (1)三、举例分析 (3)四、设计分析 (10)五、运行结果 (10)六、总结体会 (11)课程论文题目学生:朱旭(东方科技学院08级信息工程一班,学号200841919116)一、题目概要实现课题——猴子吃桃摘要:猴子吃桃这一典型的数学课题,其主要实现的过程是将其数学课题公式化,用一些简单的数据定义、初使化、通过一系列的条件判断和循环用来实现学数公式的计算机化。

通过C语言基础分析和数据结构初步了解,我们使用C语言,利用C和数据结构的结合使用,让我们在短时间内建立起对数据结构的进一步认识。

然后,形成正确的对算法和优有个的理解观念。

关键词:C语言的基本了解,数据结构的基本了解, 数据中数组的使用,用C语言实现数据链表题目有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。

用多种方法实现求出原来这群猴子共摘了多少个桃子。

要求 1>链数据结构实现上述求解2>数组数据结构实现上述求解3>递归实现上述求解二、基本概念和要点数据结构的逻辑结构、存储结构及数据运算的含义及其相互关系。

数据结构的两大类逻辑结构和四种常用的存储表示方法。

数据就是指能够被计算机识别、存储和加工处理的信息的载体。

数据元素是数据的基本单位,有时一个数据元素可以由若干个数据项组成。

数据项是具有独立含义的最小标识单位。

如整数这个集合中,10这个数就可称是一个数据元素.又比如在一个数据库(关系式数据库)中,一个记录可称为一个数据元素,而这个元素中的某一字段就是一个数据项。

数据结构的定义虽然没有标准,但是它包括以下三方面内容:逻辑结构、存储结构、和对数据的操作。

这一段比较重要,用自己的语言来说就比如一个表 ( 数据库 ),我们就称它为一个数据结构,它由很多记录 ( 数据元素 )组成,每个元素又包括很多字 ( 数据项 )组成。

猴子吃桃子问题完美解决版

猴子吃桃子问题完美解决版
猴子吃桃子问题想必就不用说了:
现在提出解决问题方法:首先说的是谭老的《C语言程序设计》解决办法有问题至于问题在哪里不说。大家可以用软件仿真一下和你算得结果是否相同
分析:
如果只吃一天应该一共只有1个桃子吃1个
如果只吃2天应该是一共3+1 = 4个桃子吃3个
如果只吃3天应该是一共6 + 1+ 3 = 10个桃子吃6个
intday = 10 ;
intsum = 0 ;//sum表示吃到第几天时的桃子总数
inttmp= 3;//tmp每天吃桃子的个数
while(dLeabharlann y > 0 ) {if(day == 10 ){
sum= 1;
System.out.println("第10天还有一个");
} elseif(day == 9) {
sum=tmp+ sum;
} else {
tmp=tmp*2;
sum= sum +tmp;
System.out.println("第"+day+"天还有桃子"+tmp+"个");
}
day--;
}
System.out.println("因此一共有桃子"+sum + "个");
}
}
结果为1534个桃子



如果只吃n天应该一共要吃1 + 3 + 6 + 12 +24+42+。。。。。。。
也就是除了第一天外其余每天吃桃子的个数都是前天的2倍(大家可以从3,6,12,24,48中看出)

猴子吃桃子问题

猴子吃桃子问题
LinkList *L;
L=(LinkList *)malloc(sizeof(LinkList));
while(1){
printf("\n");
printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
int k;
scanf("%d",&k);
switch(k){
case 1:
for(i=0;i<=10;i++){
N=recursion(i);
printf("第 %d 天,还剩桃子 %d 个\n",i,N);
}
printf("桃子原来的总数为:%d",a[0]);
break;
case 3:
L=CreatList(); DisplayList(L);
printf("桃子原来的总数为:%d\n",L->data);
p->next=L;
L=p;
}
return L;
}
void DisplayList(LinkList *L){
LinkList *p;
int i=0;
p=L;
while(p!=NULL){
printf("第%d 天,还剩桃子%d 个\n",i++,p->data);

猴子吃桃问题

猴子吃桃问题

软件综合课程设计猴子吃桃问题学生搭配问题二〇一四年六月《猴子吃桃子课程设计》报告一、问题陈述猴子吃桃子问题:有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。

用多种方法实现求出原来这群猴子共摘了多少个桃子。

二、需求分析要求:1.采用数组数据结构实现上述求解;2.采用链数据结构实现上述求解;3.采用递归实现上述求解。

三、概要设计四、详细设计猴子每天都吃当前桃子的一半多一个,假设今天还有n个桃子,则前一天就有(n+1)*2个桃子。

又已知第十天只剩下一个桃子,则可代入以上公式求出第九天的桃子数,以此类推求下去便可得到第一天的桃子数。

1.采用数组数据结构实现上述求解声明一个长度为10的整形数组arr[10],分别存放各天猴子吃前的桃子数。

下图所示arr[0] arr[1]arr[2]arr[3] arr[4]arr[5]arr[6]arr[7] arr[8]arr[9]先将arr[9]赋值为1,用一个循环语句for (int i=9; i>0; i--){ arr[i-1]=2*(arr[i]+1); }为其余各数组元素赋值,则数组元素arr[0]的值便是该问题的解。

2.采用链数据结构实现上述求解 建立单链表,声明一个类用来对链表的结点指针进行定义,在初始化函数中利用头插法创建具有10个元素的链表。

那么N 10便是要求问题的解。

3.采用递归实现上述求解利用一个递归函数来进行求值:依据返回值来记录每一天剩余桃子情况。

int UseRecursion(int n) {int m; if(n==1) m=1; elsem=(UseRecursion(n-1)+1)*2; return m; }五、程序代码1.头文件“MEP.h “ #ifndef MEP_H #define MEP_H#include<iostream> #include<malloc.h> using namespace std; typedef struct LNode {int data;struct LNode *next; }LNode,*LinkList; void UseLinkList();int UseRecursion(int n);int Swicth();void Diaoyong();void UseArray();void Fenxi();void LinkListAnalysis();void RecursionAnalysis();void ArrayAnalysis();static unsigned short arr[10]={0,0,0,0,0,0,0,0,0,1};#endif MEP_H;2.主函数void Diaoyong();void main(){Diaoyong();}3.Diaoyong:调用函数#include"MEP.h"void Diaoyong(){cout<<" --猴子吃桃子问题-- \n\n";cout<<"有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一\n";cout<<"半且再多吃一个,到了第10天就只余下一个桃子。

数据结构猴子吃桃

数据结构猴子吃桃

目录1 问题描述 (1)2 需求分析 (1)3 概要设计 (1)3.1抽象数据类型定义 (1)3.2模块划分 (2)4 详细设计 (3)4.1数据类型的定义 (3)4.2主要模块的算法描述 (3)5 测试分析 (6)6 课程设计总结 (7)参考文献 (8)附录(源程序清单) (9)1 问题描述有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子,求原来这群猴子共摘了多少个桃子。

一种采用数组数据结构实现;一种采用栈链数据结构实现;一种采用递归实现上述求解。

2 需求分析(1)由问题可知,题目中知道第十天所剩的桃子数,所以可以及往前算,算出前一天所剩余的桃子数,到第一天时即为总的桃子数,所以可用数组来存每天所剩的桃子数,容易实现求解。

(2)根据问题设第n天的桃子数为f(n),则前一天的桃子数为f(n+1)=f(n)-(f(n)/2+1),化解可得f(n)=2f(n+1)+2,以此为依据实现递归。

(3)由栈与递归的实现可知调用函数各被调用函数之间的链接及信息交换是通过栈来实现的,因此可以用栈模拟函数递归。

即可通过用栈的链表储存结构模拟函数的递归调用过程来实现问题的求解。

3 概要设计3.1抽象数据类型定义栈的抽象数据类型定义AST Stack{数据对象:D={ai|ai∈ElemSet,i=1,2,...,n, n≥0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,...,n}约定an端为栈顶,a1端为栈底。

基本操作:InitStack(&S)操作结果:构造一个空栈S。

DestroyStack(&S)初始条件:栈S已存在。

操作结果:栈S被销毁。

ClearStack(&S)初始条件:栈S已存在。

操作结果:将栈S清为空栈。

StackEmpty(S)初始条件:栈S已存在。

操作结果:若栈S为空栈,则返回TRUE,否则FALSE。

猴子吃桃问题

猴子吃桃问题

福建工程学院课程设计课程:数据结构课程设计题目:猴子吃桃问题专业:软件工程班级: 1002座号: 5号姓名:蔡梓楠年月日实验题目:猴子吃桃问题一、要解决的问题有一群猴子摘了一堆桃,他们每天都吃当前桃子的一半且在多吃一个,到了第十天就只剩下一个桃子。

用多种方法实现求出原来这群猴子一共摘了多少个桃子。

要求:1.采用数组数据结构实现上述求解2.采用链表数据结构实现上述求解3.采用递归算法实现上述求解4.(个人)采用堆栈数据结构实现上述求解(个人)本程序可实现10天以内第n天的桃子数。

二、算法基本思想描述:本次课程设计要采用回溯思想,因为题目中只告诉你第十天的桃子数量为1,则第九天的桃子数为(1+1)*2,之前几天的桃子树可用此公式m=(n+1)*2(m为前一天桃子数,n 为当天桃子数)公式解决。

若要求第一天到底有几个桃子,可将之前几天的桃子树一一存入各自结构中,然后求出第一天的桃子树;而如果用递归算法,则必须连续十次进行该函数。

三、设计1.数据结构的设计和说明本次试验四个要求中,除了“递归算法”要求不需要特殊存储结构意外,其他三个都要。

typedef int elemtype; /*定义新类型elemtype为int型*/ (1)数组存储结构typedef struct{elemtype data[n];int len;}Sequenlist;(2)链表存储结构typedef struct node{elemtype data;struct node *next;}linklist;(3)堆栈存储结构typedef struct{elemtype data[MAXSIZE];int top;}SeqStack;2.模块结构图及各模块的功能:void main() /*主函数*/ void Digui() /*递归算法*/ void duizhan() /*堆栈存储结构*/ void shuzu() /*数组结构存储*/ void lianbiao() /*链表存储结构*/ 3.关键算法的设计递归算法描述:int z;int digui(int j,int k){z自加1;当z等于输入天数时,返回j;j=(j+1)*2;digui(j,k);}四、源程序清单:#include"malloc.h"#define MAXSIZE 100#define n 100#define NULL 0int z=0;typedef int elemtype;/*定义新类型为elemtype*/typedef struct{elemtype data[MAXSIZE];int top;}SeqStack;/*定义栈类型*/typedef struct{elemtype data[n];int len;}Sequenlist;/*定义数组类型*/typedef struct node{elemtype data;struct node *next;}linklist;/*定义链表类型*/linklist *Initlinklist(linklist *L){L=(linklist *)malloc(sizeof(linklist));L->next=NULL;return(L);}/*初始化链表*/linklist *Creatlinklist(linklist *L){int i,j;linklist *r,*p;r=L;j=1;for(i=0;i<=9;i++){p=(linklist *)malloc(sizeof(linklist));p->data=j;p->next=NULL;r->next=p;r=r->next;j=(j+1)*2;}return(L);}/*链表创建*/Sequenlist *InitList(Sequenlist *L){L=(Sequenlist *)malloc(sizeof(Sequenlist));L->len=0;return(L);}/*初始化数组*/Sequenlist *CreatList(Sequenlist *L){int i,j,k;L->data[0]=1;k=1;for(j=0;j<9;j++){i=(L->data[j]+1)*2;L->data[j+1]=i;L->len++;k++;}L->len=k;return(L);}/*将算好每天的桃子数存入数组*/ SeqStack *InitStack(SeqStack *S){S=(SeqStack *)malloc(sizeof(SeqStack));S->top=-1;return(S);}/*初始化栈*/int Push(SeqStack *S,int item){if(S->top==MAXSIZE-1){printf("Stack overflow\n");return 0;}else{S->data[++S->top]=item;return 1;}}/*进栈*/elemtype Pop(SeqStack *S){if(S->top==-1){printf("Stack is empty.\n");return 0;}else{S->top--;return(S->data[S->top+1]);}}/*出战*/SeqStack *CreatStack(SeqStack *S){int i,j,k;Push(S,1);k=1;for(j=0;j<9;j++){i=(k+1)*2;k=i;Push(S,i);}}/*将算好每天的桃子数存入栈*/int digui(int j,int k){z++;if(z==k) return j;j=(j+1)*2;digui(j,k);}/*利用递归算法计算每天桃数*/void lianbiao()/*数据存储方式为链表*/{linklist *P,*u;int i,k;P=Initlinklist(P);Creatlinklist(P);u=P->next;printf("(链表算法)请输入天数(1-10):");scanf("%d",&k);/*输入天数*/for(i=0;i<10-k;i++){u=u->next;/*寻找第k天桃子数*/}printf("第%d天桃子数为%d\n",k,u->data);printf("\n");}void shuzu()/*数据存储方式为数组*/{int k;Sequenlist *L;L=InitList(L);L=CreatList(L);printf("(数组算法)请输入天数(1-10):");scanf("%d",&k);/*输入天数*/printf("第%d天桃子数为%d\n",k,L->data[10-k]);printf("\n");}void duizhan()/*数据存储方式为堆栈*/{int i,k;SeqStack *S;S=InitStack(S);CreatStack(S);printf("(堆栈算法)请输入天数(1-10):");scanf("%d",&k);/*输入天数*/for(i=0;i<=k-2;i++) Pop(S);printf("第%d天桃子数为%d",k,Pop(S));printf("\n");printf("\n");}void Digui()/*递归算法*/{int k;z=0;printf("(递归算法)请输入天数(1-10):");scanf("%d",&k);/*输入天数*/printf("第%d天桃子数为%d",k,digui(1,11-k));printf("\n");printf("\n");}void print()/*选择列表函数*/{printf("---------请输入你的选择---------\n");printf("-a:数组算法-\n");printf("-b:链表算法-\n");printf("-c:递归算法-\n");printf("-d:堆栈算法-\n");printf("-e:关闭程序-\n");printf("--------------------------------\n");}main(){char c;print();/*打印选择列表*/c=getchar();/*输入选择*/while(c!='e'){switch(c){case 'a': shuzu();break;/*选择用数组存储方式*/case 'b': lianbiao();break;/*选择用链表存储方式*/case 'c': Digui();break;/*计算过程选择用递归算法*/case 'd': duizhan();break;/*选择用堆栈存储方式*/case 'e': return;/*程序结束*/}print();/*打印选择列表*/getchar();c=getchar();}getch();getch();}五、测试数据及测试结果:测试过程:测试开始后,屏幕打印四种方法的选项:输入“a”;屏幕打印:提示输入天数:输入“1”;输出“1534”。

猴子吃桃问题

猴子吃桃问题

试调机上、四 。错不能性间空� �n�O 为度杂复间时的总序程此�知析分法算面前合综。出退可即 �)0(tixe 用调 �6 号序择选 �序程出退需 �后息信需所得获已户用当 。解求法方种多现实来号 序的择选所过通�句语择选)(hctiws 过通再则否�入输新重示提�单菜主至回返时同�误 有入输示提�框息信 xoBegasseM 现出会�时确正不入输果如�句语 esle-fi 用采�eciohc 号序的择选要所入输句语 fnacs 过通时同 �面界的单简立建句语出输 tnirp 用 �面界出退到 直�择选入输现实句语 elihw-od 用使。)"A1 roloc"(metsys 为句语�色换面界给先首 )(niam 数函主立建、6 程过况情桃吃子猴天一意任 9 图 单菜主回返
)0(tixe 数函出退
)(yadeno 数函展扩
解求句 语 elihw
)( etaerc 数函表链
)(iugid 数函归递
)(uzuhs 数函组数
�目题示提� 助帮
6esac
5esac
4esac
3esac
2esac
1esac
0esac
eciohc 择选入输
)(niam 数函主
;tsiLkniL} ;txen* edon tcurts ;atad tni {edon tcurts fedepyt �下如型类点结的表链单义定�构结储存为表链单以 )(etaerc 解求表链单、2 程过解求组数 4 图 单菜主回返
N
间空储存请 申并 L 点结头义定 1=mun �01=yad 始初 �示所 6 图见图程流的程过个整 程过表建法插头 5 图 数总子桃的摘共即�数子桃的天一第为 1-ia 时 11=i 当 1-i a �1=1a�数子桃的天十第为 1 a 1a ห้องสมุดไป่ตู้a „„ i a

数据结构课程设计-猴子吃桃问题

数据结构课程设计-猴子吃桃问题

数学与计算机学院课程设计说明书课程名称:课程代码: 6015059 题目: 年级/专业/班:学生姓名:学号: 312011********* 开始时间: 2014 年 5 月 14 日完成时间: 2014 年 5 月 28 日课程设计成绩:学习态度及平时成绩(20)技术水平与实际能力(20)完成情况(20)创新(5)说明书(计算书、图纸、分析报告)撰写质量(35)总分(100)指导教师签名:年月日目录1 需求分析 (3)2 概要设计 (3)3详细设计 (4)4调试分析 (11)5用户使用说明 (12)6测试结果 (12)7 结论 (14)致谢 (15)参考文献 (15)摘要本课程设计主要解决猴子吃桃子的问题。

一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。

用多种方法实现求出原来这群猴子共摘了多少个桃子。

在课程设计中,系统开发平台为Windows 2000,程序设计设计语言采用Visual C++,数据库采用MS SQL 2000,程序运行平台为Windows 98/2000/XP。

在整个程序中分别采用数组数据结构、链数据结构、递归等结构形式实现此问题的求解。

程序通过调试运行,初步实现了设计目标。

关键词:程序设计;C++;数组;链;递归;猴子吃桃引言在日常生活中经常遇到一些与数据计算有关的问题,许多与猴子吃桃问题类似的问题要求用计算机程序语言来解决,用这个程序算法可以解决一些类似问题,以便利于生活实际。

1 需求分析1.1任务与分析任务功能:有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。

用多种方法实现求出原来这群猴子共摘了多少个桃子要求:采用数组数据结构实现上述求解采用链数据结构实现上述求解采用递归实现上述求解如果采用4种方法者,适当加分分析:这个课程设计分为三个部分,即分别用三种不同的方法解决猴子吃桃子问题。

猴子吃桃问题数据结构课程设计

猴子吃桃问题数据结构课程设计

一、设计题目猴子吃桃子问题有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。

用多种方法实现求出原来这群猴子共摘了多少个桃子。

二、运行环境(软、硬件环境)VC++6.0 PC电脑一台三、算法的需求分析1) 采用数组数据结构实现上述求解2) 采用链数据结构实现上述求解3) 采用递归实现上述求解4) 如果采用4种方法者,适当加分//用户界面int Desk(int n){printf("**************************************************\n");printf("| 欢迎进入猴子吃桃子系统|\n");printf("| 1-数组法2-链表法3-递归法4-二叉树法5-退出|\n");printf("***************************************************\n");printf("请输入要选择的方法: ");scanf("%d",&n);getchar();system("cls"); //刷新屏幕while(n<1 || n>5){printf("***输入错误! 请重新输入***\n");scanf("%d",&n);}return n;}四、算法概要设计//采用链数据结构 (栈) 实现上述求解typedef struct{int *top;int *base;}stack;//初始化一个栈stack Init(stack *s){s->base=(int *)malloc(STACK_SIZE*sizeof(int));if(s->base == NULL){printf("Init failed !\n");exit(-1);}s->top = s->base;return *s;}//二叉树创建一个大小为DAYS(由用给出)的二叉树,二叉树的左孩子节点存放当天的桃子数,右节点存放数字1,即为多吃的一个桃子。

数据结构猴子摘桃课程设计

数据结构猴子摘桃课程设计

需求分析(1)由问题可知,题目中知道第十天所剩的桃子数,所以可以及往前算,算出前一天所剩余的桃子数,到第一天时即为总的桃子数,所以可用数组来存每天所剩的桃子数, 容易实现求解。

(2) 根据问题设第n 天的桃子数为f(n), 则前一天的桃子数为f(n+1)=f(n)-(f(n)/2+1),化解可得f(n)=2f(n+1)+2,以此为依据实现递归。

(3) 由栈与递归的实现可知调用函数各被调用函数之间的链接及信息交换是通过栈来实现的,因此可以用栈模拟函数递归。

即可通过用栈的链表储存结构模拟函数的递归调用过程来实现问题的求解。

概要设计1 抽象数据类型定义栈的抽象数据类型定义AST Stack{数据对象:D={ai|aiElemSet,i=1,2,...,n, n≥0} ∈数据关系:R1={<ai-1,ai>|ai-1,aiD∈,i=2,...,n} 约定an 端为栈顶,a1 端为栈底。

基本操作:InitStack(&S)操作结果:构造一个空栈S。

DestroyStack(&S)初始条件:栈S 已存在。

操作结果:栈S 被销毁。

ClearStack(&S)初始条件:栈S 已存在。

操作结果:将栈S 清为空栈。

StackEmpty(S)初始条件:栈S 已存在。

操作结果:若栈S 为空栈,则返回TRUE,否则FALSE。

Push(&S,&e)初始条件:栈S 已存在。

操作结果:插入元素e 为新的栈顶元素。

Pop(&S,&e)初始条件:栈S 已存在且非空。

操作结果:删除S 的栈顶元素,并用 e 返回其值。

StackTraverse(S,visit())初始条件:栈S 已存在且非空。

操作结果:从栈底到栈顶依次对S 的每个数据元素调用函数visit(),一旦visit() 失败,则操作失败。

}ADT Stack2 模块划分本程序包括四个模块:( 1 ) 主程序模块void main() {初始化;数组求解;递归求解;栈链求解;}( 2 ) 栈模块——实现栈的抽象数据类型( 3 ) 数组模块——实现数组的运用( 4 ) 递归模块——实现递归的运用3详细设计1 )数据类型的定义(1)数组类型#define N int a[N]; (2)栈类型typedef struct node { intdatax; int datay; struct node *next; }Node,*LinkStack;2)主要模块的算法描述( 1 )主函数void main() { int sum; printf("数组实现:"); suzhu(); printf("递归实现:"); sum=fun(1); printf("%d\n",sum); printf("栈链实现:"); Zhanlian(1); } ( 2 )利用数组实现求解int a[N] 用以存每天所下的桃子数,从第10 天a[10]=1 向前循环,到第一天,即为总的个数。

猴子吃桃问题-数据结构与算法课程设计报告

猴子吃桃问题-数据结构与算法课程设计报告

合肥学院计算机科学与技术系课程设计报告2009~2010学年第二学期课程数据结构与算法课程设计名称猴子吃桃问题学生姓名王康可学号**********专业班级计算机科学与技术08级(2)班指导教师王昆仑张贯虹2010 年6月题目:(猴子吃桃问题)有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。

用多种方法实现求出原来这群猴子共摘了多少个桃子。

一、问题分析和任务定义本题目中,猴子每天都吃当前桃子的一半且再多吃一个,假设第一天开始时,即摘的桃子总数有a0只桃子,第一天吃过之后剩下a1只桃子,第二天吃过之后剩下a2只,. . .,第9天吃过之后剩下a9只,第10天吃过之后剩下a10只,在a0,a1,a2,. . .,a1 0中,只有a10= 1是知道的,现要求a0,而我们可以看出,a0,a1,a2,. . .,a10之间存在一个简单的关系:a9= 2 * ( a1 0+ 1 )a8= 2 * ( a9+ 1 )┇a1= 2 * ( a2+ 1 )a0= 2 * ( a1+ 1 )也就是:ai= 2 * ( ai + 1),其中i=10,9,8,7,6,...,1,0 。

这就是此题的数学模型。

通过阅读题目、分析题意,要求利用不同方法实现这群猴子摘桃子总数,为了实现题目要求,可采用递归、链式、数组等方法,而不管是采用哪种方法、哪种数据结构,其基本语句都是ai= 2 * ( ai + 1+1),其中i=10,9,8,7,6,...,1,0。

二、数据结构的选择和概要设计按照题目要求,采用数组数据结构、链式数据结构。

分别利用递归算法、链式存储、数组来实现函数功能。

将所有模块放在一起,利用主函数中的菜单来调用不同子函数以实现题目要求。

三、详细设计和编码1、采用递归算法子函数中,关键语句为N=2*recursion(N+1)+2,采用判断语句 if…else…,“if(N==10) return 1;”,给出第十天吃过桃子后剩下桃子数为1,其他天数return N=2*recursion(N+1)+2,即通过递归调用计算,通过已知的后一天剩下的桃子总数来求出前一天剩下的桃子总数。

数据结构猴子吃桃课程设计

数据结构猴子吃桃课程设计

课程设计报告书课程名称:数据结构与算法题目:猴子吃桃子问题学生姓名:专业:计算机科学与技术班别:学号:指导老师:日期:2012 年12 月日目录一、问题描述 (2)二、基本要求 (2)三、工具和准备工作 (2)1.工具 (2)2.准备工作 (2)2.1分析题目 (2)四、分析与实现 (3)4.1数组实现 (3)4.2链结构实现 (4)4.3 递归结构实现 (6)五、测试与结论 (8)5.1 数组结构算法实现 (8)5.2 链式结构算法实现 (8)5.3 递归算法实现 (9)六、总结 (10)一、问题描述有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。

用多种方法实现求出原来这群猴子共摘了多少个桃子。

二、基本要求1)采用数组数据结构实现上述求解2)采用链式数据结构实现上述求解3)采用递归实现上述求解三、工具和准备工作1.工具一台电脑、运行平台是WindonsXP 、Visual C++6.02.准备工作2.1分析题目猴子每天吃当前桃子的一半加多一个,所以可以设它们总共所摘的桃子有m 个。

因此用数学的方法可以求出总共的桃子有多少。

即:m=2m ⎥⎥⎦⎤⎢⎢⎣⎡⎪⎭⎫ ⎝⎛-n 211+2∑⎪⎪⎭⎫ ⎝⎛-+⎥⎥⎦⎤⎢⎢⎣⎡⎪⎭⎫ ⎝⎛---11212211n n n +1(n=1,2,3,…,9),其中,猴子在前9天里每天所吃的桃子数为:m ⎥⎥⎦⎤⎢⎢⎣⎡⎪⎭⎫ ⎝⎛-n 211+2⎥⎥⎦⎤⎢⎢⎣⎡⎪⎭⎫ ⎝⎛-n 211,在前9天里每天所剩下的桃子数为:m ⎥⎥⎦⎤⎢⎢⎣⎡⎪⎭⎫ ⎝⎛-n 211+∑⎪⎪⎭⎫ ⎝⎛--1212n n (n=1,2,3,…,9)。

其实也可以这样想:设猴子总摘了m 个桃子。

它们第一天吃了⎪⎭⎫ ⎝⎛+12m 个,第二天吃了⎪⎭⎫ ⎝⎛+214m 个,第三天吃了⎪⎭⎫ ⎝⎛+418m 个,…,第九天吃了⎪⎭⎫ ⎝⎛+-1212n n m 个,所以这不难看出第一天吃的桃子是第二天的2倍。

实训项目8猴子吃桃问题

实训项目8猴子吃桃问题

实训2 数据类型与表达式提交时请将所有代码按顺序存放在“学号姓名 2”命名的word文件中,不要压缩,每个题的代码前加简短的题目内容1.有氧运动心跳计算问题描述:运动者在户外进行运动时,须保持一定的心跳速率才算是有氧运动。

对于年龄介乎于6~90岁且平时休息时心跳次数在50次~90次之间的普通人而言,有氧运动的心跳速率由如下公式计算:0.5*(220-age)+0.3*pulse其中,age为运动者的年龄,pulse为运动者在休息时的心跳次数。

编写程序,当给定运动者的年龄和休息时的心跳次数后,能够计算出有氧运动时所应保持的心跳速率。

问题分析:(1)本案例是一个简单的公式应用吗?(2)如何将公式对年龄和休息时心跳次数的先决条件转换为相应的关系和逻辑表达式?设计思路:因为年龄和心跳次数不可能出现小数值,所以可以定义3个整型变量,即int age,pulse,mhb;分别表示年龄、休息时心跳次数、有氧运动心跳次数。

由于有氧运动心跳次数计算公式对年龄和平时休息时心跳次数由区间限制,必须先构造关系和逻辑表达式,并采用选择结构来实现对用户输入的判断,只有满足公式所需先决条件的输入才是有效的。

思考题目:(1)能否在程序中将条件6<=age<=90和50<=pulse<=90按照数学公式原样书写?(2)如果用户输入是数据不满足给定的条件,应该怎样修改程序?2.判断闰年问题描述:编写程序用于判别某年是否为闰年。

问题分析:(1)闰年有什么规律?如何将这种规律转换为相应的程序表达式?(2)程序如何能够根据闰年条件的真伪给出不同的输出?设计思路:闰年是该年的二月有29天的年份。

判断某一年是否为闰年的方法可以通过确定该年的年号来实现,即:(1)如果该年的年号能够被4整除而不能被100整除,则是闰年;(2)如果该年的年号能被400整除,则是闰年。

相反,不满足这样的条件就不是闰年。

如果用整型year来存储年号,则某年为闰年的条件是:year%4==0&&year%100!=0| |year%400==0思考题目:如果知道某年元月一日是星期几,能否在本程序的基础上,编写一个打印全年日历的程序?3.猴子吃桃问题问题描述:有一天,某只猴子摘了一些桃子,当时吃了一半,又感觉不过瘾,于是就多吃了一个。

猴子吃桃课程设计c语言

猴子吃桃课程设计c语言

猴子吃桃课程设计c语言一、教学目标本课程的目标是让学生掌握C语言的基本语法和编程方法,通过编写“猴子吃桃”程序,理解递归算法的基本思想,培养学生的编程能力和逻辑思维能力。

知识目标包括:掌握C语言的基本语法、数据类型、运算符、控制结构;理解递归算法的原理和应用。

技能目标包括:能够使用C语言编写简单的程序;能够运用递归算法解决实际问题。

情感态度价值观目标包括:培养学生的编程兴趣,提高学生的问题解决能力,培养学生的团队合作精神。

二、教学内容本课程的教学内容主要包括C语言的基本语法、数据类型、运算符、控制结构,以及递归算法的基本思想和应用。

教学大纲如下:1.C语言的基本语法和数据类型教材:第1-4章内容:变量、常量、数据类型、运算符、控制结构等2.递归算法教材:第7章内容:递归算法的定义、原理和应用,以“猴子吃桃”程序为例,讲解递归算法的实现和应用三、教学方法本课程采用讲授法、案例分析法和实验法相结合的教学方法。

首先,通过讲授法向学生传授C语言的基本语法和递归算法的理论知识;然后,通过案例分析法,分析“猴子吃桃”程序的实现过程,让学生理解递归算法的应用;最后,通过实验法,让学生动手编写“猴子吃桃”程序,提高学生的编程能力。

四、教学资源教学资源包括教材、实验设备和相关多媒体资料。

教材选用《C程序设计语言》作为主教材,辅助教材可以选择《C语言编程入门》等;实验设备包括计算机、网络等;多媒体资料包括教学PPT、视频教程等。

这些资源将有助于支持教学内容和教学方法的实施,提高学生的学习效果。

五、教学评估本课程的评估方式包括平时表现、作业和考试三个部分,各部分所占比例分别为40%、30%和30%。

平时表现主要评估学生的课堂参与度、提问回答、团队合作等,通过观察和记录进行评估。

作业主要评估学生的编程能力和理解能力,通过布置课后编程题目进行评估。

考试为闭卷考试,包括选择题、填空题和编程题,以全面反映学生的学习成果。

六、教学安排本课程的教学安排共分为16周,每周2课时,共计32课时。

使用控制结构(算法实现)

使用控制结构(算法实现)

使用控制结构(算法实现)
三、定义一个一维数组,含有100个Integer类型元素。随机确定每个元素的值, 并求其最大值、最小值和平均值(ex0508.exe)。
Rnd()函数,返回一个随机数,范围在0~1之间。如果使用Rnd()函数生 成整数,应通过表达式: CInt(Rnd()*100),此时,随机数为0~1分、2分和5分任意构成)可多少种换法? (ex0514.exe) 一角钱的零钱中,可有0~10个1分、0~5个2分、0~2个5分。 使用穷举法利用计算机高速度的特点求解。
使用控制结构(算法实现)
十、“水仙花数”是指一种三位数,其各位数的立方和等于该数本身。请求 出所有水仙花数。(ex0515.exe)
之前,
f
k
1f
F1=f2
k f
k+1 k+2
2f 3
F2=f3 然后:f3=f1+f2
k+1 k+2
1f 2f
k+3
3
使用控制结构(算法实现)
六、根据公式计算π的值(ex0511.exe)。
此公式只能计算π的近似值,当通项的绝对值小于0.0001时认为达到精 度要求,停止计算。
使用控制结构(算法实现)
十一、求一元方程f(x)=x3-x-1的近似解。(ex0516.exe)
使用二分迭代法。
F(x)
F(x1)
x0 F(x0)
X2
x1
=(x1+x2)/2
使用控制结构(算法实现)
十二、求一元方程f(x)=x3-x-1的近似解。(ex0517.exe) 使用牛顿迭代法。
F(x)
x2
x1 x0
使用控制结构(算法实现)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1)Windows XP
(2)Microsoft VisualC++6.0
4
4.1
4.2
//计算桃子的个数
void taozi(int n,int m)
{
int day[10];//初始化变量,用数组元素分别存储每天的桃子个数
int i;//控制循环执行的次数
day[0]=n;//最后一天的桃子个数
for(i=m-1;i>0;i--)
{
s=(LNode *) malloc(sizeof(LNode));
1、猴子吃桃子问题
有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。用多种方法实现求出原来这群猴子共摘了多少个桃子。
要求:
1) 采用数组数据结构实现上述求解
2) 采用链数据结构实现上述求解
3) 采用栈实现上述求解
4) 采用递归实现上述求解
2
2.1.
在taozi函数中定义一个一维数组,分别存储每天的桃子个数,根据题目的内容找出各个数之间的关系,用数组元素表示出来,根据用户输入要计算哪一天的桃子,用for循环控制结束。在main函数中让用户输入要计算的哪一天,调用taozi函数,以便用户可查出任意一天的桃子个数,用switch语句判断用户要执行的功能,然后用while循环控制,直到用户输入0为止。
}
4.5
int i=9;//初始化全局变量
//递归函数
int taozi(int x)
{
int y;
while(i>0)
{
y=2*(x+1);
i--;//循环控制条件
taozi(y);
printf("%d\n",y);
}
}
5
1在用链数据结构实现时,运行时没有显示错误,但输出不是预测的结果,代码如下:
{
int i;
L=(LNode *) malloc(sizeof(LNode));//生成新结点
p=(LNode *) malloc(sizeof(LNode));
L->next=NULL;//创建一个带头结点的单链表
L->next=p;//插入到表头
L->next->data=e;//初始化第一个结点
2.4
这种方法跟上述几种不同,在函数的执行函数的过程中,需多次进行自我调用,递归函数的运行过程类似与多个函数的嵌套调用,只是调用函数和被调用函数是同一个函数,从主函数开始调用,一次更深一层,退出时一步一步返回到上一层,所以不需写控制循环语句,不需要写控制循环语句,比上几种方法简单点。
3
3.1
PC
3.2
for(i=0;i<10-m;i++)
day[i+1]=2*(day[i]+1);//相邻元素之间的关系
printf("第%d天的桃子为:%d\n",m,day[10-m]);
}
void main()
{
int m;//用户要计算的是第几天
printf("请输入要求第几天剩下的桃子:\n");
scanf("%d",&m);
{
int i;
InitStack();
*s.top++=e;//给栈底元素初始化
for(i=0;i<10-m;i++)
{
*s.top=2*(*(s.top-1)+1);//栈顶元素和刚插入的元素之间的关系
s.top++;//每插入一个栈顶元素,指针就要自加1
}
printf("第%d天的桃子为:%d\n",m,*(s.top-1));
2.2.
先写出预定义常量和类型,写出结点的类型定义,创建结点,初始化链表,定义变量并初始化,找出结点与其后继结点之间的联系,然后在主函数中控制。
2.3
本部分包括预定义常量和类型,顺序栈的定义,InitStack函数,Push函数,和main函数,在InitStack函数构造一个空栈,在Push函数中调用该函数,并在其中编写控制栈顶指针和栈底指针移动的语句,找出指针所指向的数据之间的关系,在main函数中编写控制循环结束的语句,最后再用main函数去调用Push函数。
taozi(1,m);//调用
while(1){
int j;//循环控制条件
printf("请输入j的值0:退出1:继续:\n");
scanf("%d",&j);
switch(j){
//当j=1时,用户可以输入多次想要的数值
case 1:
printf("请输入要求第几天剩下的桃子:\n");
scanf("%d",&m);
//单链表的存储结构
typedef struct LNode{
int data;//数据域
struct LNode *next;//指针域
}LNode;
LNode *L;
LNode *p,*s;
//计算桃子的个数
int CreateList_L(int e,int m)//e是第十天的桃子的个数,m是将要计算的是第几天
for(i=m-1;i>0;i--)
{
s=(LNode *) malloc(sizeof(LNode));
p->next=s;
s->data=2*(p->data+1);//结点与下一结点之间的联系
p=s;//指针P总是指向最后一个结点
s->next=NULL;
}
printf("第%d天的桃子为:%d\n",11-m,p->data);
{
s.base=(int *) malloc(STACK_INIT_SIZE * sizeof(int));
if(!s.base)
exit (OVERFLOW);//存储分配失败
s.top=s.base;//刚开始栈为空
s.stacksize=20;
returnoid Push(int e,int m)// m是要计算的是第几天
taozi(1,m);
break;//跳出
//当j=0时,跳出switch结构
case 0:
return;
break;
//当用户输入除0和1以外的数值时,会让你重新输入,直到输入正确为止
default:
printf("输入有误请重新输入!");
}
}
}
4.3
//预定义常量和类型
#define NULL 0
}
4.4
//储存空间初始分配量
#define STACK_INIT_SIZE 100
//顺序栈的定义
typedef struct
{
int *base;//栈底指针
int *top;//栈顶指针
int stacksize;//当前已分配的存储空间
}SqStack;
SqStack s;
//构造一个空栈
int InitStack()
相关文档
最新文档