一. 课题意义:当用户输入一个合法的表达式后,能够返回正确的结果。能够计算的运算符包括:加、减、乘、除、括号;能够计算的数要求在实数范围内。对于异常表达式给出错误提示。
二.软件需求:数据对象:D={ ai |ai∈ElemSet,i=1,2,3,……,n,n≥0}
数据关系:R={<ai-1,ai,)>| ai-1,ai ∈D, i=2,3,……,n}约定a1为栈底,an 为栈顶。基本操作:Push(&s,e)
初始条件:栈s已经存在。
操作结果:插入元素e为新的栈顶元素
Pop(&s,&e)
初始条件:栈s已经存在且非空。
操作结果:删除s的栈顶元素,并用e返回其值
二. 系统设计:
流程图:
开始 |
readnextch算法 |
factor算法 |
建立栈 |
存放操作字符 |
存放数据 |
expression算法 |
计算 |
结束 |
三. 重点模块详细设计:
主要算法:(伪代码)
#define N 50
#define OK 1
#define ERROR 0
#include <ctype.h>
#include <string.h>
typedef struct{
int top;
double array[N];
}NumStack;
typedef struct{
int top;
char array[N];
}OpStack;
//把字符转换为相应的整数的函数
int Cint(char mychar){
return (mychar-48);
}
//数字进栈的函数
status PushNum(NumStack &numstack,double num){
if(numstack.top<N)
{numstack.top++;
numstack.array[numstack.top-1]=num;
return OK;
}
else return ERROR;
}
//数字出栈的函数
status PopNum(NumStack &numstack,double &num){
if(numstack.top>0){
num=numstack.array[numstack.top-1];
numstack.top--;
return OK;
}
else return ERROR;
}
//操作符进栈的函数
status PushOp(OpStack &opstack,char &op){
if(opstack.top<N){
opstack.top++;
opstack.array[opstack.top-1]=op;
return OK;
}
else return ERROR;
}
//操作符出栈的函数
status PopOp(OpStack &opstack,char &op){
if(opstack.top>0){
op=opstack.array[opstack.top-1];
opstack.top--;
return OK;
}
else return ERROR;
}
//进行运算的函数
double Calc(double a,double b,char c){
double result;