📄 calculator2.cpp
字号:
//////////////////////////////////////////////////////////////////////////
/////////////////////////////简单的计算器类的实现/////////////////////////
//////////////////////////////////////////////////////////////////////////
#include "Calculator2.h"
#include <cmath>
#include <string>
#include <iostream>
using namespace std;
int Calculator2::isp(char y)
{
switch(y)
{
case '=':return 0;break;
case '(':return 1;break;
case '^':return 7;break;
case '*':
case '/':return 5;break;
case '+':
case '-':return 3;break;
case ')':return 8;break;
default:return -1;break;
}
}
int Calculator2::icp(char ch)
{
switch(ch)
{
case '=':return 0;break; //注意!
case '(':return 8;break;
case '^':return 6;break;
case '*':
case '/':return 4;break;
case '+':
case '-':return 2;break;
case ')':return 1;break;
default:return -1;break;
}
}
void Calculator2::AddOperand (double value)
{ s.Push(value);}
Boolean Calculator2::Get2Operands (double &left,double &right)
{
if(s.IsEmpty())
{
cerr<<"Missing Operand!"<<endl;
return False;
}
right = s.Pop();
if(s.IsEmpty())
{
cerr<<"Missing Operand!"<<endl;
return False;
}
left = s.Pop();
return True;
}
void Calculator2::DoOperator(char op)
{
char y=p.GetTop();
if(isp(y)<icp(op))
p.Push(op);
else
{ double left,right;
Boolean result;
do
{
char x=p.Pop();
result = Get2Operands(left,right);
if(result == True)
switch(x)
{
case'+': s.Push(left+right);break;
case'-': s.Push(left-right);break;
case'*': s.Push(left*right);break;
case'^': s.Push(pow(left, right)); break;
case'/': if(right == 0.0)
{
cerr<<"Divide by 0!"<<endl;
Clear();
}
else s.Push(left/right); break;
default:break;
}
else {
Clear();
cout<<"表达式错误!"<<endl;
}
}while(isp(p.GetTop())>icp(op));
if(p.GetTop()=='('&&op==')') p.Pop();
else p.Push(op);
}
}
void Calculator2::Run()
{
char ch;
double newoperand;
p.Push('=');
while(cin>>ch,ch!='q')
{
switch(ch)
{
case '+':
case '-':
case '^':
case '*':
case '/':
case '(':
case ')':
case '=': DoOperator(ch); break;
default: cin.putback(ch); //将字符放回输入流
cin>>newoperand; //重新读操作数
AddOperand(newoperand); //将操作数放入桟中
break;
}
}
cout<<s.Pop()<<endl;
}
void Calculator2::Clear()
{ s.MakeEmpty();p.MakeEmpty();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -