当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:56:00  来源:本站整理

<b>用于计算四则混合运算表达式的递归函数第二版</b>[VC/C++编程]

赞助商链接



  本文“<b>用于计算四则混合运算表达式的递归函数第二版</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
#include<math.h>
#pragmawarn-8060//屏蔽编译时的 Possibly incorrect assignment 告诫
AnsiString__fastcallCalc(StringsExp)
{
   //计算不带变量的四则混合运算表达式(支持取整int和圆整round函数,支持负操作数)
   //正数不准带正号
   intposL,pos,posR,posM;//pos->当前考虑的运算符的位置
   //posL->当前考虑的运算符之前近来的运算符的位置
   //posR->当前考虑的运算符之后近来的运算符的位置
   //posM->圆整函数中逗号的位置
   StringsTmp,sL,sR;
   //sL->当前考虑的运算符的左操作数字符串,sR->当前考虑的运算符的右操作数字符串
   boolIsMinus;//IsMinus->当前*/序列的标记
   sExp=sExp.LowerCase();
   if(sExp.AnsiPos("error"))
     return(sExp);
   while(pos=sExp.AnsiPos(""))
     sExp=sExp.Delete(pos,1);//去除表达式中的空格
   if(sExp.IsEmpty())
     return("0");
   while((pos=sExp.AnsiPos("["))>0||(pos=sExp.AnsiPos("{"))>0)//统一左括号为(
     sExp=sExp.SubString(1,pos-1)+"("
         +sExp.SubString(pos+1,sExp.Length());
   while((pos=sExp.AnsiPos("]"))>0||(pos=sExp.AnsiPos("}"))>0)//统一右括号为)
     sExp=sExp.SubString(1,pos-1)+")"
         +sExp.SubString(pos+1,sExp.Length());
   //以下处理round圆整函数
   while(pos=sExp.AnsiPos("round("))
   {
     posL=pos+5;
     while(posM=sExp.SubString(posL+1,sExp.Length()).AnsiPos("round("))
       posL=posL+posM+5;//最后一个round之后的位置
     for(posM=posL+2;!sExp.IsDelimiter(",",posM)
         &&posM<=sExp.Length();posM++);//round后第一个,的位置
       if(posM==0)return("error:round没有配对的逗号,公式错!");
     for(posR=posM+2;!sExp.IsDelimiter(")",posR)
         &&posR<=sExp.Length();posR++);//逗号后第一个)的位置
       //posR不从posM+1而从posM+2开始搜索,是为了应对操作数为负的情形
       sExp=sExp.SubString(1,posL-6)
           +floor(Calc(sExp.SubString(posL+1,
           posM-posL-1)).ToDouble()*pow(10,
           sExp.SubString(posM+1,posR-posM-1).ToDouble())
// 本文转自 C++Builder 研究 - http://www.ccrun.com/article.asp?i=636&d=x5fncl
           +0.5)/pow(10,sExp.SubString(posM+1,
           posR-posM-1).ToDouble())
           +sExp.SubString(posR+1,sExp.Length());
   }
   //处理括号:递归计算括号中的表达式,最后消去括号
   while(posL=sExp.LastDelimiter("("))//最里层(
   {
     sTmp=sExp.SubString(posL+1,sExp.Length());
     posR=sTmp.AnsiPos(")");//最里层)
     if(posR==0)
       return("error:没有配对的),公式错!");
     sExp=sExp.SubString(1,posL-1)
         +Calc(sTmp.SubString(1,posR-1))
         +sTmp.SubString(posR+1,sTmp.Length());
   }
   //以下处理int取整函数
   while(pos=sExp.AnsiPos("int"))
   {
     posL=pos+2;
     for(posR=posL+2;!sExp.IsDelimiter("+-*/",posR)
         &&posR<=sExp.Length();posR++);//后来第一个+-*/
       //posR不从posL+1而从posL+2开始搜索,是为了应对操作数为负的情形
       sExp=sExp.SubString(1,pos-1)
           +floor(sExp.SubString(posL+1,posR-posL-1).ToDouble())
           +sExp.SubString(posR,sExp.Length());
   }
   //以下处理不带括号表达式中的*/序列
   IsMinus=false;//IsMinus->当前*/序列的标记
   while(sExp.LastDelimiter("*/"))//存在*或/
   {
     for(pos=1;!sExp.IsDelimiter("*/",pos)
         &&pos<=sExp.Length();pos++);//第一个*或/
       if(pos==1||pos==sExp.Length())
         return("error:首或尾字符是*/运算符,公式错!");
     //posL->第一个*/之前的第一个+-
     posL=sExp.SubString(1,pos-1).LastDelimiter("+-");
Minus0:
     for(posR=pos+1;!sExp.IsDelimiter("+-*/",posR)
         &&posR<=sExp.Length();posR++);
       //posR->第一个*/之后的第一个+-*/运算符
       if(posR==(pos+1)&&sExp.IsDelimiter("*/",posR))
         return("error:*/运算符相邻,公式错!");
       if(posR==sExp.Length())
         return("error:尾字符是+ -*/运算符,公式错!");
       if(sExp.SubString(pos,2)=="*-"
           ||sExp.SubString(pos,2)=="/-")//乘数或除数为负
       {
         sExp.Delete(pos+1,1);
         IsMinus=!IsMinus;
         gotoMinus0;
       }
       sL=sExp.SubString(posL+1,pos-posL-1);
       sR=sExp.SubString(pos+1,posR-pos-1);
       if(sExp.IsDelimiter("/",pos)&&sR=="0")
         return("error:除数为零,无意义!");
       sExp=(posL==0?String(""):
           sExp.SubString(1,posL))+(sExp.IsDelimiter("*",pos)?
           (sL.ToDouble()*sR.ToDouble()):
           (sL.ToDouble()/sR.ToDouble()))
           +sExp.SubString(posR,sExp.Length());
   }
   if(IsMinus)
     sExp=String("-")+sExp;
   //经过上面的系列处理,sExp中的运算标记只剩下+和-了
   //以下处理不带括号表达式中的+-序列
   IsMinus=false;//加数或减数的标记
   while(sExp.LastDelimiter("+-"))//存在+或-
   {
     for(pos=2;!sExp.IsDelimiter("+-",pos)
         &&pos<=sExp.Length();pos++);//第一个+或-
     //pos不从1而从2开始搜索,是为了应对首操作数为负的情形
     if(pos==sExp.Length())
       return("error:尾字符是+-运算符,公式错!");
     if(pos>sExp.Length())
       return(sExp);//sExp是一个简单的负数,没必要计算
Minus1:
     for(posR=pos+1;!sExp.IsDelimiter("+-",posR)
         &&posR<=sExp.Length();posR++);
       if(posR==sExp.Length())
         return("error:尾字符是+-运算符,公式错!");
     if(sExp.SubString(pos,2)=="+-"
         ||sExp.SubString(pos,2)=="--")//加数或减数为负
     {
       sExp.Delete(pos+1,1);
       IsMinus=!IsMinus;
       gotoMinus1;
     }
     //此处跳转在正常情形下最多只会履行一次
     sL=sExp.SubString(1,pos-1);
     sR=sExp.SubString(pos+1,posR-pos-1);
     sExp=String(sExp.IsDelimiter("+",pos)?
         (sL.ToDouble()+sR.ToDouble()*(IsMinus?-1:1)):
         (sL.ToDouble()-sR.ToDouble()*(IsMinus?-1:1)))
         +sExp.SubString(posR,sExp.Length());
   }
   return(sExp);
}

  以上是“<b>用于计算四则混合运算表达式的递归函数第二版</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .