ImageVerifierCode 换一换
格式:DOCX , 页数:33 ,大小:281.46KB ,
资源ID:6746849      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6746849.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法与数据结构.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法与数据结构.docx

1、算法与数据结构 数据结构与算法 课程设计题 目: 表达式转换问题 递归替换问题 跳马问题 占用网格计算问题 目 录摘 要 1一、表达式转换问题 21.采用类语言定义相关的数据类型 22.算法设计 33.函数的调用关系图 44.测试结果 45.源程序(带注释) 5二、递归替换问题 101.采用类语言定义相关的数据类型 112.算法设计 123.函数的调用关系图 134.测试结果 135.源程序(带注释) 15三、跳马问题 151.采用类语言定义相关的数据类型 162.算法设计 173.函数的调用关系图 184.测试结果 195源程序 20四、占用网格计算问题 251.采用类语言定义相关的数据类型

2、 262.算法设计 273.函数的调用关系图 284.测试结果 295源程序 30总 结- 35参考文献 36致 谢 37摘 要第一道题目,表达式转换问题由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行,即我们通常在书本上见到的表达式,就是中缀表达式。但是计算机在做算术运算的时候无法识别这种表达式。所以就有必要通过某种转化让计算机识别。关键词: 表达式转换;长整数运算;优先级;链表; 第二道题目,程序为递归替换仿编译问题,具体要求是递归替换问题。编写程序,扩展C/C+源文件中的#include指令(以递归的式)。以文

3、件名的内容替换形预编译命令“include”。具体是用相应文件的内容来替换面的代码“预编译”的命令,即在最后的结果查看文件中没有“# include”字样,其位置为相应文件的内容,考虑到有可能在我们要替换的文件中也可能会有预编译命令,所以要用递归的算法。通过这个代码的编写可以帮我们更深层次的理解c语言编译的过程,同时也能够练习递归的运用。第三道题目,跳马问题是要求在64个国际象棋格子,任意位置放一个马,如何不重复地把格子走完。能够想到的思路是用回溯,马在每一个点最多有8种跳法,遍历所有这8种可能的跳法即可得到结果。本设计的主要工作是用C语言来实现跳马问题。最短字符串问题是从输入中读取字符串,并

4、按长度顺序,最短字符串优先的原则输出它们。如果有若干字符串具有相同的长度,就按字母顺序输出它们。最短字符串问题在C语言中是采用数组的方式建立起来的。设计的主要工作是用C语言实现最短字符串的算法设计。第四道题目,网格计算的由来是因为这种计算方式像格子一样的体系结构。它试图将过剩的计算能力以及其它闲置的IT资源联系起来,以供应给那些在一定时间内需要高性能计算能力的部门。2002年11月,日本国家高级工业科技研究所从日本向美国发送数据,速度高达707Mbps在1万公里以上的距离之间以如此高的速度传送数据,这在世界上尚属首次,此次试验就是通过网格系统实现的。简单地讲,网格是把互联网上的众多计算资源整合

5、成一台虚拟的超级计算机,将以CPU为主的各种资源“拧成一股绳”,实现各种资源的全面共享。当然,网格并不一定非要跨越国界,也可以构造地区性的网格,如城市网格、企业内部网格、局域网网格,甚至家庭网格等等网格的根本特征,不是它的规模,而是资源共享。关键词: 跳马 最短字符串 C语言 表达式转换 优先级 网格计算 整合 递归替换 命令一表达式转换问题1.数据结构设计t#include#include#include#include#include#define MaxSize 200/两个结构体typedef structchar dataMaxSize;int top;OpStack;typedef

