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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

完整word版课程设计2.docx

1、完整word版课程设计2数据结构课程设计报告 题目:表达式类型的实现(难度系数:1.2) 学 院 计算机 专 业 计算机科学与技术 年级班别 2015级8班 学 号 3115005210 学生姓名 杨嘉慧 指导教师 李杨 编 号 成 绩 2017 年 1 月报告:报告内容: 详细 完整 基本完整 不完整设计方案: 非常合理 合理 基本合理 较差算法实现: 全部实现 基本实现 部分实现 实现较差测试样例: 完备 比较完备 基本完备 不完备文档格式: 规范 比较规范 基本规范 不规范答辩:理解题目透彻,问题回答流利理解题目较透彻,回答问题基本正确部分理解题目,部分问题回答正确未能完全理解题目,答辩

2、情况较差总评成绩:优良中及格不及格运行环境:CodeBlocks完成的题目:表达式类型的实现(难度系数:1.2)选做的内容:(4)在表达式内增加对三角函数等初等函数的操作.一、需求分析【课程设计要求】 【问题的描述】 一个表达式和一棵二叉树之间,存在着自然的对应关系。写一个程序,实现 基于二叉树表示的算术表达式Expression的操作。 【基本要求】 【一】【必做部分】 假设算术表达式Expression内可以含有变量(a-z),常量(0-9)和二元运算符(+,/,(乘幂)。实现以下操作: (1)ReadExpr(E)以字符序列的形式输入语法正确的前缀表达式并构造表达式E。 (2)Write

3、Expr(E)用带括号的中缀表达式输出表达式E. (3)Assign(V,c)实现对变量V的赋值(V=c),变量的初值为0。 (4)Value(E)对算术表达式E求值. (5)CompoundExpr(p,E1,E2)构造一个新的复合表达式(E1)p(E2).【二】【选做部分】 (1)以表达式的原书写形式输入,支持大于0的正整数常量; (2)增加常数合并操作MergeConst(E)-合并表达式E中所有常数运算.例如,对表达式E=(2+3-a)*(b+3*4)进行合并常数的操作后,求得E=(5-a)(b+12)(3)增加对求偏导数的运算Diff(E,V)-求表达式E对V的导数 (4)在表达式内

4、增加对三角函数等初等函数的操作。 【测试数据】 (1)分别输入0;a;-91;+a*bc;+5x2*8x;+*3*2x2x6并输出. (2)每当输入一个表达式后,对其中的变量赋值,然后对表达式求值。 二、【概要设计】 1、数据类型的声明: 在这个课程设计中,采用了链表二叉树的存储结构,以及两个顺序栈的辅助存储结构/头文件以及存储结构*/includestdio。h includeconio.h #includestdlib.h #include #define TRUE 1 define FALSE 0 #define OK 1 define ERROR 0typedef int Status

5、;2、表达式的抽象数据类型定义 基本操作:void judge_str(E,string1) 初始条件:树E存在,表达式的前缀字符串string存在; 操作结果:判断字符stringi,如果是0-9常量之间,二叉树结点E存为整型;否则,存为字符型。 Status ReadExpr(&E,string1) 初始条件:表达式的前缀形式字符串exprstring存在; 操作结果:以正确的前缀表示式exprstring并构造表达式E,构造成功,返回OK,否则返回ERROR。 Status Pri_Compare(c1,c2) 初始条件:c1和c2是字符; 操作结果:如果两个字符是运算符,比较两个运算符

6、的优先级,c1比c2优先,返回OK,否则返回ERROR。 void WriteExpr(E) 初始条件:表达式E存在; 操作条件:用带括弧的中缀表达式输入表达式E。 void Assign(E,V,c) 初始条件:表达式E存在,flag为标志是否有赋值过; 操作结果:实现对表达式E中的所有变量V的赋值(V=c). long Operate(opr1,opr,opr2) 初始条件:操作数opr1和操作数opr2以及操作运算符opr; 操作结果:运算符运算求值,参数opr1,opr2为常量,opr为运算符,根据不同的运算符,实现不同的运算,返回运算结果。 Status Check(E) 初始条件:

7、表达式E存在; 操作结果:检查表达式E是否还存在没有赋值的变量,以便求算数表达式E的值。 long Value(E) 初始条件:表达式E存在; 操作结果:对算术表达式求值,返回求到的结果。 void CompoundExpr(P,E1,E2) 初始条件:表达式E1和E2存在; 操作条件:构造一个新的复合表达式(E1)P(E2)。3、整体设计 在这个课程设计中,有一个源代码文件:expression.c。 在expression.c文件中,是实现课程设计要求的各个函数。 主程序的流程以及各程序模块之间的调用关系:1、各个存储结构的声明; 2、顺序栈的基本操作。其基本操作如下: 对于栈SqStac

8、k: Status InitStack(SqStack S) /* 构造一个空栈S */ Status StackEmpty(SqStack S) / 若栈S为空栈,则返回TRUE,否则返回FALSE / Status Push(SqStack *S,SElemType e) / 插入元素e为新的栈顶元素 / Status Pop(SqStack S,SElemType e) /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR / Status GetTop(SqStack S,SElemType *e) /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返

9、回ERROR / 3、本程序有三个模块,主程序模块,二叉树模块,一个个顺序栈模块。三者者的调用关系如下:三、【详细设计】 1、二叉树的存储类型 /二叉树结点类型*/ typedef enumINT,CHARElemTag;/INT为整型数据num,CHAR为字符型数据c*/ typedef struct TElemType ElemTag tag;/*INT,CHAR指示是整型还是字符型/ union int num;/tag=INT时,为整型/ char c;/*tag=CHAR时,为字符型/ ; TElemType; /二叉树的二叉链表存储表示 */ typedef struct BiTN

10、ode TElemType data; struct BiTNode *lchild,*rchild; / 左右孩子指针 / BiTNode,BiTree; 二叉树的基本操作已经在构造表达式和表达式中的基本操作中根据不同的功能和实际 情况修改了,详细见各个函数操作的算法设计。 2、顺序栈的存储类型 /栈的顺序存储表示 */ #define STACK_INIT_SIZE 10 / 存储空间初始分配量 */ define STACKINCREMENT 2 / 存储空间分配增量 / /*顺序栈/ typedef struct SqStack SElemType base; /* 在栈构造之前和销毁

11、之后,base的值为NULL */ SElemType *top; /* 栈顶指针 / int stacksize; / 当前已分配的存储空间,以元素为单位/ SqStack; / 顺序栈SqStack */3、表达式的基本操作 Status Input_Expr(char *string,int flag); /以字符序列的形式输入语法正确的前缀表达式,保存到字符串string/ /*参数flag=0表示输出的提示信息是”请输入正确的前缀表示式:”/ /*flag=1表示输出的提示信息为”请以表达式的原书写形式输入正确表示式:”*/ void judge_str(BiTree *E,char

12、 string,int i); /判断字符stringi,如果是09常量之间,二叉树结点存为整型;否则,存为字符型/ Status Pri_Compare(char c1,char c2); /如果两个字符是运算符,比较两个运算符的优先级,c1比c2优先,返回OK,否则返回ERROR/ void WriteExpr(BiTree E); /用带括弧的中缀表达式输入表达式/ void Assign(BiTree *E,char V,int c,int flag); /*实现对表达式中的所有变量V的赋值(V=c),参数flag为表示是否赋值过的标志/ long Operate(int opr1,c

13、har opr,int opr2); /*运算符运算求值,参数opr1,opr2为常量,opr为运算符,根据不同的运算符,实现不同的运算,返回运算结果*/ Status Check(BiTree E); /检查表达式是否还存在没有赋值的变量,以便求算数表达式的值/ long Value(BiTree E); /*对算术表达式求值/ void CompoundExpr(char P,BiTree *E1,BiTree E2); /构造一个新的复合表达式*/4、主程序和其他伪码算法void main() BiTree E1,E2; char V,P; int c; ReadExpr(E1); pr

14、intf(”nE1带括弧的中缀表示式为:”); WriteExpr(E1); while(Check(E1)=TRUE) printf(n请输入要赋值的字符:”); V=getchar(); printf(请输入要将赋值为:); scanf(”d”,&c); Assign(&E1,V,c); getchar(); WriteExpr(E1); printf(”n输入未知数后E1表达式为:); WriteExpr(E1); printf(”nE1表达式的值为: %d,Value(E1)); ReadExpr(E2); printf(nE2带括弧的中缀表示式为:); WriteExpr(E2);

15、Assign(&E2,V,c); CompoundExpr(P,&E1,E2); 5、函数的调用关系除了主函数main()外,其他各个函数相对于其它函数来说是独立的,函数的使用都由主函数main()调用使用的,可以简单的说,各个函数都是主函数下的从函数。四、【调试分析】1。开始设计时我设想建树时可以设定五个域,左右孩子,标志tag,int型值域,char型值域。但是在存储时发现每个字符只需占一个域就可以,所以我又采用共同体这样节约了内存。2.在算法设计中,构造表达式树的时候,本来以为使用递归构造表达式会很难做到出错处理的,所以采用了顺序栈辅助构造方法,并且尽可能地对程序进行完善,出错处理.但是

16、经过与同学的相互讨论和研究,发现自己的想法犯了很大的错误,递归构造表达式对于出错处理很简单也很完善,这一点让我加深了递归的使用和理解。3.也就是三角函数问题,我最头疼的地方。首先开始运行时会出现错误,无法输出正确结果。通过网上搜索,我发现对于三角函数的定义类型必须是double,这样的话,如果要改的话,差不多改大半程序,所以我就让此功能单独出来,由提示让用户手动完成.4。在调试的过程中,花费时间最为多的是对输入错误表达式的出错处理,更改增加的代码几乎都是为了出错处理,但是,觉得这样的调试才更能锻炼一个人的编程能力。五、【用户使用说明】打开程序,按屏幕上的提示输入数据,随后就可以看到结果了。六、

17、【测试结果】1.输入02.输入a3。输入-914.输入+a*bc5.输入+5x28x6.输入+*3x32x2x67。 CompoundExpr(P,&E1,E2)合并操作七、【附录】#includestdio。h#includeincludestdlib。hincludeS.base) *e=(S。top-1);return OK;else return ERROR; void judge_str(BiTree *E,char string,int i)if(stringi=0stringi=9)(*E)-data。tag=INT;(E)data.num=stringi48;else(E)-d

18、ata。tag=CHAR;(*E)-data.c=stringi;Status ReadExpr(BiTree *E)SqStack S;int i,len;BiTree p,q;(E)=(BiTree)malloc(sizeof(BiTNode));(E)-lchild=NULL;(*E)rchild=NULL;char string150;printf(”n请输入语法正确的前缀表示式:”);gets(string1);len=strlen(string1);if(len=1)judge_str(E,string1,0);else judge_str(E,string1,0);InitSta

19、ck(S);q=(*E);Push(S,q);Push(S,q);for(i=1;ilchild=NULL;prchild=NULL;if(string1i=+string1i=|string1i=string1i=/string1i=) if(!qlchild) q-lchild=p;Push(S,p);q=p;else qrchild=p;Push(S,p);q=p;elseif(!q-lchild) qlchild=p;Pop(S,q);else q-rchild=p;Pop(&S,q); if(StackEmpty(S)&i=len)return OK;elseprintf(n输入的表

20、达式有误!);return ERROR;Status Pri_Compare(char c1,char c2) if((c1=c1=c1=-|c1=+|c1=/)&(c2=|c2=|c2=-|c2=+|c2=/) if(c1=)if(c2!=) return OK;else return ERROR; else if(c1=*c1=/)if(c2=|c2=c2=/) return ERROR;else return OK; else return ERROR;else return ERROR;void WriteExpr(BiTree E) if(E)if(E-lchild&E-lchild

21、-data.tag=CHAR)if(Pri_Compare(E-data。c,E-lchild-data。c))printf(”();WriteExpr(Elchild);printf();else WriteExpr(E-lchild);else WriteExpr(E-lchild);if(Edata。tag=INT)printf(”d”,Edata.num);else printf(”%c”,E-data。c);if(ErchildE-rchilddata。tag=CHAR)if(Pri_Compare(Edata.c,E-rchilddata。c)printf(”();WriteExp

22、r(E-rchild);printf()”);else WriteExpr(E-rchild); else WriteExpr(E-rchild); Status Check(BiTree E)if(EEdata。tag=CHAR)if(E-data.c!=*&E-data.c!=&E-data.c!=-&Edata。c!=+E-data.c!=/)printf(”n表达式中仍存在变量没有赋值!没法求出表达式的值!”);return TRUE;if(!Check(E-lchild))Check(Erchild);void Assign(BiTree E,char V,int c)if(*E)i

23、f((E)data。tag=CHAR&(E)data.c=V)(*E)data.tag=INT;(E)data.num=c;Assign(&((E)-lchild),V,c);Assign(((*E)rchild),V,c);long power(int x,int exp)long result;int i;for(i=1,result=1;i=exp;i+)result*=x;return result;long Operate(int opr1,char opr,int opr2) long result;switch(opr)case +:result=opr1+opr2;return

24、 result;break;case :result=opr1-opr2;return result;break;case :result=opr1*opr2;return result;break;case /:result=opr1/opr2;return result;break;case :result=power(opr1,opr2);return result;break;default:break;double Operate1(char opr,double opr1) double result1;switch(opr)case :/*正玄sin/result1=sin(opr1);return result1;break;case !:/*余弦*/result1=cos(opr1);return result1;break;case :/*正切/ result1=tan(opr1);return result1;break;default:break;long Valu

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

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