资源简介
问题描述 设计一个模拟计算器功能的程序,它读入一个表达式,如果是一个正确的表达式(即它由操作数、圆括号和+、-、*、/四种运算符组成),则求出该表达式的值;否则给出某种错误信息。
基本要求:读入一个以字符序列形式给出的以等号(=)结尾的表达式;程序中应考虑运算符的优先级、运算的合法性。
代码片段和文件信息
#include
#include
using namespace std;
#define STACK_SIZE 50
#define STACKINCREMENT 20
struct optr
{
char* base;
char* top;
int stacksize;
};
struct opnd
{
double* base;
double* top;
int stacksize;
};
int InitStack(optr &S)
{
S.base=(char*)malloc(STACK_SIZE*sizeof(char));
if(!S.base)exit(-2);
S.top=S.base;
S.stacksize=STACK_SIZE;
return 1;
}
int InitStack(opnd &S)
{
S.base=(double*)malloc(STACK_SIZE*sizeof(double));
if(!S.base)exit(-2);
S.top=S.base;
S.stacksize=STACK_SIZE;
return 1;
}
int Push(optr &Schar e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(char*)realloc(S.base(S.stacksize+STACKINCREMENT)*sizeof(char));
if(!S.base)exit(-2);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return 1;
}
int Push(opnd &Sdouble e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(double*)realloc(S.base(S.stacksize+STACKINCREMENT)*sizeof(double));
if(!S.base)exit(-2);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return 1;
}
char GetTop(optr S)
{
char e;
if(S.top==S.base) return 0;
e=*(S.top-1);
return e;
}
double GetTop(opnd S)
{
double e;
if(S.top==S.base) return 0;
e=*(S.top-1);
return e;
}
char Pop(optr &S)
{
if(S.top==S.base)return 0;
return *--S.top;
}
double Pop(opnd &S)
{
if(S.top==S.base)return 0;
return *--S.top;
}
int In(char cchar op[8])
{
for(int i=0;i<8;i++)
if(c==op[i])return 1;
return 0;
}
char precede(char bchar c)
{
char YXJ[9][9]=
{
{‘ ‘‘+‘‘-‘‘*‘‘/‘‘(‘‘)‘‘^‘‘=‘}
{‘+‘‘>‘‘>‘‘<‘‘<‘‘<‘‘>‘‘<‘‘>‘}
{‘-‘‘>‘‘>‘‘<‘‘<‘‘<‘‘>‘‘<‘‘>‘}
{‘*‘‘>‘‘>‘‘>‘‘>‘‘<‘‘>‘‘<‘‘>‘}
{‘/‘‘>‘‘>‘‘>‘‘>‘‘<‘‘>‘‘<‘‘>‘}
{‘(‘‘<‘‘<‘‘<‘‘<‘‘<‘‘=‘‘<‘‘ ‘}
{‘)‘‘>‘‘>‘‘>‘‘>‘‘ ‘‘>‘‘>‘‘>‘}
{‘^‘‘>‘‘>‘‘>‘‘>‘‘<‘‘>‘‘>‘‘>‘}
{‘=‘‘<‘‘<‘‘<‘‘<‘‘<‘‘ ‘‘<‘‘=‘}
};
int i=0j=0;
while(i<9)
{
if(b==YXJ[i][0])break;
i++;
}
while(j<9)
{
if(c==YXJ[0][j])break;
j++;
}
return YXJ[i][j];
}
void main()
{
optr OPTR;opnd OPND;
InitStack(OPTR);InitStack(OPND);
Push(OPTR‘=‘);
char c[50]OP[8]={‘+‘‘-‘‘*‘‘/‘‘(‘‘)‘‘=‘‘^‘};
cout<<“请输入待求值的表达式(!!!一定要以“=”号结束!!!):“< gets(c);int i=0ii=0aa=0tf=0;
while(c[ii]!=‘\0‘){aa++;ii++;}
while(c[i]!=‘\0‘&&(c[i]!=‘=‘||GetTop(OPTR)!=‘=‘))
{
if(!In(c[i]OP))
{
int x=0;
while(!In(c[i]OP)&&c[i]!=‘.‘)
{
x=10*x+(c[i]-48);
i++;
}
if(c[i]==‘.‘)i++;
double y=0;int j=0;
while(!In(c[i]OP))
{
j--;
y=y+(c[i]-48)*pow(10j);
i++;
}
Push(OPNDx+y);
}
else
switch(precede(GetTop(OPTR)c[i]))
{
case‘<‘:Push(OPTRc[i]);i++;break;
case‘=‘:Pop(OPTR);i++;break;
case‘>‘:double abd;char m;
m=Pop(OPTR);b=Pop(OPND);a=Pop(OPND);
if(m==‘+‘)d=a+b;
if(m==‘-‘)d=a-b;
if(m==‘*‘)d=a
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3432 2008-04-16 20:57 表达式求值\表达式求值.cpp
文件 283 2008-11-16 12:44 表达式求值\readme.txt
目录 0 2009-06-15 20:13 表达式求值
----------- --------- ---------- ----- ----
3715 3
评论
共有 条评论