算术表达式求值系统。
学号。姓名。
班级。指导教师。
成绩。完成时间: 2011.01.02
一、 设计题目描述和要求。
1. 问题:
现在的计算器只能对简单的数进行运算,对复杂的多项表达式不能运算。
2. 解决方案:
设计一个表达式求值系统。
3. 要求:
以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。利用下表给出的算符优先关系,实现对算术四则混合运算表达式的求值。
算术四则运算的规则:
a. 从左算到右。
b. 先乘除,后加减。
c. 先括号内,后括号外。
根据上述三条运算规则,在运算的每一步中,对任意相继出现的算符θ1和θ2 ,都要比较优先权关系,它们优先关系如下表所示。
二、 系统分析与概要设计。
根据问题描述和要求,系统要求能够正确求出算术表达式的值。在进行算术表达式求值过程中,考虑到我们输入的是中缀表达式,采用后缀表达式比较容易计算,因此先将中缀表达式转换成后缀表达式。程序应该具有:
“将算术表达式转化为后缀表达式”、“利用后缀表达式求值”等基本模块。
由于有优先级的问题,根据优先级不同的运算符运算的次序是不同的,因此。
更具其优先级的大小抽象的将其定义为不同的大小。
三、 详细设计和编码。
1. 数据类型定义。
表达式求值中运算符对应优先级的定义。
struct
char ch;
int pri;
lpri[7]=,rpri[7]=,op用栈存储运算符。
2.各模块算法描述。
(1)计算栈顶运算符对应的数字。
n y n y (2)判断优先级
y n y n (3)中缀转为后缀 n y yn ny y n y n y n n y (4)后缀表达式求值 y n y n y n y n y n y ny n (5)主函数
四、 调试分析。
写程序容易调程序难,调试要求:不仅要有很好的阅读程序的能力,更要有理解,分析和纠错能力。这次在调试过程中发现就是偶尔能运行成功,偶尔不能,只要不用加减就能成功,一旦用加减就运行不了。
最后发现原来加与减弄反了。
五、 测试结果。
进入多项式求值系统。
请输入表达式:4+5*6-2
中缀表达式:4+5*6-2
后缀表达式:4##6##-
表达式的值:32
q键退出,其它键继续。
请选择:h进入多项式求值系统。
请输入表达式:(56-20)/(6-2)-5
中缀表达式:(56-20)/(6-2)-5
后缀表达式:56##-6##-/5#
表达式的值:4
q键退出,其它键继续。
请选择:qpress any key to continue
六、 小结。
利用表达式求值的过程中思路是:输入的是中缀表达式,为了便于求值,先将中缀表达式转换成后缀表达式,再利用后缀表达式求值。在转换的过程中,考到了优先级,因此要对运算符号设定对应的值,就算是虚拟值吧。
在编程的过程中,要细心,耐心,遇到问题不要急。
七、 附录。
#include<>
#include<>
#include<>
#define maxsize 30
struct设定运算符优先级。
char ch;
int pri;
lpri0},,rpri0},,
int leftpri(char op求左运算符op的优先级。
for(int i=0;i<7;i++)
if(lpri[i].ch==op) return lpri[i].pri;
int rightpri(char op求右运算符op的优先级。
for(int i=0;i<7;i++)
if(rpri[i].ch==op) return rpri[i].pri;
int inop(char ch判断ch是否为运算符。
if(ch=='ch=='ch=='ch=='ch=='ch=='
return 1;
else return 0;
int precede(char op1,char op2op1和op2运算符优先级的比较结果。
if(leftpri(op1)==rightpri(op2))
return 0;
else if(leftpri(op1) return -1;
else return 1;
void trans(char *exp,char postexp)将算术表达式exp转换为后缀表达式postexp
char st[maxsize];
int top=-1;
int i=0i作为postexp的下标。
top进栈。
st[top]='
while(*exp!='0')
else为运算符。
while(st[top此时exp扫描完毕,退栈到'='为止。
postexp[i]='0给postexp表达式添加结束标识。
float compvalue(char *postexp计算后缀表达式postexp的值。
float s[maxsize数值栈。
float a,b,d;
int top=-1;
while(*postexp!='0')
postexp继续处理其他的字符。
return s[top];
void main()
char ch='a';
char exp[20];
while(ch!='q'&&ch!='q')
数据结构课程设计报告
东莞理工学院城市学院。题目 二叉排序树 专业 计算机科学与技术 本 年级 2010级计算机科学与技术专业 1 班。个人姓名 何振江。指导教师 张娟老师 时间 2010至2011第二学期第18周 地点 实验楼615机房 东莞理工学院城市学院计算机与信息科学系制。2011年 6月。实习报告的内容。一 问...
数据结构课程设计报告
设计一个校园导游程序,为来访的客人提供信息查询服务。1 设计学校的校园平面图。选取若干个有代表性的景点抽象成一个无向带权图 无向网 以图中顶点表示校内各景点,边上的权值表示两景点之间的距离。2 存放景点代号 名称 简介等信息供用户查询。3 为来访客人提供图中任意景点相关信息的查询。4 为来访客人提供...
数据结构课程设计报告
河北科技大学。课程设计报告。学生姓名学号。专业班级。课程名称数据结构。学年学期 2 012 2 013学年第 2 学期指导教师 黄春茹。2 0 13年 6 月。课程设计成绩评定表。一 数据结构课程设计目标。二 问题描述。三 需求分析。四 概要设计。五 详细设计。六 软件说明书 给出软件如何使用,使用...