📄 mydata.cpp
字号:
// Mydata.cpp : implementation file
//
#include "Myoperator.h"
#include "stdafx.h"
#include "gss_calculator.h"
#include "Mydata.h"
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
enum Precedence{B,S,E,U};
/* ?,+,-,*,/,sqrt,sin,cos,tan,cot,ln,log */
Precedence op[12][12]={
{E,S,S,S,S,S,S,S,S,S,S,S}, //?
{B,B,B,S,S,S,S,S,S,S,S,S}, //+
{B,B,B,S,S,S,S,S,S,S,S,S}, //-
{B,B,B,B,B,S,S,S,S,S,S,S}, //*
{B,B,B,B,B,S,S,S,S,S,S,S}, ///
{B,B,B,B,B,E,E,E,E,E,E,E}, //sqrt
{B,B,B,B,B,E,E,E,E,E,E,E}, //sin
{B,B,B,B,B,E,E,E,E,E,E,E}, //cos
{B,B,B,B,B,E,E,E,E,E,E,E}, //tan
{B,B,B,B,B,E,E,E,E,E,E,E}, //cot
{B,B,B,B,B,E,E,E,E,E,E,E}, //ln
{B,B,B,B,B,E,E,E,E,E,E,E} //log
};
//Myoperator temp = Myoperator("?",0,-1);
Myoperator optrs[12]={Myoperator("?",0,0),Myoperator("+",2,1),Myoperator("-",2,2),Myoperator("*",2,3),Myoperator("/",2,4),
Myoperator("sqrt",1,5),Myoperator("sin",1,6),Myoperator("cos",1,7),Myoperator("tan",1,8),Myoperator("cot",1,9),
Myoperator("ln",1,10),Myoperator("log",1,11)};
////////////////////////////////////////////////////////////////////////////
// Mydata
Mydata::Mydata()
{
countleft=0;
countright=0;
}
Mydata::~Mydata()
{
}
double Mydata::Convert(CString p)
{
return atof(p);
}
Precedence Mydata::Get_priority(int op1,int op2)
{
return op[op1][op2];
}
void Mydata::Initstack()
{
if(!optr.empty()) optr.pop();
if(!number.empty()) optr.pop();
optr.push(optrs[0]);
}
CString Mydata::Get_result()
{
CString s;
s.Format("%lf",number.top());
return s;
}
void Mydata::Pushnumber(double b)
{
number.push(b);
}
void Mydata::Pushoptr(Myoperator &op)
{
if(op.Get_item()!=1)
{
while(Get_priority(optr.top().Get_index(),op.Get_index())==B)
{
number.push(Singlecalculate());
}
optr.push(op);
}
else
{
optr.push(op);
double x=Singlecalculate();
number.push(x);
}
}
double Mydata::Singlecalculate()
{
double a,b;
if(optr.top().Get_item()==2)
{
a=number.top();
number.pop();
b=number.top();
number.pop();
}
else if(optr.top().Get_item()==1)
{
a=number.top();
number.pop();
b=0;
}
else if(optr.top().Get_item()==0)
{
a=0;
b=0;
}
CString opname=optr.top().Get_name();
optr.pop();
if(opname=="+")
return a+b;
else if(opname=="-")
return b-a;
else if(opname=="*")
return a*b;
else if(opname=="/")
return b/a;
else if(opname=="sqrt")
return sqrt(a);
else if(opname=="sqrt")
return sqrt(a);
else if(opname=="sin")
return sin(a/180*PI);
else if(opname=="cos")
return cos(a/180*PI);
else if(opname=="tan")
return sin(a/180*PI)/cos(a/180*PI);
else if(opname=="cot")
return cos(a/180*PI)/sin(a/180*PI);
else if(opname=="ln")
return log(a);
else if(opname=="log")
return log10(a);
else
return 0.0;
}
double Mydata::Allcalculate()
{
while(optr.top().Get_name()!="?")
number.push(Singlecalculate());
if(number.empty())
return 0;
else
return number.top();
}
BEGIN_MESSAGE_MAP(Mydata, CEdit)
//{{AFX_MSG_MAP(Mydata)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Mydata message handlers
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -