📄 calculate.cpp
字号:
#include<stdio.h>
#include<math.h>
#include<malloc.h>
#include<stdlib.h>
#include<conio.h>
#define STACK_INIT_SIZE 100 //存储空间初始分配量
//#define STACKINCREMENT 10
#define OK 1
#define ERROR 0
#define MAX 40
int fix=1;
#define n 7 //运算符个数
# define LESS '<'
# define EQU '='
# define MORE '>'
# define ERR ' '
char Precede[n][n]={{ MORE,MORE,LESS,LESS,LESS,MORE,MORE }, /* + */
{ MORE,MORE,LESS,LESS,LESS,MORE,MORE }, /* - */
{ MORE,MORE,MORE,MORE,LESS,MORE,MORE }, /* * */
{ MORE,MORE,MORE,MORE,LESS,MORE,MORE }, /* / */
{ LESS,LESS,LESS,LESS,LESS, EQU, ERR }, /* ( */
{ MORE,MORE,MORE,MORE, ERR,MORE,MORE }, /* ) */
{ LESS,LESS,LESS,LESS,LESS, ERR, EQU }};/* # */
char OP[n]={'+','-','*','/','(',')','='};
typedef struct{
char *base;
char *top;
int stacksize;
}SqStack;
int InitStack(SqStack &s)
{
s.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!s.base )
exit(OVERFLOW);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return OK;
}
char GetTop(SqStack s){
char e;
if(s.top==s.base)
return ERROR;
e=*(s.top-1);
return e;
}
int Push (SqStack &s ,char e)
{
if(s.top-s.base>=s.stacksize){
s.base=(char *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(char));
if(!s.base)
exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return OK;
}
int Pop (SqStack &s,char &e)
{
if(s.top==s.base)
return ERROR;
e=*--s.top;
return OK;
}
int In(char c,char p[])
{
for(int i=0;i<n;i++)
if(c==p[i])
return 1;
if(c>='0' && c<='9')
return 0;
else
fix=0;
printf("表达式有错误,不可识别的字符!\n");
return OVERFLOW;
}
float GetNum(char &c)
{
float num=0;
int k=10;
while(!In(c,OP) && c!='.')
{
num=num*10+c-48;
c=getchar();
}
if(c=='.')
{
c=getchar();
while(!In(c,OP))
{
num=num+(float)(c-48)/k;
k*=10;
c=getchar();
}
}
return num;
}
int Order(char c)
{
for(int i=0;i<n;i++)
{
if(c==OP[i])
return i;
}
return OVERFLOW;
}
float Operate(float a,char theta,float b)
{
switch(theta)
{
case '+':
return a+b;
case '-':
return a-b;
case '*':
return a*b;
case '/':
if(b==0)
{
printf("表达式错误,有除0操作!\n");
fix=0;
return OVERFLOW;
}
return a/b;
default:
return ERROR;
}
}
float EvaluateExpression()
{
int count=1;
char theta,c,x;
SqStack OPTR;
float OPND[MAX];
InitStack(OPTR);
Push (OPTR,'='); //初始化运算符栈
c=getchar();
if(c=='-')
OPND[count++]=0;
fix=1;
for(int i=0;i<MAX;i++)
OPND[i]=0;
while ((c!='=' || GetTop(OPTR)!='=') && fix!=0)
{
if (!In(c,OP) ) //读入的c不是运算符
{
x=' ';
OPND[count]=GetNum(c);
count++;
} //操作数进栈
else
{
if(c=='-' && x=='(')
OPND[count++]=0;
switch (Precede[Order(GetTop(OPTR))][Order(c)])
{
case LESS:
Push(OPTR,c);
x=c;
c=getchar( );
break; //栈顶元素优先权低,运算符进栈
case EQU:
Pop(OPTR,c);
c=getchar( );
break; //脱括号并接收下一字符
case MORE:
Pop(OPTR, theta);
float a,b;
a=OPND[count-2];
b=OPND[count-1];
count-=2;
if(count<=0)
{
fix=0;
printf("请检查表达式!\n");
}
OPND[count++]=Operate(a,theta,b);
break; //退栈并将运算结果入栈
case ERR:
printf("表达式有错误,括号不匹配!\n");
fix=0;
return ERROR;
} //switch
}
} //while
return OPND[count-1];
} // EvaluateExpression
void main()
{
char choose='y';
while(choose=='y' || choose=='Y')
{
printf("请输入表达式:");
float num=EvaluateExpression();
if(fix!=0)
printf("结果为:%f\n",num);
while(getchar()!='\n')
{}
printf("继续(Y)?\n请选择(其它键退出):");
choose=getche();
printf("\n\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -