表达式求值实验报告(共17页)

上传人:des****85 文档编号:222147699 上传时间:2021-12-12 格式:DOC 页数:17 大小:194KB
返回 下载 相关 举报
表达式求值实验报告(共17页)_第1页
第1页 / 共17页
表达式求值实验报告(共17页)_第2页
第2页 / 共17页
表达式求值实验报告(共17页)_第3页
第3页 / 共17页
表达式求值实验报告(共17页)_第4页
第4页 / 共17页
表达式求值实验报告(共17页)_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《表达式求值实验报告(共17页)》由会员分享,可在线阅读,更多相关《表达式求值实验报告(共17页)(17页珍藏版)》请在金锄头文库上搜索。

1、精选优质文档-倾情为你奉上福建农林大学计算机与信息学院计算机类课程设计报告课程名称:面向对象程序设计课程设计课程设计题目:表达式求值姓 名:吴玲婷 系: 软件工程系专 业: 软件工程年 级: 2012学 号: 指导教师: 林敏职 称: 讲师2014 年 1 月 1 日专心-专注-专业目 录题目1、课程设计的目的(1)了解并掌握面向对象程序的设计方法,具备初步的独立分析和设计能力;(2)初步掌握应用面向对象程序进行软件开发的步骤;(3)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;(4) 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风;2

2、、课程设计的要求(1)设计的课题能够体现面向对象程序设计的思路。(2)根据自己对数据结构和算法的基本概念、原理和机制的理解,自拟题目和设计内容,选题尽可能结合实际的应用。3、课程设计的内容3.1设计的任务在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为简化,规定操作数只能为正整数,操作符为+、-、*、/,用#表示结束。算法输出:表达式运算结果。 算法要点:设置运算符栈和运算数栈辅助分运

3、析算符优先关系。在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。3.2设计要求用类实现对栈的封装功能,完成表达式求值。任何一个表达式都是由操作符,运算符和界限符组成的。我们分别用顺序栈来寄存表达式的操作数和运算符。栈是限定于仅在表尾进行插入或删除操作的线性表。顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,base为栈底指针,在顺序栈中,它始终指向栈底,即top=base可作为栈空的标记,每当插入新的栈顶元素时,指针top增1,删除栈顶元素时,指针top减1。3.3程序的总体结构为了实现算符优先算

4、法。可以使用两个工作栈。一个称为OPTR,用以寄存运算符,另一个称做OPND,用以寄存操作数或运算结果。1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素;2.依次读入表达式,若是操作符即进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为”#”)。3.用ADT描述ADT Stack数据对象:D= |ElemSet,i=1,2,,n, n0数据对象:R1=|,i=2,,n约定端为栈顶,端为栈底。基本操作: InitStack(&S) 操作结果:构造一个空栈S。 GetTop(S) 初始条件:

5、栈S已存在。 操作结果:用P返回S的栈顶元素。 Push(&S,ch) 初始条件:栈S已存在。 操作结果:插入元素ch为新的栈顶元素。 Pop(&S) 初始条件:栈S已存在。 操作结果:删除S的栈顶元素。In(ch)操作结果:判断字符是否是运算符,运算符即返回1。 Precede(c1, c2) 初始条件:c1,c2为运算符。操作结果:判断运算符优先权,返回优先权高的。Operate(a,op,b)初始条件:a,b为整数,op为运算符。操作结果:a与b进行运算,op为运算符,返回其值。num(n)操作结果:返回操作数的长度。EvalExpr()初始条件:输入表达式合法。操作结果:返回表达式的最

6、终结果。ADT Stack3.4详细设计3.4.1类的设计1).栈的基本功能。InitStack(Stack *s) 和InitStack2(Stack2 *s)分别构造运算符栈与构造操作数栈,Push(Stack *s,char ch) 运算符栈插入ch为新的栈顶元素,Push2(Stack2 *s,int ch) 操作数栈插入ch为新的栈顶元素,Pop(Stack *s) 删除运算符栈s的栈顶元素,用p返回其值,Pop2(Stack2 *s)删除操作数栈s的栈顶元素,用p返回其值,GetTop(Stack s)用p返回运算符栈s的栈顶元素,GetTop2(Stack2 s) 用p返回操作数

7、栈s的栈顶元素。2).其它功能分析。 (1)In(char ch) 判断字符是否是运算符功能,运算符即返回1,该功能只需简单的一条语句即可实现,return(ch=+|ch=-|ch=*|ch=/|ch=(|ch=)|ch=#)。 (2) Precede(char c1,char c2) 判断运算符优先权功能,该函数判断运算符c1,c2的优先权,具体优先关系参照表1。 (3) Operate(int a,char op,int b)操作数用对应的运算符进行运算功能。运算结果直接返回。(4) num(int n) 求操作数的长度功能,需要用itoa函数把int型转换成字符串型,strlen函数可

8、求字符长度。(5) EvalExpr()主要操作函数运算功能。分析详见3.4.2。3.4.2各模块设计及程序流程 1).类的总体结构如下: Precede(ctemplateclass Stack int stacksize; T *base; T *top;public: int InitStack(); void Push(T ch); T Pop(); T GetTop(); ;2) 判断运算符优先权,返回优先权高的。运算符间的优先关系如下:+-*/()#+-*/(#, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

9、 , !, , , , , , , , !, =; /用一维数组存储49种情况switch(c1) /* i为下面array的横标 */ case + : i=0;break; case - : i=1;break; case * : i=2;break; case / : i=3;break; case ( : i=4;break; case ) : i=5;break; case # : i=6;break; switch(c2) /* j为下面array的纵标 */ case + : j=0;break; case - : j=1;break; case * : j=2;break; c

10、ase / : j=3;break; case ( : j=4;break; case ) : j=5;break; case # : j=6;break; return (array7*i+j); /* 返回运算符array7*i+j为对应的c1,c2优先关系*/ 3. int EvalExpr()主要操作函数。算法概要流程图:利用该算法对算术表达式3*(7-2)求值操作过程如下:步骤OPTR栈OPND栈输入字符主要操作1#3*(7-2)#Push(OPND,3)2# 3*(7-2)#Push(OPTR,*)3#*3(7-2)#Push(OPNR,()4#*(37-2)#Push(OPND,

11、7)5#*(3 7-2)#Push(OPNR,-)6#*(-3 72)#Push(OPND,2)7#*(-3 7 2)#Operate(7,-,2)8#*(3 5)#Pop(OPTR)9#*3 5#Operate(3,*,5)10#15#Return(GetTop2(OPND)表2算法伪代码如下:int EvalExpr()/主要操作函数 char c,theta,x; int m;int a,b,i=0;while(*ptr!=#|OPTR.GetTop()!=#) c = *ptr;if(!In(c) /不是运算符sscanf(ptr,%d,&m);OPND.Push(m);while(!In(*ptr)ptr+; elseswitch(Precede(OPTR.GetTop(),c) case : /退栈并将运算结果入栈theta=OPTR.Pop(); b=OPND.Pop();a=OPND.Pop();OPND.Push(Operate(a,theta,b);break; 3.4.3代码实现#include #include #include #include #define NULL 0 #define OK 1#define E

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号