题目:

某光学仪器厂生产一种系列透镜,这种透镜系列包括凸透镜、凹透镜及平面透镜。该厂检验科采用的检验方法是:通过该透镜的体积、密度,算出质量,再用天平称量透镜的实际质量,根据质量差评估该透镜是否合格。因此需要设计一个小软件工具,来计算透镜质量。

可测量的数据包括:镜柱的高H、镜柱的半径R、凸透球缺或凹透球缺的球半径r以及透镜的密度ρ,而球却的底面半径等于镜柱的半径。

spacer.gif

212723881.jpg

void CCheckLensDlg::OnBUTTON1Count()
{
    // TODO: Add your control notification handler code here
                      
                      
    char c_BallRadius[255], c_CylinderRadius[255], c_CylinderHeight[255], c_LensDensity[255], c_Result[255];
    double BallRadius=0, CylinderRadius=0, CylinderHeight=0, LensDensity=0,Result=0;
    double BallRadius1=0, CylinderRadius1=0, CylinderHeight1=0, LensDensity1=0,Result1=0;
                      
    m_BallRadius.GetWindowText(c_BallRadius,10)/10;
    m_CylinderRadius.GetWindowText(c_CylinderRadius,10)/10;
    m_CylinderHeight.GetWindowText(c_CylinderHeight,10)/10;
    m_LensDensity.GetWindowText(c_LensDensity,10);
    BallRadius = atof((LPCTSTR)c_BallRadius);
    CylinderRadius = atof((LPCTSTR)c_CylinderRadius);
    CylinderHeight = atof((LPCTSTR)c_CylinderHeight);
    LensDensity = atof((LPCTSTR)c_LensDensity);
                      
    const double PI=3.14;
                      
    //计算球冠的高度
    double BallHeight = 0;
    BallHeight = BallRadius - sqrt(BallRadius * BallRadius - CylinderRadius * CylinderRadius);
    //计算圆柱的质量
    double CylinderMassTemp = 0;
    CylinderMassTemp = PI * CylinderRadius * CylinderRadius * CylinderHeight * LensDensity;
    //计算球冠的质量
     double BallMassTemp = 0;
     BallMassTemp = PI / 3 * (3*BallRadius - BallHeight) * BallHeight * BallHeight * LensDensity;
     switch(m_Control)
     {
     case 0:
         if(BallRadius !=0 )
         {
             if(MessageBox("数据不合法,球冠半径r应为0,请重新输入!","消息提示",MB_ICONWARNING|MB_OK)==IDOK)
                 OnBUTTON2Clean();
         }
         else
             Result = CylinderMassTemp;
         break;
                           
     case 1:
                           
         if(BallRadius < CylinderRadius)
         {
             if(MessageBox("球冠半径r < R圆柱体半径,请重新输入!","消息提示",MB_ICONWARNING|MB_OK)==IDOK)
                 OnBUTTON2Clean();
         }
         else
             Result = CylinderMassTemp + BallMassTemp;
         break;
                           
     case 2:
                           
         if(BallRadius < CylinderRadius)
         {
             if(MessageBox("球冠半径r < R圆柱体半径,请重新输入!","消息提示",MB_ICONWARNING|MB_OK)==IDOK)
                 OnBUTTON2Clean();
         }
         else
             Result = CylinderMassTemp - BallMassTemp;
         break;
                           
     case 3:
                           
         if(BallRadius < CylinderRadius)
         {
             if(MessageBox("球冠半径r < R圆柱体半径,请重新输入!","消息提示",MB_ICONWARNING|MB_OK)==IDOK)
                 OnBUTTON2Clean();
         }
         else
             Result = CylinderMassTemp + 2*BallMassTemp;
                           
         break;
                           
     case 4:
                           
         if(BallRadius < CylinderRadius)
         {
             if(MessageBox("球冠半径r < R圆柱体半径,请重新输入!","消息提示",MB_ICONWARNING|MB_OK)==IDOK)
                 OnBUTTON2Clean();
         }
         else
             Result = CylinderMassTemp - 2*BallMassTemp;
                           
         break;
                           
     case 5:
                           
         if(BallRadius < CylinderRadius)
         {
             if(MessageBox("球冠半径r < R圆柱体半径,请重新输入!","消息提示",MB_ICONWARNING|MB_OK)==IDOK)
                 OnBUTTON2Clean();
         }
         else
             Result = CylinderMassTemp;
                           
         break;
     }
    _gcvt(Result,20,c_Result);
    m_Result=(LPCTSTR)c_Result;
    UpdateData(FALSE);
                      
}