📄 计算器dlg.cpp
字号:
countE(s);//计算常数e
countLn(s);//计算对数
countT(s);//计算三角函数
count3(s);//三级计算
count2(s);//二级计算
count1(s,1);//一级计算
False1(s);//错误判断
return s;
}
void CMyDlg::False1(CString & s)
{
if(s.Find('.')!=s.ReverseFind('.'))
False(s);
}
int CMyDlg::countPi(CString & s)
{
int a=s.Find("Pi");
if(-1==a)
return -1;
if((a>0 && (isdigit(s[a-1]) || '.'==s[a-1])) || (a<s.GetLength()-2 && (isdigit(s[a+2]) || '.'==s[a+2]))){
False(s);
return -1;
}
s.Replace(s.Mid(a,2),"3.1415926535897932384626433832795");
sum=3.1415926535897932384626433832795;
countPi(s);
return 0;
}
int CMyDlg::countE(CString & s)
{
int a=s.Find('E');
if(-1==a)
return -1;
if((a>0 && (isdigit(s[a-1]) || '.'==s[a-1])) || (a<s.GetLength()-1 && (isdigit(s[a+1]) || '.'==s[a+1]))){
False(s);
return -1;
}
s.Replace(s.Mid(a,1),"2.718281828459045");
sum=2.718281828459045;
countE(s);
return 0;
}
int CMyDlg::countLn(CString & s)
{
return 0;
}
int CMyDlg::countT(CString & s)//字符串计算(*)
{
int a=s.Find('n'),S=s.Find('s'),G=s.Find('g'),T=s.Find('t'),n=s.Find('N'),m=s.Find('G');
if(-1==a && -1==S && -1==G && -1==T && -1==n && -1==m)
return -1;
a=max(max(a,S),max(max(m,n),max(G,T)));
if('N'==s[a]){
if(a>1 && (isdigit(s[a-2]) || '.'==s[a-2])){
False(s);
return -1;
}
}
else{
if(a>2 && (isdigit(s[a-3]) || '.'==s[a-3])){
False(s);
return -1;
}
}
int x=a;
if(a<s.GetLength()-1 && ('-'==s[a+1] || '+'==s[a+1]))
if(a==s.GetLength()-2 || !(isdigit(s[a+2]) || s[a+2]==46)){
False(s);
return -1;
}
else x=a+1;
int f=-1;
for(int i=x+1;i<s.GetLength();i++)//后
if(isdigit(s[i]) || s[i]==46) f=i;
else
if('e'==s[i]) f=++i;
else break;
if(-1==f){
False(s);
return -1;
}
CString s2=s.Mid(a+1,f-a);
False1(s2);
double b=strtod(s2,&stop);
if(('N'==s[a] || 'G'==s[a]) && b<=0){
False(s);
return -1;
}
if(('n'==s[a] || 'g'==s[a] || 's'==s[a] || 't'==s[a]) && 1==three)
b=b/180*3.1415926535897932384626433832796;
double g;
switch(s[a]){
case 'N':
g=log(b);
break;
case 'G':
g=log10(b);
break;
case 'n':
g=sin(b);
break;
case 's':
g=cos(b);
break;
case 'g':
g=tan(b);
break;
case 't':
if(0==b){
False(s);
return -1;
}
g=1/tan(b);
break;}
if(s[a]=='N')
s.Replace(s.Mid(a-1,f-a+2),gcvt(g,15,e));
else
s.Replace(s.Mid(a-2,f-a+3),gcvt(g,15,e));
countT(s);
return -1;
}
int CMyDlg::count3(CString & s)
{
int a=s.Find('^');
if(-1==a)
return -1;
int b=-1,f=-1;int x=a;
for(int i=a-1;i>=0;i--)//前
if(isdigit(s[i]) || s[i]==46) b=i;
else
if(('+'==s[i] || '-'==s[i]) && i>0 && 'e'==s[i-1])
b=--i;
else
if(i<a-1 && ('+'==s[i] || '-'==s[i]) && (0==i || ('.'!=s[i-1] && !isdigit(s[i-1]))))//可以考虑去了"i<a-1"
b=i;
else break;
if(-1==b){
False(s);
return -1;
}
CString s2=s.Mid(b,a-b);
False1(s2);
double d=strtod(s2,&stop);
if(a<s.GetLength()-1 && ('-'==s[a+1] || '+'==s[a+1]))//后
if(a==s.GetLength()-2 || !(isdigit(s[a+2]) || s[a+2]==46)){
False(s);
return -1;
}
else x=a+1;
for(i=x+1;i<s.GetLength();i++)
if(isdigit(s[i]) || s[i]==46) f=i;
else
if('e'==s[i]) f=++i;
else break;
if(-1==f){
False(s);
return -1;
}
s2=s.Mid(a+1,f-a);
False1(s2);
double c=strtod(s2,&stop);
double g=pow(d,c);
gcvt(g,16,e);
s.Replace(s.Mid(b,f-b+1),e);
count3(s);
return -1;
}
int CMyDlg::count2(CString & s)
{
int a=s.Find("*"),z=s.Find("/");
if(-1==a && -1==z)
return -1;
if(-1==a || -1==z)
a=max(a,z);
else a=min(a,z);
int b=-1,f=-1;int x=a;
for(int i=a-1;i>=0;i--)//前
if(isdigit(s[i]) || s[i]==46) b=i;
else
if(('+'==s[i] || '-'==s[i]) && i>0 && 'e'==s[i-1])
b=--i;
else
if(i<a-1 && ('+'==s[i] || '-'==s[i]) && (0==i || ('.'!=s[i-1] && !isdigit(s[i-1]))))//可以考虑去了"i<a-1"
b=i;
else break;
if(-1==b){
False(s);
return -1;
}
CString s2=s.Mid(b,a-b);
False1(s2);
double d=strtod(s2,&stop);//str.Format
if(a<s.GetLength()-1 && ('-'==s[a+1] || '+'==s[a+1]))//后
if(a==s.GetLength()-2 || !(isdigit(s[a+2]) || s[a+2]==46)){
False(s);
return -1;
}
else x=a+1;
for(i=x+1;i<s.GetLength();i++)
if(isdigit(s[i]) || s[i]==46) f=i;
else
if('e'==s[i]) f=++i;
else break;
if(-1==f){
False(s);
return -1;
}
s2=s.Mid(a+1,f-a);
False1(s2);
double c=strtod(s2,&stop);
double g;
if('*'==s[a])
g=d*c;
else{
if(0==c){
False(s);
return -1;
}
g=d/c;
}
gcvt(g,16,e);
s.Replace(s.Mid(b,f-b+1),e);
count2(s);
return -1;
}
int CMyDlg::count1(CString & s,int y)
{
int a=s.Find("+",y),z=s.Find("-",y);
if(-1==a && -1==z)
return -1;
if(-1==a || -1==z)
a=max(a,z);
else a=min(a,z);
if(a>0 && 'e'==s[a-1]){
count1(s,a+1);
return 0;
}
CString s2;
double d;int b=-1,f=-1;int x=a;
if(0==a)//可以在这里增加正负的运算级
d=0;
else{
for(int i=a-1;i>=0;i--)//前
if(isdigit(s[i]) || s[i]==46) b=i;
else
if(('+'==s[i] || '-'==s[i]) && i>0 && 'e'==s[i-1])
b=--i;
else
if(i<a-1 && ('+'==s[i] || '-'==s[i]) && (0==i || ('.'!=s[i-1] && !isdigit(s[i-1]))))//可以考虑去了"i<a-1"
b=i;
else break;
if(-1==b){
False(s);
return -1;
}
s2=s.Mid(b,a-b);
False1(s2);
d=strtod(s2,&stop);//str.Format
}
if(a<s.GetLength()-1 && ('-'==s[a+1] || '+'==s[a+1]))
if(a==s.GetLength()-2 || !(isdigit(s[a+2]) || s[a+2]==46)){
False(s);
return -1;
}
else x=a+1;
for(int i=x+1;i<s.GetLength();i++)
if(isdigit(s[i]) || s[i]==46) f=i;
else
if('e'==s[i]) f=++i;
else break;
if(-1==f){
False(s);
return -1;
}
s2=s.Mid(a+1,f-a);
False1(s2);
double c=strtod(s2,&stop);
double g;
if('+'==s[a])
g=d+c;
else g=d-c;
gcvt(g,16,e);
s.Replace(s.Mid(b,f-b+1),e);
count1(s,1);
return -1;
}
void CMyDlg::OnButton21() //-------------------------进制转换-------------------------------
{
Two(2);
}
void CMyDlg::OnButton22()
{
Two(8);
}
void CMyDlg::OnButton23()
{
Two(10);
}
void CMyDlg::OnButton24()
{
Two(16);
}
void CMyDlg::Two(int a)
{
char f[80];
if(-1==str.Find('=')){
CString s=str;
brack(s);
sum=strtod(s,&stop);
}
_itoa(sum,f,a);
str+="\r\n=";
str+=f;
UpdateData(false);
}
void CMyDlg::OnRadio1() //------------------弧度---------------------------
{
three=1;
}
void CMyDlg::OnRadio2()
{
three=0;
}
void CMyDlg::OnButton36() //--------------------------------储存M--------------------------------------
{
char f[80];
if(-1==str.Find('=')){
CString s=str;
brack(s);
sum=strtod(s,&stop);
}
double suM=sum+strtod(M,&stop);;
gcvt(suM,16,f);
M=f;
UpdateData(false);
}
void CMyDlg::OnButton37()
{
char f[80];
if(-1==str.Find('=')){
CString s=str;
brack(s);
sum=strtod(s,&stop);
}
double suM=strtod(M,&stop)-sum;
gcvt(suM,16,f);
M=f;
UpdateData(false);
}
void CMyDlg::OnButton38()
{
M="";
UpdateData(false);
}
void CMyDlg::OnButton39()
{
str+=M;
UpdateData(false);
}
void CMyDlg::OnButton40()
{
char f[80];
if(-1==str.Find('=')){
CString s=str;
brack(s);
sum=strtod(s,&stop);
}
double suM=strtod(M,&stop)*sum;
gcvt(suM,16,f);
M=f;
UpdateData(false);
}
void CMyDlg::OnButton41()
{
char f[80];
if(-1==str.Find('=')){
CString s=str;
brack(s);
sum=strtod(s,&stop);
}
double suM=strtod(M,&stop)/sum;
gcvt(suM,16,f);
M=f;
UpdateData(false);
}
void CMyDlg::False(CString &s)
{
MessageBox("错误\n对不起你的输入错误","错误");
s="";
test=1;
}
void CMyDlg::OnButton34()
{
char f[80];
if(-1==str.Find('='))
{
CString s=str;
brack(s);
}
sum=fabs(sum);
gcvt(sum,16,f);
str+="\r\n=";
str+=f;
UpdateData(false);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -