⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculator2.cpp

📁 软件课程设计(1) 是一些非常经典的程序
💻 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 + -