计算器dlg.cpp
来自「加减乘除计算,正余弦,倒数,阶乘计算,进制转换等」· C++ 代码 · 共 1,574 行 · 第 1/3 页
CPP
1,574 行
shizhuanqita(n4, 16);
UpdateData(FALSE);
OperatorPressed=true;
k=16; i=0;
m_RadioHex.SetCheck(1);
m_NumA.EnableWindow(TRUE);
m_NumB.EnableWindow(TRUE);
m_NumC.EnableWindow(TRUE);
m_NumD.EnableWindow(TRUE);
m_NumE.EnableWindow(TRUE);
m_NumF.EnableWindow(TRUE);
m_Num2.EnableWindow(TRUE);
m_Num3.EnableWindow(TRUE);
m_Num4.EnableWindow(TRUE);
m_Num5.EnableWindow(TRUE);
m_Num6.EnableWindow(TRUE);
m_Num7.EnableWindow(TRUE);
m_Num8.EnableWindow(TRUE);
m_Num9.EnableWindow(TRUE);
m_RadioDegree.EnableWindow(FALSE);
m_OprDaoshu.EnableWindow(FALSE);
m_OprDot.EnableWindow(FALSE);
m_RadioRadian.EnableWindow(FALSE);
m_OprSin.EnableWindow(FALSE);
m_OprCos.EnableWindow(FALSE);
m_OprCot.EnableWindow(FALSE);
m_OprAcot.EnableWindow(FALSE);
m_OprTan.EnableWindow(FALSE);
m_OprAsin.EnableWindow(FALSE);
m_OprAcos.EnableWindow(FALSE);
m_OprAtan.EnableWindow(FALSE);
m_OprPi.EnableWindow(FALSE);
}
void CMyDlg::OnOctal() //八进制
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
strcpy (str1,m_strResult);
n4=qitazhuanshi(str1, k);
shizhuanqita(n4, 8);
UpdateData(FALSE);
OperatorPressed=true;
k=8; i=0;
m_RadioOctal.SetCheck(1);
m_Num2.EnableWindow(TRUE);
m_Num3.EnableWindow(TRUE);
m_Num4.EnableWindow(TRUE);
m_Num5.EnableWindow(TRUE);
m_Num6.EnableWindow(TRUE);
m_Num7.EnableWindow(TRUE);
m_OprDot.EnableWindow(FALSE);
m_OprDaoshu.EnableWindow(FALSE);
m_Num8.EnableWindow(FALSE);
m_Num9.EnableWindow(FALSE);
m_OprSin.EnableWindow(FALSE);
m_OprCos.EnableWindow(FALSE);
m_OprCot.EnableWindow(FALSE);
m_OprAcot.EnableWindow(FALSE);
m_OprTan.EnableWindow(FALSE);
m_OprAsin.EnableWindow(FALSE);
m_OprAcos.EnableWindow(FALSE);
m_OprAtan.EnableWindow(FALSE);
m_OprPi.EnableWindow(FALSE);
m_NumA.EnableWindow(FALSE);
m_NumB.EnableWindow(FALSE);
m_NumC.EnableWindow(FALSE);
m_NumD.EnableWindow(FALSE);
m_NumE.EnableWindow(FALSE);
m_NumF.EnableWindow(FALSE);
m_RadioDegree.EnableWindow(FALSE);
m_RadioRadian.EnableWindow(FALSE);
}
void CMyDlg::OnBinary() //二进制
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
strcpy (str1,m_strResult);
n4=qitazhuanshi(str1, k);
shizhuanqita(n4, 2);
UpdateData(FALSE);
OperatorPressed=true;
k=2; i=0;
m_RadioBinary.SetCheck(1);
m_Num2.EnableWindow(FALSE);
m_Num3.EnableWindow(FALSE);
m_Num4.EnableWindow(FALSE);
m_Num5.EnableWindow(FALSE);
m_Num6.EnableWindow(FALSE);
m_Num7.EnableWindow(FALSE);
m_Num8.EnableWindow(FALSE);
m_Num9.EnableWindow(FALSE);
m_OprDot.EnableWindow(FALSE);
m_OprSin.EnableWindow(FALSE);
m_OprCos.EnableWindow(FALSE);
m_OprDaoshu.EnableWindow(FALSE);
m_OprCot.EnableWindow(FALSE);
m_OprAcot.EnableWindow(FALSE);
m_OprTan.EnableWindow(FALSE);
m_OprAsin.EnableWindow(FALSE);
m_OprAcos.EnableWindow(FALSE);
m_OprAtan.EnableWindow(FALSE);
m_OprPi.EnableWindow(FALSE);
m_NumA.EnableWindow(FALSE);
m_NumB.EnableWindow(FALSE);
m_NumC.EnableWindow(FALSE);
m_NumD.EnableWindow(FALSE);
m_NumE.EnableWindow(FALSE);
m_NumF.EnableWindow(FALSE);
m_RadioDegree.EnableWindow(FALSE);
m_RadioRadian.EnableWindow(FALSE);
}
void CMyDlg::OnDegree() //弧度
{
// TODO: Add your control notification handler code here
j=1;
}
void CMyDlg::OnRadian() //角度
{
// TODO: Add your control notification handler code here
j=2;
}
void CMyDlg::Error(int n) //出错处理
{ char *err[]={ "多个小数点",
"除数不能为零",
"被开方数不能负数",
"对数的真数不能小于等于零",
"求模的分母不能为零",
"正切的角度不能为90度、270度等等",
"余切的角度不能为0度、180度、360度等等",
"反正弦的输入范围为(-1,1)",
"反余弦的输入范围为(-1,1)",
"阶乘要大于等于零且为整数",
"被开方数不能为负数",
"没有输入操作数",
"不能连续按多下等号键"
};
m_strResult.Format("出错了: %s",err[n]);
i=0;h=0;
m_shi="";s=NULL;
UpdateData(FALSE);
OperatorPressed=true;
}
void CMyDlg::OnAsin()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(h==0)
{ Error(11);return;}
m_shi="ASIN";
m_shi+=m_strResult;
n1=atof(m_strResult);
if(n1>1||n1<-1)
{ Error(7);OperatorPressed=true;i=0;return;}
if(j!=1)
{
n1=asin(n1)*180/pi;
m_strResult.Format("%f",n1);
}
else
m_strResult.Format("%f",asin(n1));
m_strResult.TrimRight('0');
m_strResult.TrimRight('.');
m_shi+='=';
m_shi+=m_strResult;
if(t<16)
{strcpy(str3[t].str2,m_shi);t++;}
else
{t=1;strcpy(str3[t].str2,m_shi);t++;}
m_shi="";
i=0;
UpdateData(FALSE);
OperatorPressed=true;
}
void CMyDlg::OnAcos()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(h==0)
{ Error(11);return;}
m_shi="ACOS";
m_shi+=m_strResult;
n1=atof(m_strResult);
if(n1>1||n1<-1)
{ Error(8);OperatorPressed=true;i=0;return;}
if(j!=1)
{
n1=acos(n1)*180/pi;
m_strResult.Format("%f",n1);
}
else
m_strResult.Format("%f",cos(n1));
m_strResult.TrimRight('0');
m_strResult.TrimRight('.');
m_shi+='=';
m_shi+=m_strResult;
if(t<16)
{strcpy(str3[t].str2,m_shi);t++;}
else
{t=1;strcpy(str3[t].str2,m_shi);t++;}
m_shi="";
i=0;
UpdateData(FALSE);
OperatorPressed=true;
}
void CMyDlg::OnAtan()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(h==0)
{ Error(11);return;}
m_shi="ATAN";
m_shi+=m_strResult;
n1=atof(m_strResult);
if(j!=1)
{
n1=atan(n1)*180/pi;
m_strResult.Format("%f",n1);
}
else
m_strResult.Format("%f",atan(n1));
m_strResult.TrimRight('0');
m_strResult.TrimRight('.');
m_shi+='=';
m_shi+=m_strResult;
if(t<16)
{strcpy(str3[t].str2,m_shi);t++;}
else
{t=1;strcpy(str3[t].str2,m_shi);t++;}
m_shi="";
i=0;
UpdateData(FALSE);
OperatorPressed=true;
}
void CMyDlg::OnAcot()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(h==0)
{ Error(11);return;}
m_shi="ACOT";
m_shi+=m_strResult;
n1=atof(m_strResult);
if(j!=1)
{
n1=(pi/2-atan(n1))*180/pi;
m_strResult.Format("%f",n1);
}
else
m_strResult.Format("%f",pi/2-atan(n1));
m_strResult.TrimRight('0');
m_strResult.TrimRight('.');
m_shi+='=';
m_shi+=m_strResult;
if(t<16)
{strcpy(str3[t].str2,m_shi);t++;}
else
{t=1;strcpy(str3[t].str2,m_shi);t++;}
m_shi="";
i=0;
UpdateData(FALSE);
OperatorPressed=true;
}
void CMyDlg::OnExp()//e的x次方
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(h==0)
{ Error(11);return;}
m_shi="E^";
m_shi+=m_strResult;
if(k==2||k==8||k==16)
{
strcpy (str1,m_strResult);
n1=qitazhuanshi(str1, k);
}
else
n1=atof(m_strResult);
if(k==2||k==8||k==16)
shizhuanqita(exp(n1), k);
else
m_strResult.Format("%f",exp(n1));
m_strResult.TrimRight('0');
m_strResult.TrimRight('.');
m_shi+='=';
m_shi+=m_strResult;
if(t<16)
{strcpy(str3[t].str2,m_shi);t++;}
else
{t=1;strcpy(str3[t].str2,m_shi);t++;}
m_shi="";
i=0;
UpdateData(FALSE);
OperatorPressed=true;
}
void CMyDlg::OnDaoshu() //x的倒数
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(h==0)
{ Error(11);return;}
m_shi="1/";
m_shi+=m_strResult;
n1=atof(m_strResult);
if(n1==0)
{Error(1);return;}
else
m_strResult.Format("%f",1/n1);
m_strResult.TrimRight('0');
m_strResult.TrimRight('.');
m_shi+='=';
m_shi+=m_strResult;
if(t<16)
{strcpy(str3[t].str2,m_shi);t++;}
else
{t=1;strcpy(str3[t].str2,m_shi);t++;}
m_shi="";
i=0;
UpdateData(FALSE);
OperatorPressed=true;
}
void CMyDlg::OnJiecehg() //n的阶乘
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(h==0)
{ Error(11);return;}
m_shi=m_strResult;
m_shi+="!";
if(k==2||k==8||k==16)
{
strcpy (str1,m_strResult);
n1=qitazhuanshi(str1, k);
}
else
n1=atof(m_strResult);
int b;
double sum=n1;
if(n1<0||fmod(n1,floor(n1))!=0)
{Error(9);return;}
else
if(n1==0)
{
n1=1;
m_strResult.Format("%.0f",n1);
}
else
{for(b=1;n1>1;n1--)
sum*=(n1-1);
if(k==2||k==8||k==16)
shizhuanqita(sum, k);
else
m_strResult.Format("%.0f",sum);
}
m_shi+='=';
m_shi+=m_strResult;
if(t<16)
{strcpy(str3[t].str2,m_shi);t++;}
else
{t=1;strcpy(str3[t].str2,m_shi);t++;}
m_shi="";
i=0;
UpdateData(FALSE);
OperatorPressed=true;
}
void CMyDlg::OnPi() //派
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_strResult.Format("%.10f",pi);
h=1;
OperatorPressed=true;
UpdateData(FALSE);
}
void CMyDlg::OnSqr() //开平方
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(h==0)
{ Error(11);return;}
m_shi=m_strResult;
m_shi+="Sqrt";
if(k==2||k==8||k==16)
{
strcpy (str1,m_strResult);
n1=qitazhuanshi(str1, k);
}
else
n1=atof(m_strResult);
if(n1<0)
{Error(10);return;}
else
if(k==2||k==8||k==16)
shizhuanqita(sqrt(n1), k);
else
m_strResult.Format("%.10f",sqrt(n1));
m_strResult.TrimRight('0');
m_strResult.TrimRight('.');
m_shi+='=';
m_shi+=m_strResult;
if(t<16)
{strcpy(str3[t].str2,m_shi);t++;}
else
{t=1;strcpy(str3[t].str2,m_shi);t++;}
m_shi="";
i=0;
h=1;
UpdateData(FALSE);
OperatorPressed=true;
}
double CMyDlg::qitazhuanshi(char str[], int m1)//转化为十进制
{double sum=0.0;
int n,m=0;
int i;
double n6;
if(m1==10)
{
n6=atof(m_strResult);
m_strResult.Format("%.0f",n6);
strcpy (str,m_strResult);
}
n=strlen (str)-1;
if(m_strResult.GetAt(0)=='-') m=1;
if(m==0)
{for(i=0;n>=0;n--,i++)
{if(str[i]>='A' &&str[i]<='F')
sum+=(str[i]-'A'+10)*pow(m1,n);
else
sum+=(str[i]-'0')*pow(m1,n);
}
}
else
{for(i=1;n>=1;n--,i++)
{if(str[i]>='A' &&str[i]<='F')
sum+=(str[i]-'A'+10)*pow(m1,n-1);
else
sum+=(str[i]-'0')*pow(m1,n-1);
}
}
if(m==0)
return sum;
else
return 0-sum;
}
void CMyDlg::shizhuanqita(double p, int m2)//十进制转为其他
{ char ch[30];
int m=0;
if(p<0) {m=1;p=0-p;}
if (m2==2||m2==8||m2==16)
{
_itoa((int)p,ch,m2);m_strResult=ch;
if(m==1) m_strResult="-"+m_strResult;
}
else
{
m_strResult.Format("%.0f",p);
if(m==1) m_strResult="-"+m_strResult;
}
}
void CMyDlg::OnXianshi() //显示历史记录
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
int e,b,b2;
m_lishi="";
for(e=1;e<16&&strlen(str3[e].str2)!=0;e++)
{
b2=strlen(str3[e].str2);
m_lishi+=str3[e].str2;
if(b2<=17)
for(b=1;b<=(17-b2);b++)
m_lishi+=" ";
else
if(b2<=34)
for(b=1;b<=(34-b2);b++)
m_lishi+=" ";
else
for(b=1;b<=(51-b2);b++)
m_lishi+=" ";
}
UpdateData(FALSE);
}
void CMyDlg::OnBuxianshi() //不显示历史记录
{
// TODO: Add your control notification handler code here
m_lishi="";
UpdateData(FALSE);
}
void CMyDlg::OnQingchu() //清除历史记录
{
// TODO: Add your control notification handler code here
int a;
m_lishi="";
char str7[50]="";
for(a=1;a<16;a++)
{
strcpy(str3[a].str2,str7);
}
t=1;
UpdateData(FALSE);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?