WEB开发网
开发学院软件开发VC 后缀表达式求值及校验 阅读

后缀表达式求值及校验

 2007-03-15 21:54:48 来源:WEB开发网   
核心提示: void CB05031126Dlg::OnCalculate(){// TODO: Add your control notification handler code hereUpdateData(TRUE);m_expression.TrimLeft();m_expression.T
void CB05031126Dlg::OnCalculate()
{
  // TODO: Add your control notification handler code here
  UpdateData(TRUE);
  m_expression.TrimLeft();
  m_expression.TrimRight();
  m_expression=trimblank(m_expression);
  CStack s;
  int i=0;
  int j,k;
  int ntemp;//临时操作数
  int ntemp1;//临时操作数
  int ntemp2;//临时操作数
  int result;//运算结果
  //int opNum=getop(m_expression);
  if(check(m_expression)==1)//检验非法字符
  {
    while((i<m_expression.GetLength())&&(s.getflag()!=0))
    {
      if((m_expression[i]==''+'')||
        (m_expression[i]==''-'')||
        (m_expression[i]==''*'')||
        (m_expression[i]==''/''))
      {
        if(m_expression[i]==''+'')//完成加法运算
        {
          ntemp1=s.Top();
          s.Pop();
          ntemp2=s.Top();
          s.Pop();
          ntemp=ntemp1+ntemp2;
          s.Push(ntemp);
        }
        
        if(m_expression[i]==''-'')//完成减法运算
        {
          ntemp1=s.Top();
          s.Pop();
          ntemp2=s.Top();  
          s.Pop();
          ntemp=ntemp2-ntemp1;
          s.Push(ntemp);
        }
        
        if(m_expression[i]==''*'')//完成乘法运算
        {
          ntemp1=s.Top();
          s.Pop();
          ntemp2=s.Top();
          s.Pop();
          ntemp=ntemp1*ntemp2;
          s.Push(ntemp);
        }
        
        if(m_expression[i]==''/'')//完成除法运算
        {
          ntemp1=s.Top();  
          s.Pop();
          ntemp2=s.Top();
          s.Pop();
          if(ntemp1!=0)
          {
            ntemp=ntemp2/ntemp1;
            s.Push(ntemp);
          }
          else
          {
            s.setflag(0);
          }
        }
        
        k=k+2;
      }
      else
      {
        ntemp=m_expression[i]-48;
        k=i+1;
        while((k<m_expression.GetLength())&&
              (m_expression[k]!='' '')&&
              (m_expression[k]!=''+'')&&
              (m_expression[k]!=''-'')&&
              (m_expression[k]!=''*'')&&
              (m_expression[k]!=''/''))
        {
          k++;
        }
        for(j=i+1;j<k;j++)
          //讲表达式中的数字字符转换为整型
          ntemp=ntemp*10+(m_expression[j]-''0'');
        s.Push(ntemp);
      }
      
      i=k+1;
    }
    
    if((s.getflag()!=0)&&(s.getcount()-getop(m_expression)==1)&&(s.getsum()==1))
    {
      result=s.Top();
      m_result.Format("%d",result);
      UpdateData(FALSE);
    }
    else
    {
      MessageBox("表达式错误!请重新输入!");
    }
  }
  else
  {
    MessageBox("表达式错误!请重新输入!");
  }
}
附言:

本程序为南京邮电大学软件工程专业程序设计实验,我在做的时候附加实现了对表达式的校验,理论上应该可以检测出任何错误的表达式。

上一页  1 2 3 

Tags:后缀 表达式 校验

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接