📄 mycal.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 + -