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

📄 mycal.cpp

📁 使用C++编写的计算器,包括所有的一般计算功能。
💻 CPP
字号:
#include "stdafx.h"
#include "myCal.h"

double	g_M;
double	g_MResult;
int		g_bMOpt;

enum Compare{B,S,E,U};		//bigger,smaller, equal, unknown
Compare op[14][14]={
		//+,-,*,/,sin,cos,tan,cot,#,^,ln,log,!,sqrt
/* + */  {B,B,S,S, S , S , S , S ,B,S,S , S ,S,S   },
/* - */  {B,B,S,S, S , S , S , S ,B,S,S , S ,S,S   },
/* * */  {B,B,B,B, S , S , S , S ,B,S,S , S ,S,S   },
/* / */  {B,B,B,B, S , S , S , S ,B,S,S , S ,S,S   },
/* sin */{B,B,B,B, S , S , S , S ,B,B,S , S ,S,S   },
/* cos */{B,B,B,B, S , S , S , S ,B,B,S , S ,S,S   },
/* tan */{B,B,B,B, S , S , S , S ,B,B,S , S ,S,S   },
/* cot */{B,B,B,B, S , S , S , S ,B,B,S , S ,S,S   },
/* # */  {S,S,S,S, S , S , S , S ,E,S,S , S ,S,S   },
/* ^ */  {B,B,B,B, S , S , S , S ,B,B,S , S ,S,S   },
/* ln */ {B,B,B,B, S , S , S , S ,B,S,S , S ,S,S   },
/* log */{B,B,S,S, S , S , S , S ,B,S,S , S ,S,S   },
/* ! */  {B,B,B,B, U , U , U , U ,B,B,U , B ,B,U   },
/* sqrt*/{B,B,B,B, S , S , S , S ,B,S,S , S ,S,S   }
};

MyOperator optrs[14]={
	MyOperator("+",2,0),
	MyOperator("-",2,1),
	MyOperator("*",2,2),
	MyOperator("/",2,3),
	MyOperator("sin",1,4),
	MyOperator("cos",1,5),
	MyOperator("tan",1,6),
	MyOperator("cot",1,7),
	MyOperator("#",0,8),
	MyOperator("^",2,9),
	MyOperator("ln",1,10),
	MyOperator("log",2,11),
	MyOperator("!",1,12),
	MyOperator("sqrt",1,13)
};

Compare MyCal::GetPriority(int preop,int postop)
{
	return op[preop][postop];	
}

void MyCal::InitStack()
{
	//清空两个栈
	while(!optr.empty()) optr.pop();
	while(!opnd.empty()) opnd.pop();
	//初始化optr,放入#
	optr.push(optrs[8]);
}

double MyCal::StringToDouble(CString str)
{
	if(str.IsEmpty())return 0.0;
	str.TrimLeft();		//去除左空格
	str.TrimRight();	//去除右空格
	
	int i=0;
	double rate=10.0,itemp=0.0;
	if(str.GetAt(0)=='-')	//处理负号
		i++;
	for(;i<str.GetLength();i++){
		if(isdigit(str.GetAt(i))){
			if(rate==10.0)	//整数部分
				itemp=itemp*rate+(str.GetAt(i)-'0');
			else
			{	//rate=.1,小数部分
				itemp=itemp+rate*(str.GetAt(i)-'0');
				rate=rate/10;
			}
		}
		else if(str.GetAt(i)=='.')
			rate=0.1;
		else
			return 0.0;
	}
	if(str.GetAt(0)=='-')
		itemp*=-1;	//使itemp变为负数
	return itemp;
}


void MyCal::PushOptr(MyOperator myop)
{
	if(myop.GetPM()!=1)
	{
		//前一个符号比后一个符号优先级高
		while(this->GetPriority(optr.top().GetIndex(),myop.GetIndex())==B)
		{
			opnd.push(this->Calculate());
		}
		optr.push(myop);
	}
	else
	{
		//对于1目运算符作特别处理
		optr.push(myop);
		opnd.push(this->Calculate());
	}
}

void MyCal::PushOpnd(double mynum)
{
	opnd.push(mynum);
}

double MyCal::Calculate()
{
	double a,b;
	CString optrName;
	optrName=optr.top().GetName();
	switch(optr.top().GetPM())
	{
	case 2:
		b=opnd.top();
		opnd.pop();
		a=opnd.top();
		opnd.pop();
		break;
	case 1:
		a=opnd.top();
		//弹出数字
		opnd.pop();
		b=0;
		break;
	case 0:
		a=0;b=0;
		break;
	}
	//弹出符号
	optr.pop();
	if(optrName=="+")
		return a+b;
	else if(optrName=="-")
		return a-b;
	else if(optrName=="*")
		return a*b;
	else if(optrName=="/")
		return a/b;
	else if(optrName=="sin")
		return sin(a);
	else if(optrName=="cos")
		return cos(a);
	else if(optrName=="tg")
		return tan(a);
	else if(optrName=="ctg")
		return 1.0/tan(a);
	else if(optrName=="atg")
		return atan(a);
	else if(optrName=="actg")
		return 1.0/atan(a);
	else if(optrName=="asin")
		return asin(a);
	else if(optrName=="acos")
		return acos(a);
	else if(optrName=="^")
		return pow(a,b);
	else if(optrName=="ln")
		return log(a)/log(e);
	else if(optrName=="lg")
		return log10(a);
	else if(optrName=="log")
		return log(b)/log(a);
	else
		return 0.0;
}

CString MyCal::GetResult()
{
	CString str;
	str.Format("%lf",opnd.top());
	return str;
}

double MyCal::CalculateAll()
{
	while(optr.top().GetName()!="#")
	{
		//前一个符号比后一个符号优先级高
		opnd.push(this->Calculate());
	}
	if(opnd.empty())
		return 0;
	else
		return opnd.top();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -