void CCCalculatorDlg::OnNum(UINT uID)
{  
UINT  index=uID- IDC_NUM_0;
CString  num;
CString  str;
num.Format(_T("%d"),index);
//AfxMessageBox(num);//弹出对话框提醒
switch(st)
{
case _CE:
str=num;
m_ctlDisplay.SetWindowText(str);
st=_A;
break;
case _A:
m_ctlDisplay.GetWindowText(str);
str+=num;
m_ctlDisplay.SetWindowText(str);
break;
   case _B:
   str=num;
   m_ctlDisplay.SetWindowText(str);
   st=_C;
   break;
   case _C:
   m_ctlDisplay.GetWindowText(str);
   str+=num;
   m_ctlDisplay.SetWindowText(str);
   break;
   case _D:
   str=num;
   m_ctlDisplay.SetWindowText(str);
   st=_A;
   break;
   
   default:;
   
   
}
}
double CCCalculatorDlg::GetCurrentNum()
{  double num=0;
CString str;
m_ctlDisplay.GetWindowText(str);
num=atof(str);
return num;
}//获得当前显示的数字void CCCalculatorDlg::DisplayNum(double d)
{
CString str;
    str.Format(_T("%f"),d);
    m_ctlDisplay.SetWindowText(str);}//显示数字
void CCCalculatorDlg:: Clear()
{ op=None;
st=_CE;
m_dCurrentNum=m_dPreNum=0;
}
void CCCalculatorDlg::OnOperator(_operator_ _op)
{         
switch(st){
case _A:
op=_op;
m_dPreNum=GetCurrentNum();
st=_B;
break;
case _C:
m_dCurrentNum=GetCurrentNum();
m_dPreNum=GetValue(m_dPreNum,m_dCurrentNum);
DisplayNum(m_dPreNum);
op=_op;
st=_B;
break;
case _D:
st=_B;
m_dPreNum=GetCurrentNum();
op=_op;
break;
default:;


}
}
double CCCalculatorDlg::GetValue(double m,double n)
{   double dr=0;
    double br=m;
    double cr=1/m;//求第一个操作数的倒数用来求x^y
     int i;
switch(op)
{  
case Add:
dr=m+n;
break;
case Multi:
dr=m*n;
break;
case Minus:
   dr=m-n;
   break;
case Div:
if(n==0.0)

AfxMessageBox(_T("分母不能为0!"));
OnCe();
}
else
{
dr=m/n;
}
break;
case Mod:
dr=(int)m%(int)n;//这里简单起见,转换为整数求余数
break;
case Exp:
if(n>=0)//n为正数
for(i=0;i<n;i++)
{
br=br*10;//乘以10的n次幂
}
else//n为负数
{   n=-n;
for(i=0;i<n;i++)
{
br=br*0.1;//乘以0.1的n次幂
}
}
dr=br;
break;
case SQUAR:
if(n>=0)
for (i=0;i<n-1;i++)
{   
br=br*m;
}
else
{   br=1/br;
n=-n;
for(i=0;i<n-1;i++)
{
br=br*cr;//乘以0.1的n次幂
}


} dr=br;
break;
default:;
}
return dr; }

解决方案 »

  1.   

    还真长,表达能力不行,也不知解释得了不
    这是个计算器喽,那就是为了控制连续操作的
    st 是里面控制的关键
    m_ctlDisplay 是那个显示输入和结果的控件
    m_dPreNum 是两个操作数的前面一个
    op 是操作的方式,加减乘除等……
    m_dCurrentNum 是第二个操作数例如 12+34+56void CCCalculatorDlg::OnNum(UINT uID) // 这个肯定是按了 数字键 的时候处理
    {   
    UINT index=uID- IDC_NUM_0;            // 把数字键 的 Ascii 转换成整数?
    CString num;
    CString str;
    num.Format(_T("%d"),index);           // 把数字弄成字符用来显示
    //AfxMessageBox(num);//弹出对话框提醒
    switch(st)
    {
    case _CE:                             // st 是 _CE 就是最初始的状态
    str=num;                              // 这个时候要将用户输入的第一个数字显示出来
    m_ctlDisplay.SetWindowText(str);      // 状态要变成 _A 这是用来接受用户的其他数字显示
    st=_A;                                // 这里就是 1
    break;
    case _A:                              // st 从 _CE 变成 _A,这里再处理数字时就把显示
    m_ctlDisplay.GetWindowText(str);      // 的数字取出来,再加上用户输入数字
    str+=num;                             // 一起显示到输入上
    m_ctlDisplay.SetWindowText(str);      // 这里就是 12 了,状态不再转换,直到用户输入 +-= 等
    break;                                 
    case _B:                              // 用户开始输入第二个数字了 前面记录了 12+
    str=num;                              // 这就是 3 了
    m_ctlDisplay.SetWindowText(str);      // 状态转换为 _C 是因为这里要把原有的 12 清除
    st=_C;
    break;
    case _C:                              // 再输入数字就是第二个数了,这里是 34
    m_ctlDisplay.GetWindowText(str);      // 一直输入,直到用户输入了 +-=等
    str+=num;
    m_ctlDisplay.SetWindowText(str);
    break;
    case _D:
    str=num;
    m_ctlDisplay.SetWindowText(str);
    st=_A;
    break;
      
    default:;
      
      
    }
    }
    double CCCalculatorDlg::GetCurrentNum()  // 费半天劲将当前显示的数字再转换成浮点数
    { double num=0;
    CString str;
    m_ctlDisplay.GetWindowText(str);
    num=atof(str);
    return num;
    }//获得当前显示的数字void CCCalculatorDlg::DisplayNum(double d)  //  显示一个指定的数字,也就是结果?
    {
    CString str;
      str.Format(_T("%f"),d);
      m_ctlDisplay.SetWindowText(str);}//显示数字
    void CCCalculatorDlg:: Clear()
    { op=None;
    st=_CE;
    m_dCurrentNum=m_dPreNum=0;
    }
    void CCCalculatorDlg::OnOperator(_operator_ _op)  // 这是处理 +-= 等操作的
    {   
    switch(st){
    case _A:                                          // st 是 _A 说明刚才一直处理
    op=_op;                                           // 第一个数来着,现在第一个数
    m_dPreNum=GetCurrentNum();                        // 输入结束了,保存下来,并记录操作
    st=_B;                                            // 用户输入了 +
    break;
    case _C:                                          // 用户输入+ 了,结束第二个数的输入
    m_dCurrentNum=GetCurrentNum();                    // 把这次显示的数取出来
    m_dPreNum=GetValue(m_dPreNum,m_dCurrentNum);      // 跟之前存的数用 op 做运算
    DisplayNum(m_dPreNum);                            // 显示出来 12+34 46+
    op=_op;                                           // 并且结果就是下一次运算的 pre 了
    st=_B;                                            // 记录 op 并且回到 _B 等待用户输入
    break;
    case _D:
    st=_B;
    m_dPreNum=GetCurrentNum();
    op=_op;
    break;
    default:;
    }
    }
    double CCCalculatorDlg::GetValue(double m,double n)  // 各种 op 运算得到结果
    { double dr=0;
      double br=m;
      double cr=1/m;//求第一个操作数的倒数用来求x^y
      int i;
    switch(op)
    {   
    case Add:
    dr=m+n;
    break;
    case Multi:
    dr=m*n;
    break;
    case Minus:
    dr=m-n;
    break;
    case Div:
    if(n==0.0)
    {  
    AfxMessageBox(_T("分母不能为0!"));
    OnCe();
    }
    else
    {
    dr=m/n;
    }
    break;
    case Mod:
    dr=(int)m%(int)n;//这里简单起见,转换为整数求余数
    break;
    case Exp:
    if(n>=0)//n为正数
    for(i=0;i<n;i++)
    {
    br=br*10;//乘以10的n次幂
    }
    else//n为负数
    { n=-n;
    for(i=0;i<n;i++)
    {
    br=br*0.1;//乘以0.1的n次幂
    }
    }
    dr=br;
    break;
    case SQUAR:
    if(n>=0)
    for (i=0;i<n-1;i++)
    {   
    br=br*m;
    }
    else
    { br=1/br;
    n=-n;
    for(i=0;i<n-1;i++)
    {
    br=br*cr;//乘以0.1的n次幂
    }
    }dr=br;
    break;
    default:;
    }
    return dr; }
     
    只能解释这么多了……好累