6、 structchar dataMaxSize;int top;SeqStack;定义两个栈结构,用来存储中缀表达式和后缀表达式。关系图: 图1、表达式转换问题的运算关系2算法设计void TranslateExpress(char str,char exp)/把中缀表达式转换为后缀表达式SeqStack S;char ch;char e;int i=0,j=0;InitStack(&S);ch=stri;i+;while(ch!=0) /依次扫描中缀表达式switch(ch)case(:PushStack(&S,ch);break;case):while(GetTop(S,&e)&e!=()

7、PopStack(&S,&e);expj=e;j+;PopStack(&S,&e);break;case+:case-:while(!StackEmpty(S)&GetTop(S,&e)&e!=()PopStack(&S,&e);expj=e;j+;PushStack(&S,ch);break;case*:case/:while(!StackEmpty(S)&GetTop(S,&e)&e=/|e=*)PopStack(&S,&e);expj=e;j+;PushStack(&S,ch);break; /是空格就忽略case :break;default:while(ch=0&chtop != -

8、1);break; case +: case -: case *: case /: while(Priority(c) = Priority(GetTop(S) t = Pop(S); EnQueue(Q,t); Push(S,c);break; /EndSwitch while(c!=#);/以#号结束表达式扫描二递归替换问题1.采用类语言定义相关的数据类型typedef struct /创建结构体,让文件的读写方便 char dataMAX; /数据项char1; int print(char chMAX,int n) /递归函数 FILE *fp,*fp1; char sMAX; /s,

9、存储#后面的include char1 bMAX; /b,文件中内容在内存中的存储位置 int i=0,k,d=0,j,flag; /switch参数,用于确认调用函数的参数 2.算法设计本题主要运用了字符数组去存储数据,在通过相应的函数去读取文件中的内容,然后依次去判断是否含有#,如果有的话,下一个文件就去替换他。3.函数的调用关系图4.测试结果在软件测试的过程中,刚开始对文件的读取达不到实现,后来通过翻阅资料和问同学,最后将文件的遍历以及字符串等的判断搞定5.源代码# include # include # include #define MAX 100 typedef struct /创

10、建结构体,让文件的读写方便 char dataMAX; /数据项char1; int print(char chMAX,int n) /递归函数 FILE *fp,*fp1; char sMAX; /s,存储#后面的include char1 bMAX; /b,文件中内容在内存中的存储位置 int i=0,k,d=0,j,flag; /switch参数,用于确认调用函数的参数 if(fp=fopen(ch,rb+)=NULL) 15 printf(文件打开失败!n); exit(0); while(!feof(fp) fread(&bi,1,sizeof(char1),fp); i+; if(

11、bi-1.data0=) /结构体数组计数器 break; k=i-1; /记录b大小,可以认为是对应文件的行数 fclose(fp); if(fp1=fopen(辅助.c,ab+)=NULL) printf(文件打开失败!n); exit(0); d=0; /s数组存取计数器 for(i=0;ik;i+) if(bi.data0=#) /发现include,递归调用 print for(j=2;j9;j+) sd=bi.dataj; d+; if(strcmp(s,include)=0) flag=bi.data19-0; switch(flag) /带选择的递归调用 case 1:fp=p

12、rint(filename1.c,1);break; case 2:fp=print(filename2.c,2);break; case 3:fp=print(filename3.c,3);break; default:break; 16 else /否则的话讲代码存入辅助文件 printf(%sn,bi.data); fwrite(&bi,1,sizeof(char1),fp); fputc(r, fp); fputc(n, fp); else /否则的话讲代码存入辅助文件 printf(%sn,bi.data); fwrite(&bi,1,sizeof(char1),fp1); fput

13、c(r, fp); fputc(n, fp); lose(fp1); return 0; 三、跳马问题 要求在64个国际象棋格子,任意位置放一个马,如何不重复地把格子走完。(3)1、数据结构设计#include int deltar = -2, -1, 1, 2, 2, 1, -1, -2;int deltac = 1, 2, 2, 1,-1,-2, -2, -1;/*马的可能走法对当前位置的横纵增量*/Main()输入r,c表示马在棋盘上的初始位置初始化数组表示棋盘检测是否有下一出口(k = next(r, c) = -1)此路可通过此路不通 是 否输出满足该问题的一种正确解法,程序结束。图

14、1.流程图 图2.函数关系图 2.算法设计A.在8*8的棋盘上的任意一个位置上放一个马(r,c),求马所在位置的出口数。代码如下:int exitn(int r, int c, int nexta)/*求马所在位置(r,c)的出口数,nexta为出口号*/ int i, k, a, b; int num = 0; for(i = 0;i = 7;i+) k = (i + start) % 8; a = r + deltark; b = c + deltack; if(a = 0 & b = 0 & b = 7 & boardab = 0) nextanum = k; num+; return

15、num;B.选择出口最少的那个位置。代码如下:int next(int r, int c)/*选择下一个出口*/ int nexta8, num, num1 = 0, min, i, k;/*min用来确定最少出口数*/ min =9; num = exitn(r, c, nexta);/*num为(r,c)的出口个数*/ if(num = 0) return -1; /*没有出口 */ for(i = 0;i = num-1;i+) /* 找出口最少的点*/ num1 = number(r + deltarnextai, c + deltacnextai); if(num1 64)放在dow

16、hile(step=64)循环语句之外,才能达到用“贪婪法”解决该问题的目的。时间复杂度的计算是按照运算次数来进行的, 关于空间复杂度的计算是在程序运行过程所要借助的内容空间大小。时间复杂度:O(n 2);空间复杂度:O(n)。 4.测试结果图4.1 初始界面图4.2 运行界面5.源程序(带注释)#include stdio.h#define N 8int w=0;int way18=-2,-1,1,2, 2, 1,-1,-2;int way28= 1,2, 2,1,-1,-2,-2,-1;int chN*N=0;int aN*N+13=0;int dirNN8;int st=1;char c

17、=y;int weightNN; void caculate();void dirctions();void print();int check(int i,int j);void caculate() /*计算各点的权值*/int i,j,k;for(i=1;i=N;i+) for(j=1;j=N;j+) for(k=0;k=1&x=1&y=N) weighti-1j-1+; int check(int i,int j) /*检查(i,j)是否在棋盘内*/if(i8|j8) return 0;return 1;void directions() /*求出各点的最佳方向序列,即优先向权值小的方

18、向*/int i,j,k,m,n1,n2,x1,y1,x2,y2,way_1,way_2;for(i=0;iN;i+) for(j=0;jN;j+) for(k=0;k8;k+) dirijk=k; for(k=0;k8;k+) for(m=k+1;mweightx2y2 )/*都可达到但m方向权值小*/ ) dirijk=way_2; dirijm=way_1; /*交换两个方向值*/ void print() int x,y; printf(n-%d answer-n,+w); for(x=1;xN+1;x+) printf(n); for(y=1;y=8) /*出发点的八个方向都已走过,

19、表示所有的方法均已找出*/ break; if(ast2=8) /*此点的八个方向都已走过,应该退回到上一次走的点*/ x=ast0; y=ast1; ch(x-1)*N+y-1=0; /*将这一点被走过的痕迹抹去*/ ast0=ast1=ast2=0; ast-12+; /*使上一次走的点走的方向发生变化*/ st-; /*步数减一*/ else /*此点的八个方向未全走过,应走此方向*/ way0=ast2; ast2+; /*确定下次应走的方向*/ x=ast0; y=ast1; way=dirx-1y-1way0; x=ast0+way1way; y=ast1+way2way; /*确

20、定按这次的方向走应走到的x,y坐标*/ if(x1|yN|yN|ch(x-1)*N+y-1!=0)/*此点不满足要求*/ continue; ch(x-1)*N+y-1=+st; /*走到这一点 */ ast0=x; ast1=y; ast2=0; /*标记这一步*/ if(st=N*N) /*步数已满*/ print(); /*输出结果*/ if(c=n) break; ch(x-1)*N+y-1=0; ast0=ast1=ast2=0; ast-12+; st-; /*退回前一步*/ 4占用网格计算问题考虑一个N*N的网格,其中某些方格已被占用。如果两个方格共用公共的边,就说它们属于同一个组,如图示,一组为4个被占用的方格,3组为两个被占用的方格,2个方格被单独占用。假设格子用二维数组来表示。1.数据结构设计#define N 8int mapNN;int map2NN;int step;int zushu=0;int flag=0;2.算法设计int enter(int m)/输入 输入N值 for(k=1;k=m;k+) flag=1; cout输入网络第k个被占用所在行和列(大于等于0小于N):ij; if(i=n|j=n|i0|j0)/循环输入坐标 cout!ERROR

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1