捌玖网络工作室's Archiver

zw2004 发表于 2008-1-21 20:17

一个计算四则表达式的模板

在9月8日那天我特意编写的,给大家分享的,
@t y"IMgQJIe 一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
6Jg'L gc]%c 只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
.]wD.I W ?J qxd3b 参数解释:hg6m0u%r![T
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
B5an[T7Q nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
1Ke0C-F suk/|e X 返回值:` t-\#T)|&iy#Q!P'y2p6V
返回非0表示计算成功,0表示计算失败有错误Qp%O YVr0_JZZ

u e6UI7U"c#{v)k${
d!L2eId9f;x(m
f tM8}I`;UE(N 程序代码: 3Dlea$}+@#doi

+At@/D$Mu namespace fy_Exp{
$|C9{5}-ed namespace {template <class _T>
kYKDyx;k?} inline _T GetExpValue(_T t[], char& csym){
g MB8Em     char c=csym; csym=0;
L/G-s _Mp$T#F:F\I     switch(c){
0|6Q$X5UY     case '+':return t[0] += t[1];G@u$B`/mP
    case '-':return t[0] -= t[1];1\f;_s5K{+i*I
    case '*':return t[0] *= t[1];
X-sG Y&Z4V     default: return t[0] /= t[1];//case '/'::p(~%rz0t bB3\.b
    }n o_*\[)^4a*Z
}}h$}2f$y"zc2}!P&o@4_
template <class _T, class _Tstream>d%D*y#@r,GlH8]
/* _Tstream: inputstream, _T: get return valuezIxs/o#m [k
* Return nonzero if get value successfully */r e a\!k&L#XM
int GetExpValue(_Tstream& istrin, _T& nReturn){
T7s C8i Qt     _T t[3] = {0}; //雨中飞燕之作` P~Hfv;K
    char csym[3] = "++";
Q7OP:[1Yejy4fB     int nLevel = 1, nERR = 0;
#F5U`/J0^$KQ     if(!(istrin>>t[1]))istrin.clear();
0a"]h-Pq     for(;;){cBEY1q#M,U9E
        if(istrin>>csym[2]){xD|.AO T;_m/@r_
            switch(csym[2]){Y)v*L$e:d/r&s|
            case '(':
!o s-HJy#xa:e                 if(!csym[1]){nLevel=0x100; nERR=1;}else
[bZ!flPP\                 if(!GetExpValue(istrin, t[2]))nLevel|=0x10;Z titU6E;m
                else{nLevel=0x100; nERR=1;}
'tl|RS                 break;
5~5b o,A;U)oD}@2{             case ')':
8c,E6k"a$ouTT                 {nLevel = 0x100;}break;C&};B Gx0]j?;dw
            case '+':case '-':case '*':case '/':
e/}q4eA                 {csym[nLevel++] = csym[2];}break;3nZhTM,Qkv4o*`G
            case ' ':case '\r':case '\n':case '\t':continue;9T+I yv!M4B$_0{
            default:&b(rQ'S pvL
                {nLevel=0x100; nERR=1;}
;z0Z8I2IG             }rjF?B:~/}X ?p)},l
            if(nLevel==0x100)break;u"k'f.Q^,o%P4f'z+Q
            if(nLevel&0x10 || istrin>>t[2]){T g^~4}(v ?2O:]
                nLevel &= 0xF;
(c xQ(h#xD M                 if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}!dp5e*WD(q n*G%[
                if(csym[1]=='*'||csym[1]=='/'){
NOS7Y:Y4W&r                     GetExpValue(t+1, csym[1]);"}Q8nI+^j2KWfU
                }
ch'S w!P s'a5[e                 else{3Gm `R:h(c:w
                    GetExpValue(t, csym[0]);T:W(Jw'xV!^4O
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
[ Qq:?o7t$A!L]8B5p                 }
S'n l*]#|N                 nLevel = 1;
)r$EQx ] |elr             }
:J\ w;@{             else istrin.clear();4ca_@2u[3cf
        }:N9G/n Za%l!a
        else{nERR = -1; break;}Zd0JTGH+]
    }
,Q mjw A!Z     if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);jy/P&y'X;|7YM
    else nReturn=GetExpValue(t, csym[0]);
%Yv'F/uOQw[     return nERR==-1?1:0;B$xQ"N7e*\5|+mz4N&Y
}}
.[D8KxW'}"u
+v)d-~f|O.v W S"i"rJ [ J@/K2z]
wt*K-z)t?
函数模板使用示例:
8_/g.{2Q`8V4PM*O 在以上那段代码的后面加上以下代码:
Z`{.f'f(me f I
t JW A/b+B { 4a.QT y5y:a%?w N

:V}@l:O#rp:hj 程序代码: _4s`Q3t
}2^m(U+u,c ^
#include<strstream>
.Q E6YWcS@7_ #include<iostream>
(M,A-G\rK5ewA #include<string>\4Zs y\Y
using namespace std;
z d@jB [ int main(void)
,@2w}4w'[TbD {
\5O*{]2N5~z)kt2Qb     string s1;)SdRfx M5v)h2d
    while(cin>>s1)
JG.@!A7|     {
L7Wn(XW's1`Y%e{         istrstream isin(s1.data());
*C D*_A(fI'@r         double d;
a`VS1J         if(fy_Exp::GetExpValue(isin, d))
gC5s(Kek)vz6{         {
r;bNZ1O [-iBi             cout<<d<<endl;TD |Z'_r1w3`}o
        }vs-z-P4Qi
        else
0O6X W9x*b;~&wP0f         {
2r"tn\/R%P)xdpo9x             cout<<"ERROR"<<endl;
TS5W$IT^         } jzI v1h{o
    }6? k\!j-Au)m_"m'Fx
    return 0;2El%^-dC
}uwTC}6y
,V*b+@ x4D6?t
gdg"eM~(j#fE
然后编译执行就可以了(*^_^*)\2HVqNT
其它:TC++上一定编译错误,不保证在VC6上也能通过编译,sy2y%jYgz
      建议使用VC7或VC更高版本,或者使用GNU C++编译

页: [1]
【捌玖网络】已经运行:


Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.