⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scdlg.cpp

📁 一个用C++编写的科学计算器程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        number1=m_number=(double)((exp(number1)+exp(-number1))/2);
		if(bInv==TRUE&&bHyp==TRUE) 
        number1=m_number=(double)(log(number1+sqrt(pow(number1,2)-1)));
        UpdateData(FALSE);
		break;
    case IDC_NUMBER_Sin:
		if(bInv==TRUE&&bHyp==FALSE&&bRadian==TRUE) 
		number1=m_number=(double)asin(number1);
        if(bInv==TRUE&&bHyp==FALSE&&bAngle==TRUE) 
		number1=m_number=(double)asin(number1*(PI/180));
	    if(bInv==FALSE&&bHyp==FALSE&&bRadian==TRUE) 
		number1=m_number=(double)sin(number1);
        if(bInv==FALSE&&bHyp==FALSE&&bAngle==TRUE) 
		number1=m_number=(double)sin(number1*(PI/180));
        if(bInv==FALSE&&bHyp==TRUE)
        number1=m_number=(double)((exp(number1)-exp(-number1))/2);
        if(bInv==TRUE&&bHyp==TRUE) 
        number1=m_number=(double)(log(number1+sqrt(pow(number1,2)+1)));
        UpdateData(FALSE);
		break;
    case IDC_NUMBER_Lg ://lg
        if(bInv==TRUE) 
        number1=m_number=(double)pow(number1,10);
		else number1=m_number=(double)log10(number1);
		UpdateData(FALSE);
        if(m_switch==2)
        number1=m_number=DateSwitch((int)m_number,10,2);
        if(m_switch==1)
        number1=m_number=DateSwitch((int)m_number,10,8);
		break;
    case IDC_NUMBER_Ln: //ln
        if(bInv==TRUE) 
         number1=m_number=(double)exp(number1);	
		else number1=m_number=(double)log(number1);
		if(m_switch==2)
        number1=m_number=DateSwitch((int)m_number,10,2);
        if(m_switch==1)
        number1=m_number=DateSwitch((int)m_number,10,8);
		UpdateData(FALSE);
		break;
    case IDC_NUMBER_Log://log
		cal();//如果连续运算
		OperationState=11;
		m_number=0;
		NumberState=2;
	    UpdateData(FALSE);
    case IDC_NUMBER_MC:
	    mem_number=0;
		m_Mem=' ';
	    UpdateData(FALSE);
		break;    
    case IDC_NUMBER_MR:
	    m_number=mem_number;
		UpdateData(FALSE);
		break;    
    case IDC_NUMBER_MS://将显示的数字保存
	    mem_number=m_number;
	    if(mem_number!=0) m_Mem='M';
		UpdateData(FALSE);
        break;    
    case IDC_NUMBER_M_Add:
	    mem_number+=m_number;
		UpdateData(FALSE);
		break; 
    case IDC_NUMBER_Derivative:
        m_number=number1=(double)1/number1;
        if(m_switch==2)
        number1=m_number=DateSwitch((int)m_number,10,2);
        if(m_switch==1)
        number1=m_number=DateSwitch((int)m_number,10,8);
		UpdateData(FALSE);
		break;
	case IDC_NUMBER_Mod://取模
		cal();//如果连续运算
		OperationState=6;
		m_number=0;
		NumberState=2;
		break;
    case IDC_NUMBER_Or://按位或
		cal();//如果连续运算
		OperationState=7;
		m_number=0;
		NumberState=2;
		break;
    case IDC_NUMBER_Lsh: //移位
	     cal();//如果连续运算
		OperationState=8;
		m_number=0;
		NumberState=2;
		break;
    case IDC_NUMBER_And://按位与
		cal();//如果连续运算
		OperationState=9;
		m_number=0;
		NumberState=2;
		break;
    case IDC_NUMBER_Xor://按位异或
		cal();//如果连续运算
		OperationState=10;
		m_number=0;
		NumberState=2;
		break;
    case IDC_NUMBER_Not: //按位取反
		m_number=number1=~((int)number1);
        if(m_switch==2)
        number1=m_number=DateSwitch((int)m_number,10,2);
        if(m_switch==1)
        number1=m_number=DateSwitch((int)m_number,10,8);
		UpdateData(FALSE);
		break;    
	case IDC_NUMBER_Int :
        if(bInv==TRUE)
        m_number=number1=m_number-(int)m_number;//取小数部分
		else m_number=number1=(int)m_number;//取整
        if(m_switch==2)
        number1=m_number=DateSwitch((int)m_number,10,2);
        if(m_switch==1)
        number1=m_number=DateSwitch((int)m_number,10,8);
		UpdateData(FALSE);
		break;
    case IDC_NUMBER_Point://小数点
		if(m_number!=(int)m_number) 
		{m_decimal=0;m_number=0;}//响应原有的小数
	    else m_decimal=0;
        bPoint=TRUE;
        UpdateData(FALSE);
        break;
	case IDC_Angle://角度
		 bAngle=TRUE;
		 bRadian=FALSE;
          m_unit=0;
         UpdateData(FALSE);
         break;
	case IDC_Radian://弧度
		 bRadian=TRUE;
		 bAngle=FALSE;
		 m_unit=1;
		 UpdateData(FALSE);
          break;
    case IDC_Inv://切换至取反
		  if(bInv==FALSE)bInv=TRUE;
		  else bInv=FALSE;
          UpdateData(FALSE);
          break;
	case IDC_Hyp://切换至双曲函数
          if(bHyp==FALSE)bHyp=TRUE;
		  else bHyp=FALSE;
          UpdateData(FALSE);
          break;
    case IDC_NUMBER_Equal:
         cal();
         break;
	}
  
}
void CSCDlg::cal()
{   
	switch(OperationState)
	{
	 case 1:m_number=(double)number1/number2;
		   NumberState=1;
		   if(m_switch==2)
           m_number=DateSwitch((int)m_number,10,2);
           if(m_switch==1)
           m_number=DateSwitch((int)m_number,10,8);
		   UpdateData(FALSE);
           break;
    case 2:m_number=number1*number2;
		   NumberState=1;
		   if(m_switch==2)
           m_number=DateSwitch((int)m_number,10,2);
           if(m_switch==1)
           m_number=DateSwitch((int)m_number,10,8);
		   UpdateData(FALSE);
		   break;
    case 3:m_number=number1+number2;
		   if(m_switch==2)
           m_number=DateSwitch((int)m_number,10,2);
           if(m_switch==1)
           m_number=DateSwitch((int)m_number,10,8);
		   NumberState=1;
		   UpdateData(FALSE);
		   break;
    case 4:m_number=number1-number2;
		   NumberState=1;
		   if(m_switch==2)
           m_number=DateSwitch((int)m_number,10,2);
           if(m_switch==1)
           m_number=DateSwitch((int)m_number,10,8);
		   UpdateData(FALSE);
		   break;
    case 5: 
		   if(bInv==TRUE)
	       m_number=pow(number1,(double)(1/number2));
		   else m_number=pow(number1,number2);
		   NumberState=1;
           if(m_switch==2)
           m_number=DateSwitch((int)m_number,10,2);
           if(m_switch==1)
           m_number=DateSwitch((int)m_number,10,8);
		   UpdateData(FALSE);
		   break;
    case 6:m_number=(int)number1%(int)number2;
		   NumberState=1;
		   if(m_switch==2)
           m_number=DateSwitch((int)m_number,10,2);
           if(m_switch==1)
           m_number=DateSwitch((int)m_number,10,8);
		   UpdateData(FALSE);
		   break;
	case 7:m_number=(int)number1|(int)number2;
		   NumberState=1;
		    if(m_switch==2)
           m_number=DateSwitch((int)m_number,10,2);
           if(m_switch==1)
           m_number=DateSwitch((int)m_number,10,8);
		   UpdateData(FALSE);
		   break;
	case 8:
           if(bInv==TRUE)
           m_number=(int)number1>>(int)number2;
		   else m_number=(int)number1<<(int)number2;
		   NumberState=1;
		    if(m_switch==2)
           m_number=DateSwitch((int)m_number,10,2);
           if(m_switch==1)
           m_number=DateSwitch((int)m_number,10,8);
		   UpdateData(FALSE);
		   break;
	case 9:m_number=(int)number1&(int)number2;
		   NumberState=1;
		    if(m_switch==2)
           m_number=DateSwitch((int)m_number,10,2);
           if(m_switch==1)
           m_number=DateSwitch((int)m_number,10,8);
		   UpdateData(FALSE);
		   break;
	case 10:m_number=(int)number1^(int)number2;
		   NumberState=1;
		    if(m_switch==2)
           m_number=DateSwitch((int)m_number,10,2);
           if(m_switch==1)
           m_number=DateSwitch((int)m_number,10,8);
		   UpdateData(FALSE);
		   break;
	case 11:
           if(bInv==TRUE) m_number=pow(number1,number2);
		   else m_number=(double)log10(number1)/(double)log10(number2);
		   NumberState=1;
		    if(m_switch==2)
           m_number=DateSwitch((int)m_number,10,2);
           if(m_switch==1)
           m_number=DateSwitch((int)m_number,10,8);
		   UpdateData(FALSE);
		   break;
	}
    if(m_switch==0) 
	number1=m_number;//准备下次运算
    OperationState=0;
}
int CSCDlg::factorial(int n)//阶乘函数
{
   int f;
   if(n<0) f=0;
   else if(n==0)f=1;else f=n*factorial(n-1);
   return f;
}
int CSCDlg::DateSwitch(int number, int old_unit, int new_unit)
{
    int power_i=0,t=0,sum=0;
	 while(number!=0)
	  {
		 t=(int)number%new_unit;
		 number=(int)(number/new_unit);
		 sum+=(int)(t*pow(old_unit,power_i));
	     power_i++;	
	  }
	return sum;
}

