📄 main.cpp
字号:
//算术表达式运算的主程序
#include <iostream.h>
#include <stdio.h>
#include "OPTRRel.h"
#include "ExpIn.h"
#include "LinkedTypeStack.h"
bool IsBracMat(char *ch); //判断表达式中的括号是否匹配
int Char2int(char *ch); //字符转换成整数
void AnaCh(char *ch,double &result,int &index,int &preindex,int &dot,double &factor);
//分析字符
void Compute(LinkedTypeStack<double> &OPND,LinkedTypeStack<char> &OPTR,bool &expressionOK);
//操作数栈和操作符栈进行一次运算
void main()
{
//////////////////////////////////////////////////
//表达式输入,并且进行解析,完成字符到数字的转换
char *expression; //数组存储输入表达式
OPTRRel OPTRRel; //运算符关系类
LinkedTypeStack<double> OPND; //数字堆栈,存放运算数
LinkedTypeStack<char> OPTR; //字符堆栈,存放运算符
///开始解析表达式
double result; //数字转换结果
int index; //存此次转换的类型
int preindex=0; //存此次转换的类型
int dot=0; //小数点,默认刚开始没有小数点
double factor=0.1; //缩小倍数因子
char *ch;
bool expressionOK; //计算过程中表达式是否正确
char command='0';
while(command=='0')
{
cout<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"<<endl;
cout<<"Input command: 1-input expression; 2-quit"<<endl;
cout<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"<<endl;
while((command!='1')&&(command!='2'))
{
cout<<"Input command:"<<endl;
cin>>command;
if((command!='1')&&(command!='2'))
cout<<"1 or 2 is expected!"<<endl;
}
cout<<"\n"<<endl;
if(command=='1')
{
ExpIn ExpIn; //输入类的实例
expression=ExpIn.Exp;
cout<<"The input expression is:"<<expression<<endl;
OPTR.Push('#'); //存放'#'
ch=(++expression);
if(!IsBracMat(ch)) //验证表达式中的括号是否匹配
{
cerr<<"Brackets not match!!!"<<"Input the expression again!"<<endl;
//break;
}
else
{
cout<<"\n"<<endl;
cout<<"Steps:"<<endl;
cout<<"............................................................................"<<endl;
cout<<"OPND CHANGE\tOPTR CHANGE\tEXPRESSION CHANGE"<<endl;
cout<<"............................................................................"<<endl;
while(*ch!='#') //表达式没结束继续
{
//cout<<"........................................................."<<endl;
cout<<"\t\t\t\tRemaining expression to be calculated: "<<endl;
cout<<"\t\t\t\t\t"<<ch<<endl;
//cout<<"\t\t\t\tThe char to be processed: "<<endl;
//cout<<"\t\t\t\t\t"<<*ch<<endl;
//cout<<"........................................................."<<endl;
AnaCh(ch,result,index,preindex,dot,factor); //转换
switch(index)
{
case 0: //转换中的表达式错误
cerr<<"Expression ERROR!!!"<<"Input expression again!"<<endl;
break;
case 1: //操作数
if((index==preindex)||(dot==1))
{
cout<<"OPND.Pop("<<OPND.GetTop()<<")"<<endl;
OPND.Pop();
}
cout<<"OPND.Push("<<result<<")"<<endl;
OPND.Push(result);
break;
//case 9: //结束符
//Compute(OPND,OPTR,expressionOK);
//break;
case 10:
break;
default:
switch(OPTRRel.GetRel(OPTR.GetTop(),*ch)) //比较当前运算符和运算符栈顶运算符的优先级关系
{
case '>':
if(index==8)
{
Compute(OPND,OPTR,expressionOK);
//////////////////////////////////
//if(!expressionOK) //判断表达式是否正确
//{
// command='0'; //初始化command
// preindex=0; //初始化preindex
// break;
// break;
//}
////////////////////////////////////
if(OPTR.GetTop()=='(') //如果堆栈中前一个是(,则运算符堆栈弹出栈顶元素
{
cout<<"\t\tOPTR.Pop("<<OPTR.GetTop()<<")"<<endl;
OPTR.Pop();
}
else
ch--;
}
else if((index!=7)&&(index!=8)&&(OPTR.GetTop()!='('))
{
while(OPTRRel.GetRel(OPTR.GetTop(),*ch)=='>')
//一直运算,直到即将输入的运算符优先级高
Compute(OPND,OPTR,expressionOK);
OPTR.Push(*ch); //ch非括号、非^之后入站
cout<<"\t\tOPTR.Pop("<<OPTR.GetTop()<<")"<<endl;
}
else
{
OPTR.Push(*ch); //其余运算符入栈
cout<<"\t\tOPTR.Push("<<OPTR.GetTop()<<")"<<endl;
}
break;
case '=':
break;
case '<':
OPTR.Push(*ch);
cout<<"\t\tOPTR.Push("<<OPTR.GetTop()<<")"<<endl;
break;
default:
cerr<<"Expression ERROR!"<<endl; //报错处理
break;
}//end switch
break;
}//end switch
if(index==0)
{
command='0'; //初始化command
preindex=0; //初始化preindex
break;
}
ch++; //ch指向下一个转换字符
preindex=index;
}//end while
//////////////////////////////////////
// if(index==0)
// {
// command='0'; //初始化command
// preindex=0; //初始化preindex
// break;
// }
//////////////////////////////////////
if(index!=0)
{
while(OPTR.GetTop()!='#')
Compute(OPND,OPTR,expressionOK); //最后的运算
}
////////////////////////////////////////////
//if(!expressionOK) //判断表达式是否正确
//{
// command='0'; //初始化command
// preindex=0; //初始化preindex
// break;
//}
////////////////////////////////////////////
if((expressionOK!=FALSE)&&(index!=0))
{
cout<<"\n"<<endl;
cout<<"Value of the input expression is: "<<OPND.GetTop()<<endl; //输出最终的结果
cout<<"******************************************************************"<<endl;
cout<<"End of this computing!"<<endl;
cout<<"******************************************************************"<<endl;
}
cout<<"\n\n"<<endl;
//cout<<""<<endl;
//cout<<""<<endl;
OPND.DestroyStack(); //清空操作数栈
OPTR.DestroyStack(); //清空运算符栈
command='0'; //初始化command
preindex=0; //初始化preindex
}//end else
}//end if
else
break;
}//end while
// OPND.DestroyStack(); //销毁操作数栈
// OPTR.DestroyStack(); //销毁运算符栈
}
//判断表达式中的括号是否匹配
bool IsBracMat(char *ch)
{
LinkedTypeStack<char> bracket;
while(*ch!='#')
{
if(*ch=='(')
bracket.Push(*ch); //'('压栈
else if(*ch==')')
{
if(bracket.GetTop()=='(')
bracket.Pop(); //')'出栈
else
break;
}
ch++;
}//end while
if((*ch=='#')&&bracket.IsEmptyStack())
return TRUE;
else
return FALSE;
}//end IsBracMat()
//字符转换成整数的函数
int Char2int(char *ch)
{
int result;
//进行字符到整数的转换
switch(*ch)
{
case '0': //数字0
result=0;
break;
case '1': //数字1
result=1;
break;
case '2': //数字2
result=2;
break;
case '3': //数字3
result=3;
break;
case '4': //数字4
result=4;
break;
case '5': //数字5
result=5;
break;
case '6': //数字6
result=6;
break;
case '7': //数字7
result=7;
break;
case '8': //数字8
result=8;
break;
case '9': //数字9
result=9;
break;
default:
cerr<<"ERROR!"<<endl; //报错处理
break;
}//end switch
return result;
}//end Char2int
//判断ch是否是操作数
void AnaCh(char *ch,double &result,int &index,int &preindex,int &dot,double &factor)
//result存放数字转换结果,index代表了转换字符的类型;
//preindex代表前次转换的类型,dot代表每单元操作数出现小数点与否
//1-数,2-'+',3-'-',4-'*',5-'/',6-'^',7-'(',8-')',9-'#',0-Error,10-小数点
//expressionOK反映表达式的正确与否,正里面包含了对表达式的验证
{
int sign=0; //判断的标志
int temp=0;
// int factor=1; //缩小倍数因子
// extern int char2int(char *ch);
if((*ch>='0')&&(*ch<='9')) //ch是数
{
index=1;
temp=Char2int(ch);
if((index==preindex)&&(dot==0))
{
result=10*result+temp; //处理多位数
}
else if(dot==1) //处理小数点后的数
{
result=result+temp*factor;
factor=factor*0.1;
}
else
{
result=temp; //处理一位数的情况
factor=0.1;
dot=0;
}
}
else if(*ch=='+') //+
{
if((preindex!=1)&&(preindex!=8))
index=0;
else
{
dot=0;
index=2;
}
}
else if(*ch=='-') //-
{
if((preindex!=1)&&(preindex!=8))
index=0;
else
{
dot=0;
index=3;
}
}
else if(*ch=='*') //*
{
if((preindex!=1)&&(preindex!=8))
index=0;
else
{
dot=0;
index=4;
}
}
else if(*ch=='/') ///
{
if((preindex!=1)&&(preindex!=8))
index=0;
else
{
dot=0;
index=5;
}
}
else if(*ch=='^') //^
{
if((preindex!=1)&&(preindex!=8))
index=0;
else
{
dot=0;
index=6;
}
}
else if(*ch=='(') //(
{
if((preindex==1)||(preindex==8))
index=0;
else
{
dot=0;
index=7;
}
}
else if(*ch==')') //)
{
if((preindex==7)||(preindex==9))
index=0;
else
{
dot=0;
index=8;
}
}
else if(*ch=='#') //#
{
if((preindex!=1)||(preindex!=8))
index=0;
else
{
dot=0;
index=9;
}
}
else if(*ch=='.') //.
if((preindex!=1)||(dot==1))
index=0;
else
{
dot=1;
index=10;
}
else //其他字符
index=0;
}
//计算两个操作数和一个运算符的函数
void Compute(LinkedTypeStack<double> &OPND,LinkedTypeStack<char> &OPTR,bool &expressionOK)
{
double op1,op2; //参与运算的操作数
char optr; //运算符
int i;
double temp=1;
if(OPND.IsEmptyStack())
{
cout<<" (Not enough oprands!)"<<endl;
expressionOK=FALSE;
}
else
{
op2=OPND.GetTop(); //取第二个操作数
cout<<"OPND.Pop("<<op2<<")"<<endl;
OPND.Pop();
if(OPND.IsEmptyStack())
{
cout<<" (Not enough oprands!)"<<endl;
expressionOK=FALSE;
}
else
{
op1=OPND.GetTop(); //取第一个操作数
cout<<"OPND.Pop("<<op1<<")"<<endl;
OPND.Pop();
if(OPTR.GetTop()=='#')
{
cout<<" (Not enough oprator!)"<<endl;
expressionOK=FALSE;
}
else
{
optr=OPTR.GetTop(); //取运算符
cout<<"\t\tOPTR.Pop("<<optr<<")"<<endl;
OPTR.Pop();
switch(optr)
{
case '+': //加法
OPND.Push(op1+op2);
break;
case '-': //减法
OPND.Push(op1-op2);
break;
case '*': //乘法
OPND.Push(op1*op2);
break;
case '/': //除法
if(op2!=0)
OPND.Push(op1/op2);
else
{
cout<<" (Divided by ZERO!)"<<endl;
expressionOK=FALSE;
}
break;
case '^': //幂
for(i=1;i<=(abs(op2/1));i++)
{
if(op2>0) //指数为正
temp=temp*op1;
else if(op2<0) //指数为负
temp=temp/op1;
}//end for
OPND.Push(temp);
break;
default:
cout<<" (Illegal operator!!)"<<endl;
expressionOK=FALSE;
}//end switch
cout<<"OPND.Push("<<OPND.GetTop()<<")"<<endl;
}//end else
}//end else
}//end else
}//end evalue
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -