表达式求值实验报告(2)
OPND.Push(Operate(a,theta,b));
break;
}
}
3.4.3代码实现
#include <cstdio> #include <stdlib.h> #include <iostream> #include <string.h> #define NULL 0 #define OK 1
#define ERROR -1
#define STACK_INIT_SIZE 100 #define STACKINCREMENT 20 using namespace std; /* 定义字符类型栈 */ template<class T> class Stack { int stacksize; T *base; T *top; public: int InitStack() { base=(T *)malloc(STACK_INIT_SIZE*sizeof(T)); if(!base) return ERROR; top=base; stacksize=STACK_INIT_SIZE; return OK;
表达式求值实验报告(用类的方法实现对栈的封装)
} void Push(T ch) //运算符栈插入ch为新的栈顶元素 { *(++top)=ch; } T Pop() //删除运算符栈s的栈顶元素,用p返回其值 { return *(top--); } T GetTop()//用p返回运算符栈s的栈顶元素 { return *top; } };
/* 定义整型栈 */
/* ----------------- 全局变量--------------- */ Stack<char> OPTR;/* 定义运算符栈*/ Stack<int> OPND; /* 定义操作数栈 */ char expr[255] = ""; /* 存放表达式串 */ char *ptr = expr;
int In(char ch) //判断字符是否是运算符,运算符即返回1 { return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#'); }
/* 判断运算符优先权,返回优先权高的 */
char Precede(char c1,char c2) { int i=0,j=0; static char array[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; case '/' : j=3;break; case '(' : j=4;break; case ')' : j=5;break; case '#' : j=6;break; } return (array[7*i+j]); /* 返回运算符 */ }
/*操作函数 */
int Operate(int a,char op,int b) { switch(op) { case '+' : return (a+b); case '-' : return (a-b); case '*' : return (a*b); case '/' : return (a/b); } return 0; }
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++; } else switch(Precede(OPTR.GetTop(),c)) { case '<': OPTR.Push(c); *ptr++; break; case '=': x=OPTR.Pop(); *ptr++; break; case '>': theta=OPTR.Pop(); b=OPND.Pop(); a=OPND.Pop(); OPND.Push(Operate(a,theta,b)); break; } } return OPND.GetTop(); }
int main( ) { cout<<"请输入正确的表达式以'#'结尾:"; do{ gets(expr); }while(!*expr); OPTR.InitStack(); OPND.InitStack(); OPTR.Push('#'); /* 将#压入运算符栈 */ cout<<"表达式结果为:"<<EvalExpr()<<'\n'; cout<<" ***吴玲婷制作*****2013.12.31***\n "; cout<<" ***感谢收听***\n"; return 0; }
4、测试
1.登录成功后的界面:
表达式求值实验报告(用类的方法实现对栈的封装)
2.输入正确的表达式之后:
更换表达式后的结果:
5、总结
这次课程设计让我更加了解大一学到的面向对象C++和C以及这个学期学到的数据结构。课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力和更加了解编程思想和编程技巧。
表达式求值实验报告(用类的方法实现对栈的封装)
这次课程设计让我有一个深刻的体会,那就是细节决定成败,编程最需要的是严谨,如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类型上。就像我在写EvalExpr()函数时,忘了指针的地址符值不用加*号,这一点小小的错误也耽误了我几十分钟,所以说细节很重要。
程序设计时,也不要怕遇到错误,在实际操作过程中犯的一些错误还会有意
外的收获,感觉课程设计很有意思。在具体操作中这学期所学的数据结构的理论知识得到巩固,达到课程设计的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到C和C++语言具有的语句简洁,使用灵活,执行效率高等特点。发现上机的重要作用,特别算术表达式有了深刻的理解。
最后,感谢老师给予我们这次课程设计的机会,祝老师身体健康,工作顺利!
6、参考文献
1、《C++面向对象程序设计》 杜茂康 李昌兵 曹慧英 王永 编著 2、《算法与数据结构》 宁正元 赖贤伟 编著 3、《程序设计基础教程》 黄思先 刘必雄 主编
7、附录
表达式求值
在用高级语言编写的源程序中,一般都会有表达式。如何正确解释
执行表达式是高级语言解释程序要处理的一个基本问题。作为栈应用的一个典型例子,我们讨论表达式的求值问题。 解释程序处理的表达式是一个字符序列,例如: (5*(12-3)+5)/2
一般的表达式由操作数、运算符和界限符组成,称为三种单词。其中,操作数可以是直接量、常量、变量和函数引用等;运算符可以是算术运
表达式求值实验报告(用类的方法实现对栈的封装)
算符、关系运算符和逻辑运算符等;界限符有括号、分号等。 为了简化问题,只讨论一类简单的算术表达式,在这种算术表达式中,操作数只有直接量;运算符只有加(+)、减(-)、乘(*)、除(/) 4种;界限符只有括号。
表达式的求值规则是大家所熟悉的:先括号内后括号外;先再乘除、后加减;同级运算符从左往右计算。例如,上面提到的那个算术表达式,它的求值过程如下: 12-3=9 →R1 5*R1=45 →R2 R2+5=50 →R3 R3/2=25
其中,R1、R2、R3,表示中间结果。
当表达式中包含多个运算符时,各运算符号的计算顺序与它们的排列顺序一般是不相同的。因此,解释程序在从左 …… 此处隐藏:2551字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [求职职场]加法运算定律的运用练习题
- [求职职场]大型石油化工工业过程节能新技术
- [求职职场]2015-2020年中国箱纸板行业分析与投资
- [求职职场]NADEX-IWC5A点焊机故障代码
- [求职职场]英语阅读 非常有用
- [求职职场]鲁卫疾控发〔2012〕2号(联合,印发山东
- [求职职场]2014年莆田公务员行测技巧:数字推理的
- [求职职场]基于最近发展区理论的高中数学课堂有效
- [求职职场]与贸易有关的知识产权协议
- [求职职场]【王风范】微演说·职场演说三
- [求职职场]新时代国珍健康大课堂
- [求职职场]群论期末考试复习题
- [求职职场]施工现场消防安全专项施工方案(范本)-
- [求职职场]初中物理光学知识点归纳完美版
- [求职职场]毕业设计总结与体会范文
- [求职职场]江南大学2018年上半年展示设计第1阶段
- [求职职场]景尚乡民兵参战支前保障方案
- [求职职场]【优质】2019年工会职工之家建设工作总
- [求职职场]数据库技术与应用—SQL Server 2008(第
- [求职职场]汽车变速箱构造与工作原理
- 首钢工业区工业遗产资源保护与再利用研
- 第4课 《大学》节选
- 2016程序文件——检验检测结果发布程序
- 2011年高考试题文言文阅读全解释__2011
- 化学是一门基础的自然科学
- 海外做市商制度的借鉴意义
- 外国建筑史复习资料(
- 七年级下思想品德期末综合测试(二)
- 思政课部2013年上学期教学工作总结
- 电大国际公法任务3 0004
- 《圆的认识》教学设计
- 中国轨道交通牵引变流器行业市场发展调
- 中泰证券#定期报告:坚守时代硬科技和
- 浅论企业财务管理与企业经营投资风险的
- 大功率半导体激光器光纤耦合技术调研报
- 中国传统家具的现状与发展探讨
- Broadcom数字电视芯片助海尔扩展高清电
- 新HSK4词汇练习 超全(五)
- 2013届高考数学单元考点复习12
- 雨霖铃精品课件