void CSCDlg::OnBin() 
{  
	// TODO: Add your control notification handler code here
   if(m_switch==1)
   {m_number=DateSwitch((int)m_number,8,10);
   m_number=DateSwitch((int)m_number,10,2);}
   if(m_switch==0) m_number=DateSwitch((int)m_number,10,2);
   CWnd *pWndButton;
   pWndButton=GetDlgItem(IDC_NUMBER9);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_NUMBER8);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_NUMBER7);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_NUMBER6);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_NUMBER5);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_NUMBER4);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_NUMBER3);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_NUMBER2);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_NUMBER_pi);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_NUMBER_Point);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_NUMBER_Tan);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_NUMBER_Cos);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_NUMBER_Sin);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_Angle);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_Radian);
   pWndButton->EnableWindow(FALSE);
   m_switch=2;//使二进制选中
   UpdateData(FALSE);
}
void CSCDlg::OnOctal() 
{
	// TODO: Add your control notification handler code here
   if(m_switch==2)
   {m_number=DateSwitch((int)m_number,2,10);
   m_number=DateSwitch((int)m_number,10,8);}
   if(m_switch==0) m_number=DateSwitch((int)m_number,10,8);
   CWnd *pWndButton;
   pWndButton=GetDlgItem(IDC_NUMBER9);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_NUMBER8);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_NUMBER7);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_NUMBER6);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_NUMBER5);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_NUMBER4);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_NUMBER3);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_NUMBER2);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_NUMBER_pi );
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_NUMBER_Point);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_NUMBER_Tan);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_NUMBER_Cos);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_NUMBER_Sin);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_Angle);
   pWndButton->EnableWindow(FALSE);
   pWndButton=GetDlgItem(IDC_Radian);
   pWndButton->EnableWindow(FALSE);
   m_switch=1;//使八进制选中
   UpdateData(FALSE);
}

void CSCDlg::OnDecimal() 
{
	// TODO: Add your control notification handler code here
   if(m_switch==1) m_number=DateSwitch((int)m_number,8,10);
   if(m_switch==2) m_number=DateSwitch((int)m_number,2,10);
   CWnd *pWndButton;
   pWndButton=GetDlgItem(IDC_NUMBER9);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_NUMBER8);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_NUMBER7);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_NUMBER6);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_NUMBER5);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_NUMBER4);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_NUMBER3);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_NUMBER2);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_NUMBER_pi );
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_NUMBER_Point);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_NUMBER_Tan);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_NUMBER_Cos);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_NUMBER_Sin);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_Angle);
   pWndButton->EnableWindow(TRUE);
   pWndButton=GetDlgItem(IDC_Radian);
   pWndButton->EnableWindow(TRUE);
   m_switch=0;//使十进制选中
   UpdateData(FALSE);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -