?? calculator.h
字號:
#ifndef CALCULATOR_H
#define CALCULATOR_H
template<class Elem>
class Calculator
{
private:
LStack<Elem> opnd;//operand stack
LStack<char> optr;//operator stack
static int isp(char operato);//運算符棧內優先排序
static int icp(char operato); //運算符棧外優先排序
bool get2Values(double &value1,double &value2);
bool doOperator(char op);
void getChar(char &ch)
{
cin>>ch;
while(ch==' '||ch=='\n')
cin>>ch;
}
bool isOperator(char ch)
{
if(ch=='='||ch=='('||ch=='^'||ch=='*'||ch=='/'||ch=='%'||ch=='+'||ch=='-'||ch==')')
return true;
else
return false;
}
public:
void run();
};
template<class Elem>
int Calculator<Elem>::isp(char operato)
{
int result;
switch(operato)
{
case '=':
result=0;
break;
case '(':
result=1;
break;
case '^':
result=7;
break;
case '*':
case '/':
case '%':
result=5;
break;
case '+':
case '-':
result=3;
break;
case ')':
result=8;
}
return result;
};
template<class Elem>
int Calculator<Elem>::icp(char operato)
{
int result;
switch(operato)
{
case '=':
result=0;
break;
case '(':
result=8;
break;
case '^':
result=6;
break;
case '*':
case '/':
case '%':
result=4;
break;
case '+':
case '-':
result=2;
break;
case ')':
result=1;
}
return result;
};
template<class Elem>
bool Calculator<Elem>::get2Values(double &value1,double &value2)
{
if(opnd.empty())
{
cout<<"Enter error!!!"<<endl;
return 0;
}
opnd.topValue(value2);
opnd.pop();
if(opnd.empty())
{
cout<<"Enter error!!!"<<endl;
return 0;
}
opnd.topValue(value1);
opnd.pop();
return 1;
};
template<class Elem>
bool Calculator<Elem>::doOperator(char op)
{
Elem value1,value2;
bool result=get2Values(value1,value2);
if(result==true)
{
switch(op)
{
case '+':
opnd.push(value1+value2);
break;
case '-':
opnd.push(value1-value2);
break;
case '*':
opnd.push(value1*value2);
break;
case '/':
if(value2==0)
{
cout<<"The divisor can't be 0!"<<endl;
return false;
}
opnd.push(value1/value2);
break;
case '%':
if((long)value2==0)
{
cout<<"The divisor can't be 0!"<<endl;
return false;
}
opnd.push((long)value1 % (long)value2);
break;
case '^':
opnd.push(pow(value1,value2));
}
return true;
}
else return false;
};
template<class Elem>
void Calculator<Elem>::run()
{
char ch,op;
double operand;
opnd.clear();
optr.clear();
optr.push('=');
char priorChar='=';
getChar(ch);
char optrTop;
optr.topValue(optrTop);
if(!(optr.topValue(optrTop)))
{
cout<<"Enter error!!!"<<endl;
return ;
};
while(optrTop!='='||ch!='=')
{
if(isdigit(ch)||ch=='.')
{
cin.putback(ch);
cin>>operand;
opnd.push(operand);
priorChar='0';
getChar(ch);
}
else if(!isOperator(ch))
{
cout<<"Illegal enter!"<<endl;
while(cin>>ch,ch!='=');
return;
}
else
{
if( (priorChar=='='||priorChar=='(') && (ch=='+'||ch=='-') )
opnd.push(0);
if(isp(optrTop)<icp(ch))
{
optr.push(ch);
priorChar=ch;
getChar(ch);
}
else if(isp(optrTop) > icp(ch))
{
optr.topValue(op);
optr.pop();
if(!doOperator(op))
return;
}
else if(isp(optrTop)==icp(ch)&&ch==')')
{
optr.pop();
priorChar=')';
getChar(ch);
};
};
if(!(optr.topValue(optrTop)))
{
cout<<"Enter error!!!"<<endl;
return;
};
}
if(!(opnd.topValue(operand)))
{
cout<<"Enter error!!!"<<endl;
return;
}
else
{
cout<<operand<<endl;
return;
}
};
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -