计算器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 + -
显示快捷键?