算术表达式求值演示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实习报告
题目:算术表达式求值演示。
一、需求分析
1.以字符序列的形式从终端输入语法正确的、不含变量的整数表
达式。
2.利用教科书表
3.1给出的算符优先关系,实现对算数四则混合运
算表达式的求值。
3.仿照教科书的例子在求值中运用符栈、运算数栈、输入字符和
主要操作的变化过程。
4.程序执行的命令包括:
(1)构造空栈;
(2)判断符号优先级;
(3) 判断是否为七种运算符之一;
(4)运算求解算术表达式。
5.测试数据
(1)3*(7-2);
(2)8;
(3)1+2+3+4;
(4)88-1*5;
(5)1024*4/8;
(6)(20+2)*(6/2);
(7)3-3-3;
(8)8/(9-9);
(9)2*(6+2*(3+6*(6+6)));
(10)(((6+6)*6+3)*2+6)*2;
二、概要设计
1.设定栈的抽象数据类型定义:
ADT Stack{
数据对象:D={a i|a i∈CharSet,i=1,2,…,n,n≥0} 数据关系:R1={< a i-1,a i >| a i-1, a i∈D,i=2,…,n} 基本操作:
InitStack(&S)
操作结果:构造一个空栈S。
GetTop (S,&e)
初始条件:栈S已存在。
操作结果:若栈S不空,则以e返回栈顶元素。Push(&S, e)
初始条件:栈S已存在。
操作结果:在栈S的栈顶插入新的栈顶元素e。Pop(&S, &e)
初始条件:栈S已存在。
操作结果:删除S的栈顶元素,用e返回其值。} ADT Stack
2.设定运算表达式的抽象数据类型为:
ADT EvaluateExpression{
数据对象:D={a i| a i为数字及运算符,i=1,2,…,n,n≥0}数据关系:R1={ }
基本操作:
Precede(a1 , a2)
初始条件:字符a1,a2存在。
操作结果:判定运算符的优先级
In( d )
初始条件:字符d存在。
操作结果:判断c是否为七种运算符之一
Operate(a, theta, b )
初始条件:字符a, theta, b存在。
操作结果:运算表达式结果。
} ADT EvaluateExpression
3.本程序包含3个模块:
(1)主程序模块:
int main()
{
初始化;
do{
接受命令:
处理命令:
}
return 0;
}
(2)栈模块——实现栈抽象数据类型
(3)求解算术表达式模块——实现算术表达式数据类型各模块之间的调用关系如下:
主程序模块
↓
栈模块
↓
求解算术表达式模块
三、详细设计
1.数据类型、字符类型。
typedef double SElemType;// 数据类型
char Precede(char a1 ,char a2)
{
char r; //字符类型
}
2.栈类型
typedef struct SqStack {
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
栈的基本操作设置如下:
void InitStack (SqStack &S)//构造一个空栈
bool GetTop (SqStack S,SElemType &e) //若栈不空,则用e返回S 的栈顶元素,并返回true;否则返回false
bool Push(SqStack &S,SElemType e) //插入元素为e的新的栈顶元素bool Pop(SqStack &S,SElemType &e)//若栈不空,则删除S的栈顶元素,用e返回其值
其中部分操作的算法:
bool Push(SqStack &S,SElemType e)
{ //插入元素为e的新的栈顶元素
if(S.top-S.base>=S.stacksize)
{ //栈满,追加存储空间
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*size of(SElemType));
if(!S.base)
exit(-1); //存储空间分配失败
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;//top自增
return true;
}
bool Pop(SqStack &S,SElemType &e)//若栈不空,则删除S的栈顶元素,用e返回其值
{
if(S.top==S.base)
return false;
e=*--S.top; //删除一个元素,top减一
return true ;
}
3. 求解算术表达式的伪算法
SElemType EvaluateExpression( ){
SqStack OPTR,OPND;//OPTR和OPND分别为运算符栈和运算数栈char c;
char Data[20];//定义此数组为了存放整数或小数
SElemType a,b,d,e;
InitStack(OPTR);//构造一个运算符栈