捌玖网络工作室's Archiver

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

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

在9月8日那天我特意编写的,给大家分享的,[4[5h is%v{.v
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式x/Eg b5drhe:X~@
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
&Ea \oaQ$zd 参数解释:F/Dj[*DG?F3Q
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
t7cd-uR ai}W| nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5f%Fr)M7oG:t
返回值:
#GC)Cq,Q4P~*Y 返回非0表示计算成功,0表示计算失败有错误h%h#Dj;tx

e ScUp/u+hF!z7X4u
*R.b,TE"YN4l
Gz,Fw;T-x)Ow 程序代码:
@_:I VQBp5u %hNTY9j @
namespace fy_Exp{di Kk&Z
namespace {template <class _T>D YO0pS]-m;dO
inline _T GetExpValue(_T t[], char& csym){d-npmb0h7HlJy0E
    char c=csym; csym=0;
K-nZVx3qh'a8iS*lO1s     switch(c){
k ^ Xf-j0Z6DF     case '+':return t[0] += t[1];
)s x@p&J:r%b4Wf+~     case '-':return t[0] -= t[1];
${`l y x/T8{V,M3i     case '*':return t[0] *= t[1];
.Ls0wo%v1O j&F8_     default: return t[0] /= t[1];//case '/':*yV$}.M;V1|p C{H
    }
Qo,?_h*M1L }}(cq:b:h&_.jgd
template <class _T, class _Tstream>
o5^a,O9zQ7fY6D+c#]y /* _Tstream: inputstream, _T: get return value
tbE;TsAOTc * Return nonzero if get value successfully */
W"M|@'I/U int GetExpValue(_Tstream& istrin, _T& nReturn){
bH.u7S3^)x4m     _T t[3] = {0}; //雨中飞燕之作9DK%Vt^0Wu~2u
    char csym[3] = "++";
6yUxI$q     int nLevel = 1, nERR = 0;
,E-ONG/@O     if(!(istrin>>t[1]))istrin.clear();
yH ^'So L     for(;;){Lw0cC&] ?s2~a
        if(istrin>>csym[2]){XW*[q(L P2s
            switch(csym[2]){y^d(p%b'w(].zhV
            case '(':
'B^/[!W`4Y x4C*Ux                 if(!csym[1]){nLevel=0x100; nERR=1;}else
"tN%B+[F ?                 if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
;b-k4lor Z R                 else{nLevel=0x100; nERR=1;}
9i#|[1y!bU1R                 break;
w/C%{9Ay Y             case ')':xx2qC@$NW
                {nLevel = 0x100;}break;
jrq.e ?             case '+':case '-':case '*':case '/':
&K*o3viOd a                 {csym[nLevel++] = csym[2];}break;
czW,`)R:`CL             case ' ':case '\r':case '\n':case '\t':continue;N4E2xQ-Rt"?(l
            default:
Mk { z&tn"e;f H                 {nLevel=0x100; nERR=1;}U5C.f;E}"U
            }
2w J0TZ#Tfh*U"y {             if(nLevel==0x100)break;u'A7H%v}U;p7y3r
            if(nLevel&0x10 || istrin>>t[2]){+hVAbME
                nLevel &= 0xF;
fA] \9}_ f qY$}                 if(nLevel==1){t[1]=t[2];csym[1]=0;continue;} G SP th5a0An'W:[ L
                if(csym[1]=='*'||csym[1]=='/'){
O@Iu_]q                     GetExpValue(t+1, csym[1]);
Bn,@3zb                 } z0xsqlnW%?5z
                else{
+EH{"{7o9H I                     GetExpValue(t, csym[0]); C/I?0v~E7V |
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
se[Bt3}                 }
r:Do8R$|5iAG                 nLevel = 1;
VWXN/w             }$C/}}.EKL {p~
            else istrin.clear();
5HTj#aW         }y1g,CC.dMiQF&D/H'I
        else{nERR = -1; break;}
W0B#@+x/{     }
h}I6U;M     if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);WTiqN hBY
    else nReturn=GetExpValue(t, csym[0]);&I Ame{;Y1d X N(XW}
    return nERR==-1?1:0;&G;X-w-JS6BhM
}}unG;xJgm2v

.Y'C.XT|Ec yq3GYD e?6sS

F0L0E6XP"a yI^ 函数模板使用示例:
6oP`S1Ni 在以上那段代码的后面加上以下代码:7{P,yt&Kel4PDa4O5D8k

1y$\%h6Xe+edWlqM .H~ytY&U3~*K'Y;g&Gp

Sh#[DX x&ltK 程序代码:
A+o&f!~@ gF,i
L y[6Cc:u/y/y #include<strstream> @S;zT+SIk'S#v
#include<iostream>A@]~ v/g
#include<string>
Y,Rg] xA!Q EY using namespace std;Lp@L \R
int main(void)7MmV7D4YZ%\6I
{
*|%a&Rir!`-t     string s1;b'oS Tm
    while(cin>>s1)#j6tq0g`? hk
    {
qbe W&Gg {)`         istrstream isin(s1.data());V w\0^aP!V
        double d;{[;Bg2pWbGd
        if(fy_Exp::GetExpValue(isin, d))R1e-}3A,y){n |
        {
,f^)VM.LG,ri             cout<<d<<endl;
+G\ceet         }o`0O ^p
        else
Nh w)MR         { ^{jrGP
            cout<<"ERROR"<<endl;O+T({(?"F[i-P
        }
,J)bP_g&h V$j&A     }
'oQ]e-O Es     return 0;:D tYD&i
}
&Wh%P |cjL9I Ai*{}wC"s

Ekz$O2gD 然后编译执行就可以了(*^_^*)S~#|/RkT#o
其它:TC++上一定编译错误,不保证在VC6上也能通过编译6UZ)E7J2I {u"M"l
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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


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