教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 求职职场 >

表达式求值实验报告(2)

来源:网络收集 时间:2026-08-28
导读: 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

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字,全部文档内容请下载后查看。喜欢就下载吧 ……

表达式求值实验报告(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/120785.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)